[JAVA] 기본형의 형변환

용용학생·2024년 3월 14일

자바

목록 보기
4/32

이번 글에서는 기본형(Primitive Type)의 형변환만 다룬다.
참조 타입의 형변환에 대해서는 다음 번에!!

형변환(Casting)

서로 다른 타입 간의 연산을 수행할 때는 타입을 일치시켜야 하는데, 변수나 리터럴의 타입을 다른 타입으로 변환하는 것을 형변환이라 한다.

  • 형변환이란, 변수 또는 상수의 타입을 다른 타입으로 변환하는 것

방법

형변환하고자 하는 변수나 리터럴의 앞에 변환하고자 하는 타입을 괄호와 함께 붙여주면 된다.

  • (타입)피연산자
double d = 85.4;
int score = (int)d; // double 타입의 변수 d를 int 타입으로 형변환

값 손실

  • 작은 타입에서 큰 타입으로의 반환, 예를 들어 byte 타입(1byte)에서 int 타입(4byte)로의 변환은 저장공간이 남기 때문에 0 혹은 1로 채워진다.

  • 그러나 반대로 큰 타입에서 작은 타입으로의 반환, int 타입에서 byte 타입으로의 변환은 저장공간의 부족으로 타입 크기의 차이만큼 잘려나간다.

  • 여기서 잘려나간 값은 의도하지 않았기 때문에 값 손실(loss of data)가 발생한다.

자동 형변환

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


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

위의 문장에서 우변은 int 타입이고 좌변의 변수는 float 타입이다. float 타입은 int 타입을 저장하는 데에 문제가 없기 때문에 자동 형변환이 가능하다.


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

그러나 위의 문장에서는 변수의 타입보다 큰 범위를 저장했기 때문에 값 손실의 문제가 생기기 때문에 자동 형변환이 불가능하다.


byte b = (byte)1000; // 명시적 형변환. 에러 X

큰 타입에서 작은 타입으로 변환을 원한다면 명시적으로 변환하고자 하는 타입을 작성해주어야 한다.

자동 형변환의 규칙

그렇다면 컴파일러는 어떤 규칙으로 타입의 형변환을 자동으로 해줄까?

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

자동 형변환은 표현범위가 좁은 타입에서 넓은 타입으로 형변환하는 경우 가능하다.

보통 자료형의 크기가 큰 것일수록 값의 표현범위가 크지만, 실수형(float, double)은 정수형(int, long)과는 값을 표현하는 방식이 다르기에 오른쪽에 위치한다.

또한 char와 short는 둘 다 2byte의 표현 범위를 가지지만
char의 범위는 0~216-1 이고 short의 범위는 -215~215-1 이므로 범위가 달라서 어느 쪽으로든 형변환 시 값 손실이 생길 수 있기 때문에 자동 형변환이 불가능하다

정리

  • boolean을 제외한 나머지 7개(char, byte, short, int, long, float, double)은 서로 형변환이 가능하다
  • 기본형과 참조형은 서로 형변환할 수 없다
  • 서로 다른 타입의 변수 간의 연산은 형변환을 하는 것이 원칙이지만,
    값의 범위가 작은 타입에서 큰 타입으로의 형변환은 생략할 수 있다
profile
자바 스프링 공부하는 정리 블로그!

0개의 댓글