본문 바로가기

Lang/Java

[Java] 연산자에 대한 이해

728x90

 

# 연산자 우선순위에 대해서는 아래 링크에서 확인바랍니다.

2022.11.28 - [Lang/Java] - [Java] 연산자 우선순위의 이해

 

[Java] 연산자 우선순위의 이해

# 연산자 (operator) 의 종류 구분 종류 우선순위 결합규칙 단항 연산자 ++ -- + - ~ ! (type) 높음 산술 연산자 * / % + - 비교 연산자 = instanceof == != 논리 연산자 & ^ | && || 삼항 연산자 ?: 대입 연산자 = += -=

siku314.tistory.com

 

 

# 증감 연산자

++ : 증가연산자. 피연산자를 1 증가시킨다.

-- : 감소연산자. 피연산자를 1 감소시킨다.

int x = 0;
int y = ++x;	// 피연산자 x에 1이 증가하여 y에도 1이 대입됩니다.

 

++x, --x : 전위 연산자 혹은 전치 연산자. x에 1을 증가시킨 후에 그 줄의 연산을 실행한다.

x++, x-- : 후위 연산자 혹은 후치 연산자. 그 줄의 연산을 먼저 실행한 후 x에 1을 증가시킨다.

int x = 0;

// x에 1을 더한 후 현재 줄의 연산 (대입)을 실행한다.
// 그래서 x는 1, y도 1.
int y = ++x; 

// 그 줄의 연산 (대입)을 먼저 실행 한 후 x에 1을 더한다.
// z는 1, 그 후 x는 2로 증가.
int z = x++;

 

# 부호 연산자

+ : 기능 없고 사용하지 않습니다.

- : 피연산자의 부호를 반대로 변경합니다.

int x = 3;
x = +x;	// 그대로 x = 3
x = -x; // 부호가 반대로 바뀌어서 x = -3
x = -x; // 부호가 반대로 바뀌어서 x = 3
여기서  +는 단항연산자이기에 부호연산자가 됩니다.
1+x 처럼 다항연산자가 되면 부호연산자가 아닌 산술연산자가 되어 1과 x의 값을 더하는 역할을 하게됩니다.

 

# 형 변환 연산자

변수 혹은 상수의 타입을 다른 타입으로 바꾸는 연산자

 

범위가 작은 데이터 타입에서 범위가 큰 데이터타입으로는 자동 형변환이 이루어집니다.

byte(1byte) < short(2byte) < int(4byte) < long(8byte) < float(4byte) < double(8byte)

 

8byte인 long보다 4바이트인 float이 메모리사이즈는 작지만

long은 정수형, float은 실수형이기 때문에 표현할 수 있는 수의 범위가 더 큽니다.

long은 10의 19승가량, float은 10의 38승가량 표현가능합니다.

 

char(2byte) < int(4byte)

char형은 int형으로만 자동형변환이 가능합니다.

 

 

double d = 3.14;
int i = (int)d;		// 소숫점 이하를 잘립니다. i=3

// 작은 데이터 타입에서 큰 데이터 타입으로의 형 변환
char c = (char)65;	// 'A'
int i = (int)'A';	// 65
int i2 = 3.14f;		// 3
float f = 30;		// 30.0f

// 수동(강제)형변환
byte b = 200;	// 에러
byte b = (byte)200;	// 수동 강제 형변환. 하지만 오버플로우로 인해 값은 -56이 대입됩니다.

 

# 사칙 연산자

int형끼리 나누기를 하면 값이 int형으로 리턴됩니다.

int / int = int    // 소수점 이하 버려집니다.

int i = 3/2;    // i=1

 

따라서 소수점이하 값까지 안전하게 리턴하려면 둘 중 하나 혹은 둘 모두 float 형으로 변환해야 합니다.

int  / float => float 값 리턴

float / int => float 값 리턴

float / float => float 값 리턴

 

이 것은 산술변환에 의해 나타나는 현상입니다.

 

산술연산자는 산술변환을 통해 두 개의 타입이 서로 다를 경우 더 큰 타입으로 자동변환합니다.

int + long => long + long

float + int => float + float

double + float => double + double

좌측처럼 입력하면 우측처럼 자동 변환되어 연산됩니다.

 

int보다 작을 때는 int로 변환됩니다.

byte+short => int + int

char + short => int + int

byte a=3;
byte b=4;

// byte c = a+b;	// 에러

// byte + byte 계산은 int + int가 되기때문에 a+b를 묶어주고
// 다시 byte타입으로 수동형변환을 해줘야
// 정상적으로 컴파일됩니다.
byte c = (byte)(a+b);

 

byte, short, char 타입들은 산술연산을 하기에 너무 작아서 그렇습니다.

간단한 계산인 300 * 300 = 90,000 을 해도 short의 범위인 65536을 벗어나게 됩니다.

그래서 산술연산은 기본적으로 int형으로 연산하게 됩니다.

 

# 반올림

Math.round()    // 실수를 소수점 첫 째자리에서 반올림한 정수를 리턴합니다.

double pi = 3.141592;

// Math.round()를 그대로 사용한 경우
System.out.println((double)Math.round(pi));

// 소수점 넷 째자리에서 반올림한다면
// 3.141592 * 1000 = 3141.592
// 소수점 첫째자리에서 반올림 3142
// 3142 / 1000 = 3.142
System.out.println((double)Math.round(pi*1000)/1000);

// 소숫점 넷 째자리에서 버리기
// 3.141592 * 1000 = 3141.592
// int형 변환으로 소수점 이하 버리기 3141
// 3141 / 1000 = 3.141
System.out.println((int)(pi*1000)/1000.0);
3.0
3.142
3.141

 

# 나머지 연산자

% : 왼쪽 피연산자를 오른쪽 피연산자로 나눈 나머지를 리턴합니다.

System.out.println(10 / 6);	// 10 나누기 6의 몫
System.out.println(10 % 6);	// 10 나누기 6의 나머지
1
4

 

 

 

728x90