[Java] 연산자

연산자

연산자란?

연산자는 변수에 대해 다양한 작업을 수행하고 해당 값을 조작할 수 있도록 합니다. 연산자에는 부호 연산자, 증감 연산자, 산술 연산자, 비교 연산자, 논리 연산자, 대입 연산자, 삼항 연산자 등이 있습니다.

부호 연산자

부호 연산자는 단항 연산자로 변수의 부호를 유지하거나 바꿀 때 사용됩니다.

+ 연산은 잘 사용되지 않고, - 연산자는 변수값의 부호를 변경할 때 사용됩니다. 부호를 변경하는 것도 연산이므로 자동 타입 변환에 주의해야 합니다. (byte, short, int 타입의 연산 결과는 int 타입)

byte num1 = 10;
byte num2 = -num1; // 컴파일 에러

증감 연산자

증감 연산자(++, –)는 변수의 값을 1 증가시키거나 1 감소시키는 연산자입니다. 단독으로 증감 연산자를 사용할 경우에는 문제가 없지만 여러 연산자가 있을 경우 증감 연산자의 위치에 따라 결과가 달라질 수 있기 때문에 주의해야 합니다.

증감 연산자가 변수 앞에 있으면 먼저 변수를 1 증가 또는 1 감소시킨 후 다른 연산을 수행합니다. 증감 연산자가 변수 뒤에 있으면 모든 연산을 끝낸 후 변수를 1 증가 또는 1 감소시킵니다.

int num1 = 10;
int num2 = 10;
int result1 = num1++ + 10;
int result2 = ++num2 + 10;

System.out.println(num1); // 11
System.out.println(num2); // 11
System.out.println(result1); // 20
System.out.println(result2); // 21

산술 연산자

산술 연산자는 더하기(+), 빼기(-), 곱하기(*), 나누기(/), 나머지(%)가 있습니다.

int num1 = 10;
int num2 = 3;
int result1 = num1 + num2;
int result2 = num1 - num2;
int result3 = num1 * num2;
int result4 = num1 / num2;
int result5 = num1 % num2;

System.out.println(result1); // 13
System.out.println(result2); // 7
System.out.println(result3); // 30
System.out.println(result4); // 3
System.out.println(result5); // 1

산술 연산자를 정확하게 계산하고 싶다면 실수 타입을 사용하지 않는 것이 좋습니다. 실수 타입은 부동 소수점 방식을 사용하여 나타내는 데 항상 오차가 존재하기 때문입니다.

오버플로우(overflow)와 언더플로우(underflow)

오버플로우란 타입이 허용하는 최댓값을 벗어나는 것을 말합니다. 언더플로우는 타입이 허용하는 최솟값을 벗어나는 것을 말합니다. 정수 타입에서 오버플로우 또는 언더플로우가 발생되면 실행 에러가 일어나지 않고 해당 정수 타입의 최댓값 또는 최솟값으로 돌아갑니다.

byte num1 = 127;
System.out.print(++num1); // -128

비교(관계) 연산자

비교 연산자는 두 개의 피연산자 사이에서 크기(>, >=, <, <=) 및 동등(==, !=) 관계를 평가해 true 또는 false 를 산출하는 이항 연산자이다. 비교 연산자는 흐름 제어문인 조건문(if), 반복문(for, while)에서 실행 흐름을 제어할 때 주로 사용된다.

구분연산식설명
동등비교==두 개 항의 값이 같으면 true, 다르면 false를 반환합니다.
동등비교!=두 개 항의 값이 다르면 true, 같으면 false를 반환합니다.
크기비교>왼쪽 항이 크면 true, 같거나 작으면 false를 반환합니다.
크기비교>=왼쪽 항이 크거나 같으면 true, 작으면 false를 반환합니다.
크기비교<왼쪽 항이 작으면 true, 같거나 크면 false를 반환합니다.
크기비교<=왼쪽 항이 작거나 같으면 true, 크면 false를 반환합니다.

피연산자의 타입이 다를 경우에는 비교 연산을 수행하기 전에 타입을 일치시킵니다. 예를 들어 10 == 10.0 을 비교한다며 10을 double 타입인 10.0으로 변환한 다음 10.0 == 10.0 으로 비교한다.

int num1 = 10;
double num2 = 10.0;
System.out.println(num1 == num2); // true

논리 연산자

논리 연산자는 논리곱(&&), 논리합(||), 배타적 논리합(^) 그리고 논리 부정(!) 연산을 수행합니다. 논리 연산도 흐름 제어문인 조건문(if), 반복문(for, while) 등에서 주로 사용됩니다.

구분연산식설명
AND(논리곱)&&피연산자 모두가 true일 경우에만 연산 결과가 true
OR(논리합)||피연산자 중 하나만 true이면 연산 결과는 true
XOR(배타적 논리합)^피연산자가 하나는 true이고 다른 하나가 false일 경우에만 true
NOT(논리 부정)!피연산자의 논리값을 바꿉니다.

비트 논리 연산자

비트 논리 연산자는 bit 단위로 논리 연산을 수행합니다. 0과 1이 피연산자가 되므로 2진수 0과 1로 저장되는 정수 타입(byte, short, int, long)만 피연산자가 될 수 있고, 부동 소수점 방식으로 저장되는 실수 타입(float, double)은 피연산자가 될 수 없습니다.

구분연산식설명
AND(논리곱)&두 비트 모두 1일 경우에만 연산 결과가 1
OR(논리합)|두 비트 중 하나만 1이면 연산 결과는 1
XOR(배타적 논리합)^두 비트 중 하나는 1이고 다른 하나가 0일 경우 연산 결과는 1
NOT(논리 부정)~보수

비트 이동 연산자

비트 이동 연산자는 비트를 왼쪽 또는 오른쪽으로 이동시키는 연산을 수행합니다.

연산식설명
a << ba의 각 비트를 b만큼 왼쪽으로 이동
오른쪽 빈자리는 0으로 채움
a >> ba의 각 비트를 b만큼 오른쪽으로 이동
왼쪽 빈자리는 최상위 부호 비트와 같은 값으로 채움
a >>> ba의 각 비트를 b만큼 오른쪽으로 이동
왼쪽 빈자리는 0으로 채움

대입 연산자

대입 연산자는 우측 피연산자의 값을 좌측 피연산자의 변수에 대입한다.

연산식설명
=우측의 피연산자의 값을 변수에 저장
+=우측의 피연산자의 값을 변수의 값과 더한 후에 다시 변수에 저장
-=우측의 피연산자의 값을 변수의 값에서 뺀 후에 다시 변수에 저장
*=우측의 피연산자의 값을 변수의 값과 곱한 후에 다시 변수에 저장
/=우측의 피연산자의 값을 변수의 값과 나눈 후에 다시 변수에 저장
%=우측의 피연산자의 값으로 변수의 값을 나눈 후에 나머지를 변수에 저장
&=우측의 피연산자의 값과 변수의 값을 & 연산 후 결과를 변수에 저장
|=우측의 피연산자의 값과 변수의 값을 | 연산 후 결과를 변수에 저장
^=우측의 피연산자의 값과 변수의 값을 ^ 연산 후 결과를 변수에 저장

삼항 연산자

삼항 연산자는 3개의 항을 가져 삼항 연산자라고 불립니다.

삼항 연산자의 식은 (조건식(피연산자1) ? 값 OR 연산식(피연산자2) : 값 OR 연산식(피연산자3) ) 으로 되어있습니다.

조건식이 true이면 피연산자2가 선택되고, false이면 피연산자3이 선택됩니다.

int num = 10;
boolean result = num > 5 ? true : false;
System.out.println(result); // true


© 2023.06. by 고개

Powered by 고개