‘x가 4보다 작다’라는 조건은 비교연산자를 써서 ‘x < 4’와 같이 표현할 수 있다. 그러면 x가 4보다 자거나 또는 10보다 크다와 같이 두개의 조건이 결합된 경우에은 어떻게 표현해야 할까? 이 때 사용하는것이 ‘논리 연산자 이다. 논리 연산자는 ‘그리고(AND)’, 또는(OR)으로 연결하여 하나의 식으로 표현할 수 있게 해준다.
논리 연산자 &&, ||, !
|| (or 결합) : 피연산자중 어느 한쪽만 true이면 true로 값을 얻는다.
&& (and 결합) : 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.
(1) 1은 10보다 크고, 20보다 작다
1
x > 10 && x < 20 으로 표현 가능하다.
(2) i는 2의 배수 또는 3의 배수이다. 어떤 수가 2의 배수라는 얘기는 2로 나누었을 때 나머지가 0이라는 뜻이다.
1
i%2==0 || i%3==0 으로 표현 가능하다.
(3) i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다. 6의 배수가 아니어야 한다는 조건은 ‘i%6!=0’ 이고, 이 조건을 AND로 연결해야한다.
1
(i%2==0 || i%3==0) && i%6!=0 으로 표현 가능하다.
괄호를 사용한 이유는 &&가 ||보다 우선순위가 높기 때문이다. (4) 문자 ch는 숫자 (‘0’~’9’) dlek. 사용자가 입력한 문자가 해당하는 숫자인지는 다음과 같이 쓸 수 있다.
1
'0'<=ch && ch <= '9'
이것은 유니코드로 문자 ‘0’ 에서 ‘9’까지 연속적으로 배치되어 있기 때문에 가능한 식이다.
(5) 문자 ch는 대문자 또는 소문자이다.
1
('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
예제를 통해 자세히 알아보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
int x = 0;
char ch = ' ';
x = 15;
System.out.printf("x=%2d, 10 < x && x < 20 =%b\n", x, 10 < x && x < 20);
x = 6;
System.out.printf("x=%2d, x%%2==0 || x%%3==0 && x%%6!=0 =%b\n", x, x%2==0||x%3==0&&x%6!=0);
System.out.printf("x=%2d, (x%%2==0 || x%%3==0) && x%%6!=0 =%b\n", x,(x%2==0||x%3==0)&&x%6!=0);
ch='1';
System.out.printf("ch='%c', '0' <= ch && ch <= '9' =%b\n", ch, '0' <= ch && ch <='9');
ch='a';
System.out.printf("ch='%c', 'a' <= ch && ch <= 'z' =%b\n", ch, 'a' <= ch && ch <='z');
ch='A';
System.out.printf("ch='%c', 'A' <= ch && ch <= 'Z' =%b\n", ch, 'A' <= ch && ch <='Z');
ch='q';
System.out.printf("ch='%c', ch=='q' || ch=='Q' =%b\n", ch, ch=='q' || ch=='Q');
실행결과:
x=15, 10 < x && x < 20 =true
x= 6, x%2==0 || x%3==0 && x%6!=0 =true
x= 6, (x%2==0 || x%3==0) && x%6!=0 =false
ch='1', '0' <= ch && ch <= '9' =true
ch='a', 'a' <= ch && ch <= 'z' =true
ch='A', 'A' <= ch && ch <= 'Z' =true
ch='q', ch=='q' || ch=='Q' =true
효율적인 연산
논리 연산자의 또 다른 특징은 효율적인 연산을 한다는 것이다. OR연산의 경우 두 피연산자 중 어느 한쪽만 참이어도 결과가 참 이므로 좌측 피연산자가 true이면 우측 피연산자의 값은 평가하지 않는다. AND 연산의 경우도 좌측 피연산자가 거짓이면 우측 피연산자는 평가하지 않는다.
따라서 같은 조건식이라도 피연산자의 위치에 따라서 연산속도가 달라질 수 있기 때문에 OR 연산의 경우 연산결과가 참일 확률이 높은 피연산자를 왼쪽에 배치하는 것이 좋다.
논리 부정 연산자 !
이 연산자는 피연산자가 true 이면 flase, flase 이면 true로 반환한다.
어떤 값에 ‘!’를 반복적으로 적용하면 참과 거짓이 반복되는데, 이 연산자의 성질을 이용하면 전원 버튼과 같은 ‘토글 버튼’을 논리적으로 구현할 수 있다.
‘!’가 주로 사용되는 곳은 조건문과 반복문의 조건식이며 잘 사용하면 조건식이 보다 이해하기 쉬워진다.
예를 들어 ‘문자 ch는 소문자가 아니다’라는 조건을 예시로 두자.
ch < 'a' || ch > 'z' 와 !('a' <=ch && ch<= 'z')
위와 같이 왼쪽보다 오른쪽과 같이 !를 사용하는 쪽이 이해하기 쉽다.