본문 바로가기

프로그래밍/Java 프로그래밍

자바 연산자와 연산식3

이전 포스팅에 이어 이번에는 이항 연산자인 비교연산자와 논리연산자에 이어 삼항 연산자에 대해 알아보겠습니다. 비교 연산자와 논리연산자는 같이 나오는 경우가 많이 있습니다. 그래서 같이 알아보도록 하겠습니다.


비교 연산자(<, <=, >, >=, ==, !=)

비교연산자는 피연산자의 대소(<, <=, >, >=) 또는 동등(==, !=)을 비교해서 true/false를 산출합니다. 대소 연산자는 boolean을 제외한 기본타입에 사용할 수 있고, 등등 연산자는 모든 타입에 사용할 수 있습니다. 비교 연산자는 흐름 제어문인 조건문(if), 반복문(for, while)에서 주로 이용되어 실행 흐름을 제어할 때 사용됩니다.



위의 예에서 보듯이 비교연산자는 = 부호가 2개 있습니다. 사람들은 =가 비교연산자로 쓰기때문에 많이 헷갈리는 경우가 있습니다. =는 대입연산자이고 ==는 비교연산자입니다. 라인7을 보면 num1과 num2가 같은지 비교해서 true/false값을 result1에 대입합니다. num1과 num2는 모두 10이기때문에 true가 result1에 저장됩니다. 이것과 같은 방식으로 다른 라인들도 실행됩니다. 라인 16을 보면 char 타입이 정수형이기때문에 비교가 가능하고 쉽게 예상할 수 있듯이 'B'는 'A'보다 크기때문에 true가 저장됩니다.




위의 예제에서 v2와 v3는 타입이 다릅니다. 이렇게 타입이 다른 경우는 타입을 일치시킨 다음에 비교를 하게됩니다. 그래서 라인 7을 보면 v2 == v3에서 v2를 double 타입으로 변환한 후에 비교를 하게됩니다. 1이 1.0으로 변환하고 비교하므로 true가 됩니다.  라인 11을 실행한 결과를 보면 false가 나옵니다. 이것이 이상하게 보일텐데 이것은 float과 double 의 정확도때문입니다. 실수의 저장 방식인 부동 소수점 방식이 0.1을 정확히 표현할 수 없기 때문입니다. 0.1f는 0.1의 근사값인 0.10000000149011612로 푠현되기때문입니다. 따라서 0.1보다 큰 값이 되어 버립니다. 실수형을 사용할 때는 double을 사용하는 것이 정확도도 높고 비교할 때도 오류가 없고 리터럴을 사용할 때도 f를 넣지 않아도 되므로 여러가지 면에서 편리합니다. 라인 12에서처럼 강제로 double을 float로 캐스팅을 하여 비교할 수도 있지만 캐스팅은 값을 잃어버릴 수가 있기 때문에 double을 사용하는 것이 더 좋습니다.



논리 연산자(&&, ||, &, |, ^, !)

논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^), 논리 부정(!) 연산을 수행합니다. 논리 연산자의 피연산자는 boolean 타입만 사용할 수 있습니다. 논리연산 종류와 기능은 다음과 같습니다.


 구분

연산식 

결과 

설명

AND

(논리곱) 

true

&&
또는

true

true

 피연산자가 모두 true인 경우에만 연산결과가 true

true

false 

false 

false

true 

false

false

false 

false 

 OR

(논리합)

true

||
또는
|

true 

true 

 피연산자가 모두 false인 경우에만 연산결과가 false

true 

false

true 

false 

true 

true

false 

false

false

 XOR

(배타적 논리합)

true

true 

false 

 피연산자의 값이 다른 경우에만 true

true 

false 

true 

false 

true 

true 

false 

false 

false 

NOT

(논리 부정) 

 

 !

true 

false 

 피연산자의 논리값을 바꿈

false 

true 


논리곱은 &&, &는 "그리고"의 의미를 가지고 논리합인 ||, |는 "또는"의 의미를 가집니다. 비교연산시에 "그리고"와 "또는"을 넣어서 생각하시면 좀 더 쉽게 이해할 수 있습니다. &&와 &는 산출 결과는 같지만 연산과정이 조금 다릅니다. &&는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false라는 산출 결과를 냅니다. 왜냐하면 하나라도 false라면 전체 연산식은 false이기 때문입니다. 그러나 &는 두 피연산자 모두를 평가해서 산출 결과를 냅니다. 따라서 &보다는 &&가 더 효율적으로 동작합니다.

||와 |도 마찬가지로 동작합니다..



위의 코드에서 혼자 공부하는 자바의 예제를 가져온 것입니다. 사실 if문장에서 65와 같은 유니코드 숫자를 사용하는 것보다는 실제 문자를 사용하는 것이 보기좋고 이해하기 쉽습니다. charCode >= 65 보다는 charCode >= 'A' 가 훨씬 보기쉽습니다. 다른 것도 마찬가지입니다.  중간에 보면 0-9 숫자군요라는 부분이 나오는데 이는 실제 숫자가 아니라 문자인 숫자를 의미하는 것입니다. '0'부터 '9'의 유니코드 값입니다. 마지막에 두개의 if문장은 논리 연산자만 다르고 나머지는 같습니다. |와 ||의 차이를 살펴볼 수 있습니다. |의 경우는 처음 연산식이 true이지만 두번째 연산식도 연산을 해서 결과를 보고 true | true 연산을 합니다. 이에 반해 ||인 경우는 첫번째 연산식이 true이므로 두번째 연산식은 보지도 않고 바로 true라는 결과를 보내줍니다. 



대입 연산자(=, +=, -=, *=, /=, %=)

대입 연산자는 오른쪽 피연산자의 값을 왼쪽 피연산자인 변수에 저장합니다. 오른쪽 피연산자에는 리터럴 및 변수, 다른 연산식이 올 수 있습니다. 단순히 오른쪽 피연산자의 값을 변수에 저장하는 단순 대입 연산자가 있고, 정해진 연산을 수행한 후 결과를 변수에 저장하는 복합 대입 연산자도 있습니다. 대입 연산자는 모든 연산자들 중에서 가장 낮은 연산 순위를 가지고 있기 때문에 제일 마지막에 수행됩니다. 그리고 연산의 진행 방향이 오른쪽에서 왼쪽입니다. 복합 대입연산자는 줄임형태입니다. 실제로 a += 1;은 a = a + 1;입니다. 둘은 완전히 같은 결과를 발생하지만 프로그래머들은 간결한 연산식을 원하기때문에 대입연산자 같은 줄인 형태를 좋아합니다. 처음에는 어려울 수도 있지만 자주 사용하다보면 간결하기때문에 유용하다는 것을 느끼게 될 것 입니다.





'프로그래밍 > Java 프로그래밍' 카테고리의 다른 글

자바 조건문  (0) 2020.06.29
자바연산자와 연산식4  (0) 2020.06.29
자바 연산자와 연산식2  (0) 2020.06.26
자바의 연산자와 연산식1  (0) 2020.06.25
자바의 변수와 시스템 입출력  (0) 2020.06.24