1. 형변환
1.1 형변환(캐스팅, casting)
연산을 수행하기 전에 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환이라고 한다. 예를들어 int 타입의 값과 float 타입의 값을 더하는 경우 먼저 두 값을 같은 타입으로 즉, float 타입으로 변환한 다음에 더해야한다.
1.2 형변환 방법
double d = 85.4
int score = (int)d// double 타입의 변수d를 int로 형변환
예시처럼 (타입)피연산자 와 같이 변수나 리터럴 없에 변환하고자 하는 타입을 괄호에 넣어주면된다. 이때 괄호는 캐스트 연산자라고 한다.
기본형에서 boolean을 제외한 나머지 타입들은 서로 형변환이 가능하며 기본형과 참조형간의 형변환은 불가능하다.
1.3 정수형간의 형변환
int(4byte) → byte(1byte) 와 같이 큰 타입에서 작은 타입으로의 변환할때는 비트 차이 크기만큼 잘려나가므로 경우에 따라 값손실(loss if data)가 발생할 수 있다.
반대로 int(4byte) → byte(1byte)와 같이 작은 타입에서 큰 타입으로의 변환에서는 저장공간의 부족으로 잘려나가는 일이 없어서 값손실이 발생하지 않으며 빈공간은 0이나 1로 채워진다. 보통 0으로 채워지지만 변환하려는 값이 음수인경우에는 빈 공간을 1로 채운다. 그 이유
는 형변환 후에도 부호를 유지할 수 있도록하기 위해서이다.
1.4 자동 형변환
서로 다른 타입으로 연산을 할때 형변환으로 타입을 일치시키는 것이 원칙이지만 형변환을 생략할 수 있다. 이는 형변환이 이루어지지않는 것은 아니고 컴파일러가 생략된 형변환을 자동적으로 추가한다. 이를 묵시적 형변환이라고한다.
float f = 1234; //(flost)1234 인데 형변환 생략
1234는 int 타입의 상수이고, 변수타입은 float이므로 서로 타입이 형변환이 필요하지만 생략되었다.
byte b = 1000; //byte의 범위 (-128 ~ 127)d을 넘어서 에러
byte b = (byte) 1000; //에러 - 묵시적 형변환
위처럼 큰 타입에서 작은 타입으로의 형변환은 값 손실이 발생할 수 있어서 에러가 뜬다. incompatible types: possible lossy conversion from int to byte
그러나 두번째와 같이 명시적으로 형변환 해줬을 경우 프로그래머의 실수가 아닌 의도로 간주하고 큰 데이터에서 작은 데이터 크기로 맞춰주는 것을 명시적 형변환이라고한다.
자동 형변환의 규칙
컴파일러는 자동형변환을 할때 기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다. 따라서 표현범위가 좁은 타입에서 넓은 타입으로 형변환할 경우 값 손실이 없으므로 두 타입중에서 표현범위가 더 넓은 쪽으로 형변환된다.
왼쪽에서 오른쪽으로 변환은 형변환 연산자를 사용하지 않아도 형변환이 가능하며, 반대방향으로는 반드시 형변환 연산자를 사용해야한다.
보통 자료형의 크기가 클수록 값의 표현범위가 크지만 실수형은 정수형과 값을 표현하는 방식이 다르고 같은 크기일지라도 훨씬 더 큰 표현범위를 갖기 때문에 float , double이 같은 크기인 int와 long 보다도 더 오른쪽에 위치한다.
또한 char과 short 둘다 2byte지만 char은 0 ~2^16 -1(0 ~ 65535), short는 -2^15 ~ 2^15 -1(-32768 ~ 32767)이므로 어느 쪽으로도 값 손실이 발생할 수 있어서 자동형변환이 수행될 수 없다.
출처 : 자바의 정석
'Java' 카테고리의 다른 글
[JAVA] == 와 equals()의 차이 (1) | 2024.01.05 |
---|---|
[JAVA] 객체지향 프로그래밍 - 클래스와 객체 (0) | 2023.12.19 |
[JAVA] 기본형 변수(primitive type) (0) | 2023.12.15 |
[JAVA] 진법과 2의 보수법 (1) | 2023.12.07 |
[JAVA] 변수와 변수의 타입 (1) | 2023.12.07 |