1. 비교 연산자
비교 연산자는 동등(==, !=) 또는 크기(<, <=, >, >=)를 평가해서 boolean 타입인 true/false를 산출한다. 비교 연산자는 흐름 제어문인 조건문(if), 반복문(for, while) 에서 실행 흐름을 제어할 때 주로 사용된다.
구분 | 연산식 | 설명 | ||
동등 비교 |
피연산자1 | == | 피연산자2 | 두 피연산자의 값이 같은지를 검사 |
피연산자1 | != | 피연산자2 | 두 피연산자의 값이 다른지를 검사 | |
크기 비교 |
피연산자1 | > | 피연산자2 | 피연산자1이 큰지를 검사 |
피연산자1 | >= | 피연산자2 | 피연산자1이 크거나 같은지를 검사 | |
피연산자1 | < | 피연산자2 | 피연산자1이 작은지를 검사 | |
피연산자1 | <= | 피연산자2 | 피연산자1이 작거나 같은지를 검사 |
피연산자의 타입이 다를 경우에는 비교 연산을 수행하기 전에 타입을 일치시킨다. 예를 들어 'A' == 65는 'A'가 int 타입으로 변환되어 65가 된 다음 65 == 65로 비교한다. 마찬가지로 3 == 3.0은 3을 double 타입인 3.0으로 변환한 다음 3.0 == 3.0으로 비교한다.
'A' == 65 → true
3 == 3.0 → true
한 가지 예외가 있다면 0.1f == 0.1에서 0.1f가 double 타입으로 변환되면 0.1 == 0.1이 되어 true가 산출되어야 하지만, 이 결과값은 false가 산출된다. 그 이유는 부동 소수점 방식을 사용ㅇ하는 실수 타입은 0.1을 정확히 표현할 수 없을 뿐만 아니라 float 타입과 double 타입의 정밀도 차이 때문이다. 해결책은 피연산자를 float 타입으로 강제 타입 변환 후에 비교연산을 하면 된다.
0.1f == 0.1 → false
0.1f == (float) 0.1 → true
문자열을 비교할 때에는 동등(==, !=) 연산자 대신 euqals()와 !equals()를 사용한다.
str1 = 원본 문자열, str2 = 비교 문자열
boolean result = str1.equals(str2); //문자열이 같은지 검사(대소문자 구분)
boolean result = ! str1.equals(str2); //문자열이 다른지 검사
2. 논리 연산자
논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^) 그리고 논리 부정(!) 연산을 수행한다. 논리 연산은 흐름 제어문인 조건문(if), 반복문(for, while) 등에서 주로 이용된다.
구분 | 연산식 | 결과 | 설명 | ||
AND (논리곱) |
ture | && 또는 & |
ture | ture | 피연산자 모두가 true일 경우에만 연산 결과가 true |
ture | false | false | |||
false | ture | false | |||
false | false | false | |||
OR (논리합) |
ture | || 또는 | |
ture | ture | 피연산자 중 하나만 true이면 연산 결과는 true |
ture | false | ture | |||
false | ture | ture | |||
false | false | false |
구분 | 연산식 | 결과 | 설명 | ||
XOR (배타적 논리합) |
true | ^ | true | false | 피연산자가 하나는 true이고 다른 하나가 false일 경우에만 연산 결과가 true |
true | false | true | |||
false | true | true | |||
false | false | false | |||
NOT (논리 부정) |
! | true | false | 피연산자의 논리값을 바꿈 | |
false | true |
&&(||)와 &(|)는 산출 결과는 같지만 연산 과정이 조금 다르다. &&(||)는 앞의 피연산자가 false라면 뒤의 피연산자를 평가하지 않고 바로 false를 산출한다. 그러나 &(|)는 두 피연산자 모두를 평가해서 산출 결과를 낸다. 따라서 &(|)보다는 &&(||)가 더 효율적으로 동작한다.
3. 비트 논리 연산자
비트 논리 연산자는 bit 단위로 논리 연산을 수행한다. 0과 1이 피연산자가 되므로 2진수 0과 1로 저장되는 정수 타입(byte, short, int, long)만 피연산자가 될 수 있고, 부동 소수점 방식으로 저장되는 실수 타입(float, double)은 피연산자가 될 수 없다. 다음 표는 비트 논리 연산자의 종류이다. 산출 결과가 1, 0이라는 점에 주목하고 1은 true, 0은 false라고 생각하면 논리 연산자와 차이가 없다.
구분 | 연산식 | 결과 | 설명 | ||
AND (논리곱) |
1 | & | 1 | 1 | 두 비트 모두 1일 경우에만 연산 결과가 1 |
1 | 0 | 0 | |||
0 | 1 | 0 | |||
0 | 0 | 0 | |||
OR (논리합) |
1 | | | 1 | 1 | 두 비트 중 하나만 1이면 연산 결과는 1 |
1 | 0 | 1 | |||
0 | 1 | 1 | |||
0 | 0 | 0 |
구분 | 연산식 | 결과 | 설명 | ||
XOR (배타적 논리합) |
1 | ^ | 1 | 0 | 두 비트 중 하나는 1이고 다른 하나가 0일 경우 연산 결과는 1 |
1 | 0 | 1 | |||
0 | 1 | 1 | |||
0 | 0 | 0 | |||
NOT (논리 부정) |
~ | 1 | 0 | 보수 | |
0 | 1 |
비트 논리 연산자는 byte, short, char 타입 피연산자를 int 타입으로 자동 변환한 후 연산을 수행한다. 따라서 연산 결과도 int 타입이 되므로 int 변수에 대입해야 한다.
byte num1 = 45;
byte num2 = 25;
// byte result = num1 & num2; //컴파일 에러
int result = num1 & num2;
마지막으로 Byte.toUnsignedInt() 코드 라는게 존재한다. 이 코드는 255 를 비트 논리곱(&) 연산시켜주는 코드이다.
byte receiveData = -120;
int unsignedInt = receiveData & 255; //결과값: 136
int unsignedInt = Byte.toUnsignedInt(receiveData); //결과값: 136
'Language > Java' 카테고리의 다른 글
[Java] NaN과 Infinity 처리 (0) | 2022.10.14 |
---|---|
[Java] 정확한 계산 하는 방법 (0) | 2022.10.09 |
[Java] 오버플로우와 언더플로우 (0) | 2022.10.07 |
[Java] 부호/증감/산술 연산자 (0) | 2022.10.06 |
[Java] 키보드 입력 데이터를 변수에 저장 (0) | 2022.10.04 |