Java

[Java]형변환(TypeCasting)

MoZZANG 2022. 2. 24. 19:00

앞선 포스팅인 '변수의 자료형'에서 알아보았던 형변환에 대한 개념을 다시 한번 정리해보자.

 

형변환(TypeCasting)이란?

 : Data type(자료형)의 크기는 각각 다르기 때문에 서로 다른 data type끼리의 값의 이동 시 data type의 크기 또는 종류를 맞춰주기 위해 하는 행위이다.

 

그릇으로 비유해서 이해해보자. 

 

국 그릇과 밥 그릇이 있다. 국 그릇의 크기가 밥 그릇보다 크다. 밥 그릇안에 물을 가득 담아서 국 그릇으로 부어서 옮기면 내용물이 넘치지 않고 잘 담기게 된다. 하지만 국 그릇에 물을 가득 담아서 밥 그릇에 부어버리면 그릇크기의 차이만큼 물이 흘러 넘칠 것이다. 여기서 그릇이 자료형(Data Type)이고 물이 Data라고 생각하면 된다.

 

작은 그릇의 데이터를 큰 그릇에 넣을 때의 형변환은 우리가 하지 않아도 '자동 형변환'이 일어난다.

 

하지만 큰 그릇의 데이터를 작은 그릇에 담을 때는 데이터 손실이 올 수 있기때문에 Java에서는 해주지 않기 때문에 우리가 '강제적 형변환'을 해줘야 한다.

 

 

 

자, 예시를 보면서 이해해보자.

 

<자동 형변환>

▲ 10행에서 대입 연산자를 통해서 b1을 s1에 담을려고 한다. 이때 b1은 1byte의 그릇이고 short는 2byte의 그릇이므로      작은 그릇의 데이터를 큰 그릇에 넣을 때의 '자동 형변환'이 일어나게 된다.

 

▲ s1은 2byte인 short형, b1은 1byte인 byte형이고 '변수의 자료형' 포스팅에서 봤던 원칙2번에 해당하여 

   s1+b1은 4byte크기의 그릇인 int형이 된다. 즉, 같은 크기의 그릇끼리 데이터를 옮길때는 '자동형변환'이 아니다.

 

 

 

 

<강제적 형변환>

 

강제적 형변환에는 '데이터 손실이 일어나지 않는 경우''데이터 손실이 일어나는 경우'의 두 가지 경우가 있을 것이다.

 

각각을 예시를 보면서 알아보자.

 

--데이터 손실이 일어나지 않는 경우

 

출력값은 100

▲ s2에 100의 값을 담았다. 그리고 그것을 byte형 그릇에 담기위해 13행에서 s2앞에 (byte)라는 것을 붙여 주었다.

여기서 변수앞에 강제적 형변환을 위해 붙여주는 '(byte)'를 '캐스팅 연산자'라고 한다.

1byte에는 최대 127의 코드값을 담을 수 있기 때문에 큰 그릇인 short형(s2)에서 작은 그릇인 byte형으로 붓더라도 100이라는 값은 넘치지 않는다. 즉, 데이터 손실이 일어나지 않는다는 것이다.

 

 

 

--데이터 손실이 일어나는 경우

 

 

▲ 300이라는 값이 담긴 int형 변수 num3를 13행에서 byte형 그릇에 담으려고 캐스팅 연산자를 이용해서 강제적 변환 해주었다. 하.지.만. num3에는 300이라는 값은 byte라는 그릇이 담을 수 있는 최대크기인 127을 초과하기 때문에 결과적으로 데이터 손실(넘쳐 흐른다)이 일어나게 된다.

때문에 분명 300을 b2에 넣었는데 결과값은 44가 출력되게 되는 것 즉, 데이터 손실이 일어나버린 것이다.

 

 

 

이처럼 데이터가 넘쳐흐르는 경우에는 강제적 형변환을 하더라도 손실을 막을 수 없다는 것을 염두해두자.

 

넘쳐흐르지 않는 경우에는 그릇의 종류를 바꾸는 일(=캐스팅 연산자 사용)같은 방법들을 이용해서 해결할 수 있을 것이다. 아래의 해결 예제들을 보자.

 

▲ 위 예제에 제시된 3가지 방법을 이용해서 해결 할 수 있을 것이다.

 

 

 

 

 

 

'Java' 카테고리의 다른 글

[Java]Format String  (0) 2022.02.24
[Java]Escape문자  (0) 2022.02.24
[Java]상수(Constant)  (0) 2022.02.24
[Java]변수의 자료형 (part.2 실수형)  (0) 2022.02.23
[Java]변수의 자료형 (part.1 정수형)  (0) 2022.02.23