자바 비교 연산자와 논리 연산자에 대해 알아보자
2024. 12. 30. 13:00ㆍJAVA
728x90
반응형
안녕하세요. 진득 코딩입니다.
이번 시간에는 저번 포스팅에 이어 비교 연산자와 논리 연산자에 대해 알아보도록 하겠습니다.
비교 연산자
- 비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자입니다.
- 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true와 false 둘 중의 하나입니다.
- 비교 연산자는 이항 연산자로 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후에 비교합니다.
대소 비교 연산자
비교연산자 | 연산결과 |
> | 좌변 값이 크면, true 아니면 false |
< | 좌변 값이 작으면, true 아니면 false |
>= | 좌변 값이 크거나 같으면, true 아니면 false |
<= | 좌변 값이 작거나 같으면, true 아니면 false |
- 대소 비교 연산자는 값의 크기를 비교하는 연산자입니다.
- 참이면 true, 거짓이면 false를 결과로 반환합니다.
- 기본형 중에서는 boolean형을 제외한 나머지 자료형에 다 사용할 수 있고 참조형에는 사용할 수 없습니다.
등가 비교 연산자
비교연산자 | 연산결과 |
== | 두 값이 같으면, true 아니면 false |
!= | 두 값이 다르면, true 아니면 false |
- 등가 비교 연산자는 두 연산자의 값이 같은지 또는 다른지를 비교하는 연산자입니다.
- 기본형은 물론 참조형, 즉 모든 자료형에 사용할 수 있습니다.
- 기본형은 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형은 두 개의 피연산자(참조변수)가 같은 객체를 가리키고 있는지를 알 수 있습니다.
- 기본형과 참조형은 서로 형변환이 가능하지 않기 때문에 기본형과 참조형을 비교할 수 없습니다.
- !=과 같이 두 개의 기호로 이루어진 연산자는 =!와 같이 기호의 순서를 바꾸거나 ! =과 같이 중간에 공백이 들어가서는 안됩니다.
비교 연산자 예제
- 비교 연산자는 연산을 수행하기 전에 형변환을 통해 두 피연산자의 타입을 같게 맞춘 다음 피연산자를 비교합니다.
- 문자 'A'의 유니코드는 10진수로 65이고, 'B'는 66, '0'은 48이므로 유니코드로 바뀐 후에 계산됩니다.
- 10.0 == 10.0f는 true인데 0.1 == 0.1f는 false인 이유는 실수형은 근사값이 저장되므로 오차가 발생할 수 있기 때문입니다.
- 10.0f는 오차없이 저장할 수 있는 값이라서 double로 형변환해도 그대로 10.0이 되지만, 0.1f는 저장할 때 2진수로 변환하는 과정에서 오차가 발생합니다.
- double 타입의 상수인 0.1도 저장되는 과정에서 오차가 발생하지만, float 타입의 리터럴인 0.1f보다 적은 오차로 저장됩니다.
- 또한 float타입의 값을 정밀도가 더 높은 double타입으로 형변환했다고 해서 오차가 적어지는 것이 아닙니다.
- 그렇기 때문에 double타입의 값을 float타입으로 형변환한 다음에 비교해야 합니다.
- 또는 어느 정도의 오차는 무시하고 두 타입의 값을 앞에서 몇 자리만 잘라서 비교하는 방법도 있습니다.
문자열의 비교
- 두 문자열을 비교할 때는, 비교 연산자 '==' 대신 equals()라는 메서드를 사용해야 합니다.
- 비교 연산자는 두 문자열이 완전히 같은 것인지 비교하므로, 문자열의 내용이 같은지 비교하는 equals()를 사용합니다.
- equals()는 비교하는 두 문자열이 같으면 true, 다르면 false를 반환합니다.
- str2와 "abc"의 내용이 같은데도 '=='로 비교하면, false를 결과로 얻습니다.
- 이는 '=='를 사용하면 내용을 비교하는 것이 아닌 같은 객체인지 확인하기 때문입니다.
- 그러나 equals()를 사용하면 객체가 달라도 내용이 같으면 true를 반환합니다.
- 그래서 문자열을 비교할 때는 항상 equals()를 사용해야 합니다.
- 만일 대소문자를 구별하지 않고 비교하고 싶으면, equals() 대신 equalsIgnoreCase()를 사용하면 됩니다.
논리 연산자
- 논리 연산자는 둘 이상의 조건을 '그리고(AND)'나 '또는(OR)'으로 연결하여 하나의 식으로 표현할 수 있게 해 줍니다.
- 논리 연산자 '&&'는 두 피연산자가 모두 true일 때만 true를 결과로 얻습니다.
- '||'는 두 피연산자 중 어느 한쪽만 true이어도 true를 결과로 얻습니다.
- 또한 논리 연산자는 피연산자로 boolean형 또는 boolean형 값을 결과로 하는 조건식만을 허용합니다.
|| (OR결합) 피연산자 중 어느 한쪽만 true이면 true를 결과로 얻습니다.
&&(AND결합) 피연산자 양쪽 모두 ture이어야 true를 결과로 얻습니다.
x | y | x || y | x && y |
true | true | true | true |
true | false | true | false |
false | true | true | false |
false | false | false | false |
- 위 표는 참(true)인 경우와 거짓(false)인 경우의 연산 결과를 표로 나타낸 것입니다.
예제를 통해 자주 사용되는 논리 연산자의 예시를 살펴보도록 하겠습니다.
- x는 10보다 크고, 20보다 작다.
x > 10 && x <20
또는
10 < x && x < 20 - i는 2의 배수 또는 3의 배수이다.
i % 2 == || i % == 0 - i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
( i % 2 == 0 || i % 3 == 0 ) && i % 6 != 0 - 문자 ch는 숫자 ( '0' ~ '9')이다.
'0' <= ch && ch <= '9'
해당 식은 유니코드에서 문자 '0'부터 '9'까지 연속적으로 배치되어 있기 때문에 가능한 식입니다. - 문자 ch는 대문자 또는 소문자이다.
('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')
- 위 예제는 Scanner을 사용한 예제입니다.
- console 창에 숫자를 입력하게 되면 '입력하신 문자는 숫자입니다.'라는 문구가 출력되고 영문자를 입력하게 되면 '입력하신 문자는 영문자입니다.'라는 문구가 출력됩니다.
효율적인 연산(short circuit evaluation)
- 논리 연산자의 특징 중 하나는 효율적인 연산을 한다는 것입니다.
x | y | x || y |
true | true | true |
true | false | true |
false | true | true |
false | false | false |
- OR연산 '||'의 경우, 두 피연산자 중 어느 한쪽만 참이어도 전체 연산 결과가 참이므로 좌측 피연산자가 'true(참)'이면, 우측 피연산자의 값은 평가하지 않습니다.
- x가 true이면, x || y는 항상 true입니다.
x | y | x && y |
true | true | true |
true | false | false |
false | true | false |
false | false | false |
- AND연산 '&&'도 마찬가지로 어느 한쪽만 '거짓(false)'이어도 전체 연산결과가 '거짓(false)'이므로 좌측 피연산자가 '거짓(false)'이면, 우측 피연산자는 평가하지 않습니다.
- x가 false이면, x && y는 항상 false입니다.
- 그래서 같은 조건식이라도 피연산자의 위치에 따라서 연산 속도가 달라질 수 있습니다.
- OR연산 '||'의 경우에는 연산결과가 '참'일 확률이 높은 피연산자를 연산자의 왼쪽에 놓아야 더 빠른 연산결과를 얻을 수 있습니다.
- 변수 b에 증감 연산자 '++'을 사용하여 우측 피연산자가 처리되면, b의 값이 증가하도록 코드를 작성하였습니다.
- 그러나 두 번의 논리연산 후에도 b이 값은 여전히 0인 채로 남아있습니다.
- '||(OR)'의 경우에 좌측 피연산자(a != 0)가 참이라서, 그리고 '&&(AND)'의 경우는 좌측 피연산자 (a == 0)가 거짓이라서 우측 피연산자를 평가하지 않았기 때문입니다.
논리 부정 연산자
- 논리 부정 연산자 '!'는 피연산자가 true이면 false를, false면 true를 결과로 반환합니다.
- 한마디로 true와 false를 반대로 바꾸는 것입니다.
x | !x |
true | false |
false | true |
- 어떤 값에 논리 부정 연산자 '!'를 반복적으로 적용하면, 참과 거짓이 차례대로 반복됩니다.
- 이 연산자의 이러한 성질을 이용하여 전원버튼과 같은 '토글 버튼(toggle button)'을 논리적으로 구현할 수 있습니다.
- 논리 부정 연산자 '!'는 주로 조건문과 반복문의 조건식으로 사용됩니다.
- 단항연산자는 결합 방향이 오른쪽에서 왼쪽이므로 피연산자와 가까운 것부터 먼저 연산됩니다.
- 그래서 피연산자인 b와 가까운 논리 부정 연산자 '!'가 먼저 수행되고 이 값에 다시 '!' 연산을 수행하게 됩니다.
이번 시간에는 비교 연산자와 논리 연산자에 대해 알아보았습니다.
이 연산자들로 조건문과 반복문에 유용하게 사용되기 때문에 잘 알아두고 넘어가면 조건문과 반복문에 많은 도움이 될 거라고 생각합니다.
이번 포스팅은 여기까지입니다.
읽으시면서 궁금하시거나 이해 안 되는 부분이 있거나 포스팅에 잘못된 내용이 있다고 생각되시면 댓글에 남겨주시면 답글 남기도록 하겠습니다.
끝까지 봐주셔서 감사합니다.😊
728x90
반응형
LIST
'JAVA' 카테고리의 다른 글
자바 제어문인 조건문 if문에 대해 알아보자 (0) | 2025.01.01 |
---|---|
비트 연산자와 그 외 여러 연산자들에 대해 알아보자 (0) | 2024.12.31 |
자바 산술 연산자에 대해 알아보자 (2) | 2024.12.27 |
자바 연산자(operator) 개념과 종류에 대해 알아보자 (0) | 2024.12.26 |
형변환으로 다른 타입으로 변환해보자 (0) | 2024.12.24 |