새소식

반응형
250x250
🔠 Computer language/☕ Java

[Java] 형 변환(데이터 타입 변환)

  • -
728x90
반응형
형 변환


형 변환 정의, 종류



형 변환이란 데이터 타입을 다른 데이터 타입으로 변환하는 것이다.

형 변환이 자동으로 이루어지면 자동 타입 변환(promotion),

강제적으로 이루어지면 강제 타입 변환(casting)이라고 한다.

 

 

 

형 변환 - 자동 타입 변환


자동 타입 변환

 

 

자동 타입 변환은 작은 크기 타입이 큰 크기를 가지는 타입에 저장될 때,

혹은 작은 크기 타입과 큰 크기 타입 간의 연산이 이루어질 때 발생한다.

여기서 타입의 크기를 구분하는 기준은 메모리 크기다.

byte<short<int<long<float<double 순으로 커진다.

이때 실수형 타입의 표현 범위가 정수형보다 넓으므로 실수형이 정수형보다 크다고 간주한다.

작은 크기의 타입에서 큰 크기의 타입으로 변환이 이루어지므로 변환 후의 값은 변환 전과 동일하다.

 

 

 

자동 타입 변환 예시 - 저장


byte->int 자동 변환

10이라는 값을 가진 byte 타입 변수 a를 선언한 후,

int 타입 변수 b에 byte 타입인 a를 저장하고 출력하면,

byte->int 자동 타입 변환이 이루어져 정상 출력이 된다.

 

 

int->double 자동 변환

200이라는 값을 가진 int 타입 변수 c를 선언한 후,

double 타입 변수 d에 int 타입인 c를 저장하고 출력하면,

int->double 자동 타입 변환이 이루어져 정상 출력된다.

이때 정수형->실수형 변환이 이루어지면 .0이 붙는 것을 알 수 있다.

 

 

char->int 자동 변환

'김'이라는 값을 가진 char 타입 변수 e를 선언한 후,

int 타입 변수 f에 char 타입인 e를 저장하고 출력하면,

char->int 자동 타입 변환이 이루어져 정상 출력된다.

이때 문자형->정수형 변환이 이루어지면 문자가 해당 문자의 유니코드 정수로 출력됨을 알 수 있다.

 

 

예외) char->byte 타입

자동 타입 변환에서 하나의 예외가 있는데, 바로 char->byte 타입의 변환이다.

위 예시를 보면 1이라는 값을 가진 byte 타입 변수 one을 선언한 후,

char 타입 변수 two에 byte 타입 변수 one의 값을 저장했다.

그리고 char 타입 변수 two를 출력해 보면 에러가 난다.

에러가 발생하는 이유는 byte 타입은 음수를 저장할 수 있지만,

char 타입의 범위에는 음수가 없기 때문이다.

따라서 char->byte 형변환을 하려면 강제 변환시켜 줘야 한다.

 

 

 

자동 타입 변환 예시 - 연산

 

int + double 자동 변환

큰 크기 타입과 작은 크기 타입 간 연산을 할 때도 자동 변환이 이루어지는데,

연산 과정에서 작은 크기 타입이 자동으로 큰 크기 타입으로 변환되고,

연산 결과가 자동으로 큰 크기 타입에 맞춰 출력된다.

위 예시를 보면 int 타입 변수 test4에 40을 저장하고,

double 타입 변수 test5에 1.5를 저장한 후 두 변수를 더해 출력했다.

그러면 int 타입이 double 타입으로 자동 변환 후 연산이 수행되어 출력값이 41.5가 나온다.

 

char + int 자동 변환

char 타입 변수 test6에 'b'라는 값을 저장하고,

int 타입 변수 result에는 char 타입 변수 test6('b')에 1을 더한 값을 저장했다.

그러면 char 타입이 int 타입으로 자동 변환 후 연산이 수행되어,

result 변수값을 출력하면 'b'의 유니코드 정수에 1을 더한 값인 99가 정상 출력된다.

만약 출력값을 다시 문자로 확인하고 싶을 경우, int->char 강제 형변환을 실시하면 된다.

 

 

형 변환 - 강제 타입 변환

강제 타입 변환이란

 

강제 타입 변환은  크기 타입이 작은 크기를 가지는 타입에 저장될 때 발생한다.

이때 큰 데이터 타입을 쪼개어 작은 데이터 타입의 크기에 맞게 변환하므로,

변환 후의 값은 변환 전과 동일할 수도 있고 동일하지 않을 수도 있다.

 

 

 

동일할 경우

 

변환 이전과 변환 이후의 값이 동일한 경우는

큰 크기 타입의 값이 작은 크기 타입의 표현 범위 내인 경우다.

예를 들어 int 타입 변수의 값이 byte 타입의 표현 범위인 -128~127 내라면 동일하게 출력된다.

 

 

 

동일하지 않은 경우

 

변환 이전과 변환 이후의 값이 다른 경우는

큰 크기 타입의 값이 작은 크기 타입의 표현 범위에서 벗어난 경우다.

예를 들어 int 타입 변수의 값이 byte 타입의 표현 범위인 -128~127을 벗어났다면 다르게 출력된다.

이 경우를 값의 손실이라고 한다.

마찬가지로 int 타입 변수의 값이 float 타입의 표현 범위를 벗어날 경우,

값이 근사치로 변환되어 다르게 출력된다.

이 경우를 정밀도 손실이라고 한다.

정밀도 손실을 해결하는 방법은 정수형을 실수형 타입으로 변환할 때 double 타입을 사용하는 것이다.

 

 

 

강제 타입 변환 예시

int->char 강제 변환

위 예시를 보면 int 타입 변수 test1에 'a'라는 값을 저장하고,

char 타입 변수 test2에 int 타입 값을 저장하되 값을 char 타입으로 강제 형변환한다 명시하였다.

즉, test1에 저장된 'a'의 유니코드 정수를 문자로 강제 변환시킨 것이다.

그 후 char 타입 test2 변수를 출력하면 값이 a가 나와 형변환이 되었음을 알 수 있다.

 

 

double->int 강제 변환

double 타입 변수 t에 3.14라는 값을 저장하고,

int 타입 변수 test3에 double 타입 값을 저장하되 int 타입으로 강제 형변환한다 명시하였다.

출력해보면 3이 나와 실수형 타입 값이 정수형으로 변환되었음을 알 수 있다.

이때 실수형->정수형으로 강제 형변환할 경우 소수점 부분은 버려지고 정수 부분만 저장됨도 알 수 있다.

 

 

int->byte 강제 변환시 값이 동일

int 타입 변수 c에 10이라는 값을 저장하고,

byte 타입 변수 a에 int 타입 값 c를 저장하되 byte 타입으로 강제 형변환한다 명시하였다.

이때 10이라는 값은 byte 타입의 표현 범위 내이므로,

int->byte 강제 형변환해도 10이라는 값이 동일하게 출력된 걸 볼 수 있다.

 

 

int->byte 강제 변환 시 값이 다름

int 타입 변수 c에 200이라는 값을 저장하고,

byte 타입 변수 a에 int 타입 값 c를 저장하되 byte 타입으로 강제 형변환한다 명시하였다.

이때 200이라는 값은 byte 타입의 표현 범위를 벗어났으므로,

int->byte 강제 형변환 시 출력값이 -56으로 다르게 출력된 걸 볼 수 있다.

이때 -56이라는 값이 나온 이유는, 자바는 결과가 데이터 타입의 표현 범위를 벗어났을 때

해당 데이터 타입의 최솟값부터 다시 세 출력하기 때문이다.

따라서 -56은 byte 표현 범위의 최솟값인 -128부터 다시 세 출력된 결과다.

 

 

 

 

참고 도서 : 이것이 자바다(신용권 저)

728x90
반응형

'🔠 Computer language > ☕ Java' 카테고리의 다른 글

[Java] 조건문 - switch문  (0) 2023.11.05
[Java] 조건문 - if문 / if-else(if)문 / 중첩 if문  (0) 2023.10.29
[Java] 연산자  (0) 2023.09.25
[Java] 자료형(데이터 타입)  (0) 2023.09.23
[Java] 변수  (0) 2023.09.21
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.