JAVA BASE/operator(연산자)
06. [자바] 논리 연산자
staticClass
2020. 12. 2. 22:44
논리 연산자란?
'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문을 작성하고 고쳐오면서 논리연산을 수차례 해왔지만
한번도 효율적인 연산에 대해 생각해 본적이 없었다.
이런식으로도 효율적인 코딩이 가능하다는게 한대 맞은거 같은 기분이다.