제니노트

논리 연산자, 논리 부정 연산자 [자바] 본문

Java/Java 입문

논리 연산자, 논리 부정 연산자 [자바]

yangjennie 2023. 6. 30. 17:26
반응형

논리 연산자

두 개의 조건이 결합된 경우에 사용하는 것이 논리 연산자이다.

 

논리 연산자 - &&,||,!

 

|| (OR 결합) : 피연산자 중 어느 한 쪽만 true 이면 true를 결과로 얻는다.
&&(AND결합) : 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다. 

 

x y x||y x&&y
true true true true
true false true false
false true true false
false false false false

 

x&&y : 둘 다 참일 때만 true, 나머지는 false 

 

1) x는 10보다 크고, 20보다 작다.

'x>10'와 'x<20'가 그리고(and)로 연결된 조건이다. 

 

x>10 && x<20 

 

'x>10'는 '10<x'와 같다. 따라서

 

10 < x && x < 20 

 

위와 비교하면 왼,오른쪽만 바뀐 것이다. 

어느쪽이라도 상관은 없지만, 가독성 측면에서 위의 식이 더 나을 수 있다.

하지만 10<x<20 과 같이 표기하는 것은 허용되지 않는다.

 

2) i는 2의 배수 또는 3의 배수이다. 

 

i%2 == 0 || i%3 == 0

 

i의 값이 8이라고 가정하면, 

8%2 == 0 || 8%3 == 0 

0 == 0 || 2==0 

true || false

true 

 

3) i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다. 

 

( i%2==0 || i%3 == 0 ) && i%6 != 0 

 

위의 식에 괄호를 사용한 이유는 &&가 || 보다 우선순위가 더 높기 때문이다. 

하나의 식에 &&와 ||가 같이 포함된 경우, &&가 먼저 연산되어야하는 경우라도 괄호를 사용해서 우선순위를 명확히 해주는 것이 좋다. 

 

4) 문자 (ch) 는 숫자 ('0'~'9') 이다.

 

'0' <= ch && ch <= '9' 

 

유니코드는 문자 '0'부터 '9'까지 연속적으로 배치되어 있기 때문에 이가 가능하다.

0 은 48, 9는 57이다.

만약 ch가 '5'라고 가정하면

 

'0' '1' '2' '3' '4' '5' '6' '7' '8' '9'
48 49 50 51 52 53 54 55 56 57

'0' <= '5' && '5' <= '9'

48 <= 53 && 53 <= 57 로 표현되므로 true&&true = true 의 결과가 나오는 것이다 

 

5) 문자 ch는 대문자 또는 소문자이다.

 

a~z, A~Z 또한 연속적으로 배치되어 있으므로 다음과 같이 식을 쓸 수 있다.

 

('a'<=ch && ch <= 'z') || ('A'<=ch && ch <= 'Z')

 

논리 부정 연산자 ! 

피연산자가 true 이면 false를, false면 true를 결과로 반환.

x !x
true false
false true

'문자 ch는 소문자가 아니다'를 논리 부정 연산자로 표시하면 이해하기 쉬워진다. 

 

일반식으로 표현하면 

ch < 'a' || ch > 'z' 

 

소문자를 확인 하는 식은 

'a' <= ch && and ch <='z' 였다.

여기에 !('a' <= ch && and ch <='z') 를 하면 소문자가 아닌 식을 판별할 수 있다.

 

 

 

 

public class ScanfEx1 {

	public static void main(String[] args) {
		boolean b = true;
		char ch = 'C';
		
		System.out.printf("b=%b\n",b);
		System.out.printf("!b=%b\n",!b);
		System.out.printf("!!b=%b\n",!!b);
		System.out.printf("!!!b=%b\n",!!!b);
		System.out.println();
		
		System.out.printf("ch=%c\n", ch);
		System.out.printf("ch < 'a' || ch > 'z' = %b\n",ch<'a' || ch>'z');
		System.out.printf("!(ch < 'a' || ch > 'z') = %b\n",!('a'<=ch && ch <= 'z'));
		System.out.printf(" 'a'<=ch && ch<='z' = %b%n" , 'a'<=ch && ch<='z');
		
		
		
		
		
		
		

	}

}

!!b가 평가되는 과정은 이러하다 

 

!!b
!!true 가까운 연산자가 먼저 연산됨
!false !true의 결과를 false이다.
true !false의 결과는 true다.

 

참고 : https://www.youtube.com/watch?v=AdFrJizyF80&list=PLW2UjW795-f6xWA2_MUhEVgPauhGl3xIp&index=30

반응형
Comments