[Java의 정석] 자동 형변환

말하는 감자·2023년 11월 5일
0

Java의 정석

목록 보기
22/32
post-thumbnail

Chapter 02 변수(Varialbe)

5. 형변환

📌 자동 형변환

서로 다른 타입간의 대입이나 연산을 할 때, 형변환으로 타입을 일치시키는 것이 원칙이다. 하지만, 경우에 따라 편의상의 이유로 형변환을 생략할 수 있다.
그렇다고 해서 형변환이 이루어지지 않는 것이 아니고, 컴파일러가 생략된 형변환을 자동적으로 추가한다.

float f = 1234; // 형변환의 생략. float f = (float)1234;와 같음.

우변은 int타입의 상수이고, 이 값을 저장하려는 변수의 타입은 float이다.
서로 타입이 달라서 형변환이 필요하지만 편의상 생략하였다. float타입의 변수는 1234라는 값을 저장하는데 아무런 문제가 없기 때문이다.
그러나 변수가 저장할 수 있는 값의 범위보다 더 큰 값을 저장하려는 경우에 형변환을 생략하면 에러가 발생한다.

byte b = 1000; // 에러. byte의 범위(-128~127)를 넘는 값을 저장.

에러 메시지는 'incompatible types: possible lossy conversion from int to byte'인데, 큰 타입에서 작은 타입으로의 형변환으 값 손실이 발생할 수 있다는 뜻이다.
다음과 같이 명시적으로 형변환 해줬을 경우, 형변환이 프로그래머의 실수가 아닌 의도적인 것으로 간주하고 컴파일러는 에러를 발생시키지 않는다.

char ch = (char)1000; // 명시적 형변환. 에러가 발생하지 않는다.

계산식에서 자주 형변환이 생략되는데, 서로 다른 두 타입의 연산에서는 먼저 타입을 일치시킨 다음에 연산을 수행해야 하므로, 연산과저에서 형변환이 자동적으로 이루어진다.

int i = 3;
double d = 1.0 + i; // double d = 1.0 + (double)i;에서 형변환이 생략됨

서로 다른 두 타입간의 덧셈에서는 두 타입 중 표현범위가 더 넓은 타입으로 형변환하여 타입을 일치시킨 다음에 연산을 수행한다. 그렇게 하는 것이 값손실의 위험이 더 적어서 올바른 결과를 얻을 확률이 높기 때문이다.

double d = 1.0 + i;
➡️ double d = 1.0 + (double)i;
➡️ double d = 1.0 + (double)3;	// 3을 double타입으로 형벼환 하면 3.0이 된다.
➡️ double d = 1.0 + 3.0 		// double과 double의 덧셈결과 타입은 double.
➡️ double d = 4.0				// double + double = double

이처럼 연산과정에서 자동적으로 발생하는 형변환을 '산술 변환'이라고 한다.

📍 자동 형변환의 규칙

컴파일러는 어떤 판단 기준으로 타입을 일치시킬까?

기존의 값을 최대한 보존할 수 있는 타입으로 자동 형변환한다.

표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우에는 값 손실이 없으므로 두 타입 중에서 표현범위가 더 넓은 쪽으로 형변환된다.

형변환이 가능한 7개의 기본형을 왼쪽부터 오른쪽으로 표현할 수 있는 값의 범위가 작은 것부터 큰 것의 순서로 나열한 것이다.
화살표 방향으로의 변환, 즉 왼쪽에서 오른쪽으로의 변환은 형변환 연산자를 사용하지 않아도 자동 형변환이 되며, 그 반대 방향으로의 변환은 반드시 형변환 연산자를 써줘야 한다.
보통 자료형의 크기가 큰 것일수록 값의 표현범위가 크기 마련이지만, 실수형은 정수형과 값을 표현하는 방식이 다르기 때문에 같은 크기일지라도 실수형이 정수형보다 훨씬 더 큰 표현 범위를 갖기 때문에 floatdouble이 같은 크기인 intlong보다 오른쪽에 위차한다.
참고로 정수형을 실수형으로 형변환하는 경우, 정밀도의 한계로 인한 오차가 발생할 수 있다.

charshort은 둘 다 2 byte의 크기로 크기가 같지만, 서로 범위가 달라서 둘 중 어느쪽으로의 형변환도 값 손실이 발생할 수 있으므로 자동 형변환이 수행될 수 없다.

  1. boolean을 제외한 나머지 7개의 기본형은 서로 형변환이 가능하다.
  2. 기본형과 참조형은 서로 형변환할 수 없다.
  3. 서로 다른 타입의 변수간의 연산은 형변환을 하는 것이 원칙이지만, 값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다.

📑 원본 자료

  • Java의 정석(3판) [남궁 성/도우출판/2016]
profile
나는 말하는 감자다

0개의 댓글