자바 비교 연산자와 논리 연산자에 대해 알아보자

2024. 12. 30. 13:00JAVA

728x90
반응형

 

 안녕하세요. 진득 코딩입니다.

 

 이번 시간에는 저번 포스팅에 이어 비교 연산자와 논리 연산자에 대해 알아보도록 하겠습니다.

 

비교 연산자

 

  • 비교 연산자는 두 피연산자를 비교하는 데 사용되는 연산자입니다.

  • 주로 조건문과 반복문의 조건식에 사용되며, 연산결과는 오직 true와 false 둘 중의 하나입니다.

  • 비교 연산자는 이항 연산자로 비교하는 피연산자의 타입이 서로 다를 경우에는 자료형의 범위가 큰 쪽으로 자동 형변환하여 피연산자의 타입을 일치시킨 후에 비교합니다.

대소 비교 연산자

 

비교연산자 연산결과
>  좌변 값이 크면, true 아니면 false
<  좌변 값이 작으면, true 아니면 false
>=  좌변 값이 크거나 같으면, true 아니면 false
<=  좌변 값이 작거나 같으면, true 아니면 false

 

  • 대소 비교 연산자는 값의 크기를 비교하는 연산자입니다.

  • 참이면 true, 거짓이면 false를 결과로 반환합니다.

  • 기본형 중에서는 boolean형을 제외한 나머지 자료형에 다 사용할 수 있고 참조형에는 사용할 수 없습니다.

등가 비교 연산자

 

비교연산자 연산결과
==  두 값이 같으면, true 아니면 false
!=  두 값이 다르면, true 아니면 false

 

  • 등가 비교 연산자는 두 연산자의 값이 같은지 또는 다른지를 비교하는 연산자입니다.

  • 기본형은 물론 참조형, 즉 모든 자료형에 사용할 수 있습니다.

  • 기본형은 변수에 저장되어 있는 값이 같은지를 알 수 있고, 참조형은 두 개의 피연산자(참조변수)가 같은 객체를 가리키고 있는지를 알 수 있습니다.

  • 기본형과 참조형은 서로 형변환이 가능하지 않기 때문에 기본형과 참조형을 비교할 수 없습니다.

  • !=과 같이 두 개의 기호로 이루어진 연산자는 =!와 같이 기호의 순서를 바꾸거나 ! =과 같이 중간에 공백이 들어가서는 안됩니다.

비교 연산자 예제

예제 3-21

 

  • 비교 연산자는 연산을 수행하기 전에 형변환을 통해 두 피연산자의 타입을 같게 맞춘 다음 피연산자를 비교합니다.

  • 문자 'A'의 유니코드는 10진수로 65이고, 'B'는 66, '0'은 48이므로 유니코드로 바뀐 후에 계산됩니다.

예제 3-22

 

  • 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를 반환합니다.

예제 3-23

 

  • 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)인 경우의 연산 결과를 표로 나타낸 것입니다.

예제 3-24

 

 예제를 통해 자주 사용되는 논리 연산자의 예시를 살펴보도록 하겠습니다.

  1. x는 10보다 크고, 20보다 작다.
    x > 10 && x <20
    또는
    10 < x && x < 20

  2. i는 2의 배수 또는 3의 배수이다.
    i % 2 == || i % == 0

  3. i는 2의 배수 또는 3의 배수지만 6의 배수는 아니다.
    ( i % 2 == 0 || i % 3 == 0 ) && i % 6 != 0

  4. 문자 ch는 숫자 ( '0' ~ '9')이다.
    '0' <= ch && ch <= '9'
    해당 식은 유니코드에서 문자 '0'부터 '9'까지 연속적으로 배치되어 있기 때문에 가능한 식입니다.

  5. 문자 ch는 대문자 또는 소문자이다.
    ('a' <= ch && ch <= 'z') || ('A' <= ch && ch <= 'Z')

예제 3-25
숫자 입력
영문자 입력

 

  • 위 예제는 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연산 '||'의 경우에는 연산결과가 '참'일 확률이 높은 피연산자를 연산자의 왼쪽에 놓아야 더 빠른 연산결과를 얻을 수 있습니다.

예제 3-26

 

  • 변수 b에 증감 연산자 '++'을 사용하여 우측 피연산자가 처리되면, b의 값이 증가하도록 코드를 작성하였습니다.

  • 그러나 두 번의 논리연산 후에도 b이 값은 여전히 0인 채로 남아있습니다.

  • '||(OR)'의 경우에 좌측 피연산자(a != 0)가 참이라서, 그리고 '&&(AND)'의 경우는 좌측 피연산자 (a == 0)가 거짓이라서 우측 피연산자를 평가하지 않았기 때문입니다.

논리 부정 연산자

 

  • 논리 부정 연산자 '!'는 피연산자가 true이면 false를, false면 true를 결과로 반환합니다.

  • 한마디로 true와 false를 반대로 바꾸는 것입니다.

x !x
true false
false true

 

  • 어떤 값에 논리 부정 연산자 '!'를 반복적으로 적용하면, 참과 거짓이 차례대로 반복됩니다.

  • 이 연산자의 이러한 성질을 이용하여 전원버튼과 같은 '토글 버튼(toggle button)'을 논리적으로 구현할 수 있습니다.

  • 논리 부정 연산자 '!'는 주로 조건문과 반복문의 조건식으로 사용됩니다.

예제 3-27

 

  • 단항연산자는 결합 방향이 오른쪽에서 왼쪽이므로 피연산자와 가까운 것부터 먼저 연산됩니다.

  • 그래서 피연산자인 b와 가까운 논리 부정 연산자 '!'가 먼저 수행되고 이 값에 다시 '!' 연산을 수행하게 됩니다.

 

 이번 시간에는 비교 연산자와 논리 연산자에 대해 알아보았습니다.

 이 연산자들로 조건문과 반복문에 유용하게 사용되기 때문에 잘 알아두고 넘어가면 조건문과 반복문에 많은 도움이 될 거라고 생각합니다.

 이번 포스팅은 여기까지입니다.

 읽으시면서 궁금하시거나 이해 안 되는 부분이 있거나 포스팅에 잘못된 내용이 있다고 생각되시면 댓글에 남겨주시면 답글 남기도록 하겠습니다.

 끝까지 봐주셔서 감사합니다.😊

728x90
반응형
LIST