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문을 작성하고 고쳐오면서 논리연산을 수차례 해왔지만
한번도 효율적인 연산에 대해 생각해 본적이 없었다.
이런식으로도 효율적인 코딩이 가능하다는게 한대 맞은거 같은 기분이다.