청야에몽
청야의 개발 일기
청야에몽
전체 방문자
오늘
어제
  • 분류 전체보기 (156)
    • os (4)
      • Linux (4)
    • Language (32)
      • Python (15)
      • C# (6)
      • Java (11)
    • BaekJoon (92)
      • 단계별로 풀어보기 (81)
      • 누적합 (11)
    • Test (6)
      • 코딩테스트 (6)
      • 42 SEOUL (0)
    • Project (9)
      • 충돌, 피하기 게임 (8)
      • Unreal engine5 CICD 구축 (1)
    • Git & GitHUB (9)
    • Cloud (3)
      • AWS (0)
      • Azure (0)
      • Docker (3)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Linux
  • Rebase
  • Python
  • 누적합
  • java
  • 리눅스
  • pygame
  • git
  • Reset
  • 누적 합
  • docker
  • 백준
  • for문
  • Revert
  • 파이썬
  • 재귀 함수
  • 중첩for문
  • 자료형
  • 연산자
  • c#

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
청야에몽

청야의 개발 일기

Language/Java

[Java] 연산자(비교 연산자, 논리 연산자, 비트 논리 연산자)

2022. 10. 19. 23:09
728x90

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

 

728x90
저작자표시 비영리 변경금지 (새창열림)

'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
    'Language/Java' 카테고리의 다른 글
    • [Java] NaN과 Infinity 처리
    • [Java] 정확한 계산 하는 방법
    • [Java] 오버플로우와 언더플로우
    • [Java] 부호/증감/산술 연산자
    청야에몽
    청야에몽
    개인적으로 학습을 하여 까먹지 않기 위해 올리는 블로그입니다.

    티스토리툴바