# 연산자 우선순위에 대해서는 아래 링크에서 확인바랍니다.
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
'Lang > Java' 카테고리의 다른 글
[Java] 연산자 우선순위의 이해 (0) | 2022.11.28 |
---|---|
[Java] Java 입력 클래스 Scanner (0) | 2022.11.23 |
[Java] Java 출력 함수 printf() (0) | 2022.11.22 |
[Java] Java 변수 접두사 접미사 메모리사이즈 (0) | 2022.11.22 |