본문 바로가기

자바의 정석 정리

자바의 정석 - 3.3 사칙 연산자

3.3.1 덧셈

a+b

3.3.2 뺄셈

a-b

3.3.3 곱셈

a*b

3.3.4 나눗셈

  • 나머지가 있으면 버림
a/b

3.3.5 연산 형변환

  • 연산 결과를 int보다 작은 자료형에 넣을 때 발생되는 에러
byte a = 10;
byte b = 20;
byte c = a + b; //Error! 연산시 a,b는 int로 변환되기 때문에 int보다 작은 byte로 저장하면 안됨
byte d = (byte) a + b; //d=30
  • 자료형보다 큰 값을 넣을때 발생하는 값 손실1
byte a = 10;
byte b = 30;
byte c = (byte)(a*b); //c = 44
/*
byte는 8bit이므로 최대 127까지 저장할 수 있는데, a*b의 결과가 300이므로 값이 손실됨
9번째 bit부터 제거 
*/
  • 자료형보다 큰 값을 넣을때 발생하는 값 에러1
int a = 1_000_000;
int b = 2_000_000;
long c = a * b; //c= -1,454,759,936
/*
a*b의 결과는 int이므로 연산후 long에 넣는다 해도 int의 결과로 쓰레기 값이 들어감
a와 b 둘중 하나라도 long으로 바꾸면 해결
*/
  • 자료형보다 큰 값을 넣을때 발생하는 값 에러2
long a = 1_000_000 * 1_000_000; //a= -727379968
long b = 1_000_000 * 1_000_000L; //b= 1,000,000,000,000
/*
a의 경우 int*int = int이기 때문에 long에 대입을 한다 하더라도 쓰레기 값이 들어감
b의 경우 int*long=long이기 때문에 정상 연산 결과가 대입됨
*/

-연산 순서에 따른 허용범위 초과 에러

int a = 1_000_000;

int result1 = a * a / a; //result1 = -727
int result2 = a / a * a; //result2 = 1,000,000
/*
result1의 a*a에서 int의 허용 범위를 넘어버리기 때문에 에러
result2에서 a/a먼저 하므로 int의 허용 범위를 초과하지 않음
*/

3.3.6 문자 연산

  • 문자 + 숫자
char c1 = 'a'
char c2 = (char)(c1 + 1) //c2 = 'b'
char c3 = c1 + 1 //Error! char + int = int이기 때문에 c3를 int로 바꿔야 한다.
char c4 = (char)('a' + 1) //ch4= 'b' 리터럴 + 리터럴은 가능
  • 소문자 → 대문자
char low = 'a';
char upper = (char)(low -32); //upper = 'A'
/*
ASCII에서 'a'와 'A'의 위치 차이가 32이기 때문에 32를 빼면 대문자로 변환가능
반대로, 'A'에서 32를 더하면 'a'로 변환 가능
*/

3.3.7 반올림

double pi = 3.141592;
double shortPi1 = (int)(pi * 1000 + 0.5) / 1000.0; //shortPi1 = 3.141f 
double shortPi2 = Math.round(pi * 1000) / 1000.0;
/*
나눗셈을 하면 소숫점 이하는 버림이 되므로 0.5를 더하면 반올림이 되게 할 수 있다.
shortPi1의 결과가 float인 이유는 int / float = float이기 때문이다.
*/

3.3.8 나머지 연산자

int x = 10;
int y = 8;
int r = x % y //r = 2

3.3.9 복합 대입 연산자(op=)

int i = 0;
int j = 0;

i += 3; //i = 3
i *= 10 + 5; // i = i *(10+5)