논리 연산자란?
'x가 4보다 작다' 라는 조건은 비교연산자를 써서 'x < 4' 처럼 표현할 수 있다.
그렇다면 'x가 4보다 작거나 또는 10보다 크다'와 같이 두 개의 조건이 결합된 경우는 어떻게 표현해야 할까?
이 때 사용하는 것이 '논리 연산자'이다. 논리 연산자는 둘 이상의 조건을 그리고(AND) 또는(OR)으로 연결하여
하나의 식으로 표현할 수 있게 해준다.
논리 연산자 - &&, ||, !
논리 연산자 '&&'는 우리말로 '그리고(AND)' 이며 두 피연산자가 모두 true일 때만 true를 결과로 준다
논리 연산자 '||'는 우리말로 '또는(OR)' 이며 두 피연산자 중 하나만 true여도 true를 결과로 준다.
논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용한다.
|| (OR결합) 피연산자 중 어느 한 쪽만 true이면 true를 결과로 얻는다.
&& (AND결합) 피연산자 양쪽 모두 true이어야 true를 결과로 얻는다.
자주 사용될만한 몇 가지 예를 통해 감을 잡아보자
x는 10보다 크고, 20보다 작다
//x는 10보다 크고, 20보다 작다
x > 10 && x < 20 // x가 11~19 사이면 true
//보통은 변수를 왼쪽에 쓰지만 가독성 측면에서 아래의 식이 더 나을 수 있다.
10 < x && x < 20
i는 2의 배수 또는 3의 배수이다.
//i는 2의 배수 또는 3의 배수이다.
i%2 == 0 || i%3 == 0 // i를 2로 나눈 나머지가 0 이거나 i를 3으로 나눈 나머지가 0이면 true
//만약 i에 8을 대입한 상황이라면..
8%2 == 0 || 8%3 == 0
→ 0 == 0 || 2 == 0
→ true || false
→ true
i는 2의 배수 또는 3의 배수이지만 6의 배수는 아니다.
//i는 2의 배수 또는 3의 배수이지만 6의 배수는 아니다.
(i%2 == 0 || i%3 == 0) && i%6 != 0 //연산 순위가 &&가 더 높아 괄호처리 해주어야 한다.
문자 ch는 숫자('0'~'9')이다.
//문자 ch는 숫자('0'~'9')이다.
ch >= '0' && ch <= '9' //유니코드 문자 '0'부터 '9'까지 연속적으로 배치되어 가능한 식
//ch가 '5'인 경우
→'5' >= '0' && '5' <= '9'
→ 53 <= 48 && 53 <= 57
→ true && true
→ true
문자 ch는 대문자 또는 소문자이다.
//문자 ch는 대문자 또는 소문자이다.
(ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')
효율적인 연산
OR연산'||'의 경우 한 쪽만 true이어도 전체 연산결과가 true이므로 좌측 피연산자가 true이면, 우측 피연산자의 값은 평가하지 않는다.
AND연산'&&'의 경우도 마찬가지로 좌측 피연산자가 false이면 우측 피연산자의 값은 평가하지 않는다.
a=5, b=0
a!= 0 || ++b!=0 // 결과 : true
a==0 && ++b!=0 // 결과 : false
System.out.println(a + " : " + b);
// 결과 5 : 0 (위 비교연산중 ++b가 2번이나 있는데 b는 그대로 0 이다)
++b가 있었지만 한번도 연산되지 않았다 그 이유는 a!=0가 이미 true임으로 두번째 ++b!=0을 연산할 필요가 없고
a==0가 이미 false 임으로 우측의 ++b!=0을 연산할 필요가 없기 때문에 두 코드 모두다 연산되지 않아 b의 데이터에
아무런 변화가 일어나지 않았다.
if문을 작성하고 고쳐오면서 논리연산을 수차례 해왔지만
한번도 효율적인 연산에 대해 생각해 본적이 없었다.
이런식으로도 효율적인 코딩이 가능하다는게 한대 맞은거 같은 기분이다.
댓글