Java

연산자(Operator) - 논리 연산자 & 그 외의 연산자

제주니어 2022. 8. 18. 22:00

논리 연산자

1. 논리 연산자 &&, ∥, !

  • && (AND결합) : 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.
true && true -> true
true && false -> false
false && true -> false
false && false -> false

 

  • || (OR결합) : 피연산자 중 어느 한쪽만 true이면 true를 결과로 얻는다.
true || true -> true
true || false -> true
false || true -> true
false || false -> false

1) 주의할점

  • x는 10보다 크고, 20보다 작다 → (10 < x) && (x < 20)
  • x는 2의 배수 또는 3의 배수이다 → ((x % 2) == 0) || ((x % 3) == 0)
  • x는 2의 배수 또는 3의 배수지만 6의 배수는 아니다 → (((x % 2) == 0) || ((x % 3) == 0)) && x % 6 ! = 0 : && 가 || 보다 우선순위가 높다.
  • 문자 ch는 숫자(’0’ ~ ‘9’)이다.
  • 문자 ch는 대문자 또는 소문자이다.

2) 논리 부정 연산자 !

  • x = true → !x = false
  • x = false → !x = true
  • 주로 조건문과 반복문의 조건식에 많이 쓰인다.
public class E_Logical {
	
	// 사용자가 입력한 정수값이 1 ~ 100 사이의 값인지 확인하기
	public void method1() {
		int num = 0;
		boolean result;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("임의의 정수를 입력해주세요 > ");
		num = scanner.nextInt(); // 변수 생각 못하고 진행하는 경우 -> alt + shift + L
		
		// 1 < = num <= 100
//		result = 1 <= num <= 100; // 두 개를 동시에 넣을 수 없다. 
		result = (1 <= num) && (num <= 100);
		
		System.out.println("사용자가 입력한 값이 1 이상 100 이하의 값인가요? " + result);
		scanner.close();
	}
	
	// 사용자가 입력한 값이 y 또는 Y 인지 확인하기
	public void method2() {
		char ch = '\u0000';
		String line = null;
		boolean result = false;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("계속 진행하시려면 y 혹은 Y를 입력하세요. >");
		line = scanner.nextLine();
//		System.out.println(line.length()); // 글자의 길이 확인
		
		// 조건문 ()안에 조건식이 true일 때 중괄호 블록({})이 실행된다. 
		if(line.length() > 0) {
			ch = line.charAt(0);
			result = (ch == 'y') || (ch == 'Y');
		}
		
		System.out.println("사용자가 입력한 값이 y 또는 Y 입니까? : " + result);
		
		scanner.close();
	}
	
	// Short Cut 연산 테스트
	public void method3() {
		int num = 10;
		boolean result = false;
		
		System.out.println("&& 연산 전의 num의 값: " + num);
		
		// && 연산자를 기준으로 앞에서 이미 false가 나왔기 때문에 굳이 뒤쪽의 연산을 수행하지 않는다. 
		result = (num < 5) && (++num > 0);
		
		System.out.println("result : " + result);
		System.out.println("&& 연산 후의 num의 값: " + num);
		System.out.println();
		
		// || 연산자를 기준으로 앞에서 이미 true가 나왔기 때문에 굳이 뒤쪽의 연산을 수행하지 않는다. 
		System.out.println("|| 연산 전의 num의 값: " + num);
		
		result = (num > 20) || (++num > 0);
		
		System.out.println("result : " + result);
		System.out.println("|| 연산 후의 num의 값: " + num);
		System.out.println();
	}
}

2. 비트 연산자 &, |, ^, ~, <<, >>

  • | (OR연산자) : 피연산자 중 한쪽의 값이 1이면, 1을 결과로 얻는다. 그 외에는 0을 얻는다.
  • & (AND연산자) : 피연산자 양 쪽이 모두 1이어야만 1을 결과로 얻는다. 그 외에는 0을 얻는다.
  • ^ (XOR연산자) : 피연산자의 값이 서로 다를 때만 1을 결과로 얻는다. 같을 때는 0을 얻는다.

그 외의 연산자

1. 조건 연산자 ? :

  • 조건 연산자는 조건식, 식1, 식2 모두 세 개의 피연산자를 필요로 하는 삼항 연산자이며, 삼항 연산자는 조건 연산자 하나뿐이다.

2. 대입 연산자 =, op=

  • 대입 연산자를 변수와 같은 저장공간에 값 또는 수식의 연산결과를 저장하는데 사용된다.
  • 이 연산자는 오른쪽 피연산자의 값을 왼쪽 피연산자에 저장하며, 저장된 값을 연산결과로 반환한다.
  • 대입 연산자는 연산자들 중에서 가장 낮은 우선순위를 가지고 있기 때문에 식에서 제일 나중에 수행된다.
  • 조건식 ? 식1 : 식2 (삼항 연산자)
    • 첫 번째 피연산자인 조건식의 평가결과에 따라 다른 결과를 반환.
    • 조건식의 평가결과가 true이면 식1이, false이면 식2이 연산결과가 된다.
    • 조건 연산자의 결합규칙은 오른쪽에서 왼쪽이다.
    • 조건 연산자의 식1과 식2의 타입이 다른 경우, 이상 연산자처럼 산술 변환이 발생한다.
// x = 5, y = 3
result = (x > y) ? x : y ;
-> result = (5 > 3) ? 5 : 3 ;
-> result = (true) ? 5: 3; // 조건식이 true(참) 이므로 연산결과는 5
-> result = 5;

 

public void method1() {
		int num = 0;
		String result = "";
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("정수값 입력 > ");
		num = scanner.nextInt();
		
		result = (num > 0) ? "양수이다." : (num == 0) ? "0 입니다," : "음수이다.";
		
		
		System.out.printf("%d 는(은) %s", num, result);
		
		
		scanner.close();
	}

 

	/*
	 * 실습 문제 1
	 * 
	 * 사용자한테 두 개의 정수값을 입력받아서
	 * 두 정수의 곱셈 결과 100보다 큰 경우 "결과가 100 이상입니다." 아닌 경우 "결과가 100 보다 작습니다." 출력
	 */
	
	
	public void practice1() {
		int num1 = 0;
		int num2 = 0;
		String result = null;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("첫 번째 정수를 입력하시오 >");
		num1 = scanner.nextInt();
		
		System.out.print("두 번째 정수를 입력하시오 >");
		num2 = scanner.nextInt();
		
		result = (num1 * num2 >= 100) ? "결과가 100 이상입니다." : "결과가 100 보다 작습니다.";
				
		System.out.printf("%d 는(은) %s\n", (num1 * num2), result);
		
		scanner.close();
	}
	
	
	/*
	 * 실습 문제 2
	 * 
	 * 사용자한테 문자를 하나 입력 받아서
	 * 입력한 문자가 대문자이면 "대문자이다." 아닌 경우 "알파벳 대문자가 아니다." 출력
	 */
	
	public void practice2() {
		char ch = '\u0000';
		String result = null;
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("영문자를 입력하시오 > ");
		ch = scanner.nextLine().charAt(0);
		
		result = (ch >= 'A') && (ch <='Z') ? "알파벳 대문자이다." : "알파벳 대문자가 아니다.";
		
		System.out.printf("%c 는(은) %s\n", ch, result);
		
		scanner.close();
		
	}
	
	/*
	 * 실습 문제 3
	 * 두 정수를 입력받고 + 또는 -를 입력받아서 계산을 출력하라
	 * 단, + 또는 - 외의 문자를 입력하는 경우 "잘못 입력했습니다." 출력
	 * 
	 * 예시)
	 * 	첫 번째 수 > 3
	 * 	두 번째 수 > 4
	 * 	연산자 입력 (+ 또는 -) > + 
	 * 
	 * 	3 + 4 = 7
	 */
	
	public void practice3() {
		int num1 = 0;
		int num2 = 0;
		char op = '\u0000';
		String result = null;
		
		Scanner scanner = new Scanner(System.in);
		
		System.out.print("첫 번째 수 > ");
		num1 = scanner.nextInt();
		
		System.out.print("두 번째 수 > ");
		num2 = scanner.nextInt();
		
		scanner.nextLine(); // 버퍼 한번 비우는거 잊지말자 !!!
		
		System.out.print("연산자 입력(+ 또는 -) > ");
		op = scanner.nextLine().charAt(0);
		
		// 정수값과 빈 문자열("")을 + 연산하여 문자열로 변경한다.
		// String.valueOf() 메소드는 기본 자료형의 값들을 문자열로 변경한다.
		result = (op == '+') ? String.valueOf(num1 + num2) : (op == '-') ? String.valueOf(num1 - num2) : "잘못 입력했습니다.";
//		result = (op == '+') ? (num1 + num2) + "" : (op == '-') ? (num1 - num2) + "" : "잘못 입력했습니다.";

		System.out.println();
		System.out.printf("%d %c %d = %s", num1, op, num2, result);
		scanner.close();
	}

1) lvalue와 rvale

  • 대입 연산자의 왼쪽을 ‘lvalue(left value)’이라 하고 , 오른쪽 피연산자를 ‘rvalue(right value)’라고 한다.
  • rvalue는 변수뿐만 아니라 식이나 상수 등이 모두 가능하다
  • lvalue는 반드시 변수처럼 값을 변경할 수 있는 것이어야 한다. 리터럴이나 상수같이 값을 저장할 수 없는 것들은 될 수 없다.

2) 복합 대입 연산자

  • 대입 연산자는 다른 연산자(op)와 결합하여 ‘op=’와 같은 방식으로 사용될 수 있다.
  • 복합 대입 연산
    • 다른 연산자와 대입 연산자를 함께 사용하는 연산자이다.
    • 내부적으로 연산 처리 속도가 빠르므로 사용을 권장한다.
    • 증감 연산자 (++, --)와 비슷해 보이지만 증감 연산자는 1씩 증감이 되고 복합 대입 연산자는 내가 원하는 숫자만큼 값을 증감 시킬 수 있다. 
public class F_Compound {
	/*
	 *   ex) 
	 *    a += 3; -> a = a + 3;
	 *    a -= 3; -> a = a - 3;
	 *    a *= 3; -> a = a * 3;
	 *    a /= 3; -> a = a / 3; // 몫 연산
	 *    a %= 3; -> a = a % 3; // 나머지 연산
	 */
	
	public void method1() {
		int num = 12;
		String str = "Hello";
		
		num += 3; // num = num + 3
		System.out.println("num += 3 는(은) " + num);
		
		num -=5; // num = num - 5;
		System.out.println("num -= 5 는(은) " + num);
		
		num *=6; // num = num * 6;
		System.out.println("num *= 6 는(은) " + num);
		
		num /=3; // num = num / 3;
		System.out.println("num /= 3 는(은) " + num);
		
		num %=4; // num = num % 4;
		System.out.println("num %= 4 는(은) " + num);
		
		str +="World"; // str = str + "World";
		System.out.println("str += \"World\" 는(은) " + str); // \" escape 문자
		
		str += 123; // str = str + 123;
		System.out.println("str += 123 는(은) " + str);
		
	}
}