주인장의 프로그래밍 개발 공부방

[Chapter 1 변수] 6. 형변환(Type Casting) 본문

프로그래밍 기본 지식/Chapter 1 변수

[Chapter 1 변수] 6. 형변환(Type Casting)

거신 2019. 5. 11. 22:13

변수에 대한 내용이 거의 막바지로 향하고 있다.

여기까지 진행한다면 기본형 변수에 대해서는 어느 정도는 개념이 잡힐 것이라고 생각한다.

 

이번 시간에는 형변환(Type Casting)이라는 것에 대해서 알아보자.

 

목표 : 형변환(Type Casting)이 무엇인지 알고 사용하는 방법을 알 수 있다.

 

1. 형변환(Type Casting)

 

먼저 형변환(Type Casting)의 정의를 알아보자.

형변환이란 무엇일까?

 

단어의 뜻 그 자체로 풀어보자면 형태(Type)를 변환시킨다는 뜻이 되겠다.

우리가 변수를 배우면서 알고 있는 형태, 타입이라면

역시 변수의 타입을 말하는 것이겠지.

 

그렇다면 변수의 타입을 변환시킨다는 것은 뭘 의미하는 것이며 왜 있는 것일까?

우리가 배우고 있는 프로그래밍에서 말하는 형변환은

값을 타입을 다른 타입으로 변환하는 것이다.

여기에서 기본형 변수의 타입은 모두 서로 형변환이 가능하지만

논리형인 boolean은 제외한다.

(boolean은 결과 값이 true, false 밖에 없는 애초에 다른 값으로 변환이 된다는게 말이 안되잖아)

 

간단히 예시를 들어보자.

 

char c = 'A'

int i = 10;

 

우리가 지금까지 지겹도록 본 변수 선언 코드이다.

여기서 문자형인 char와 정수형인 int를 예시로 들었는데

변수 c에는 문자 A가 들어가 있을 것이고

변수 i에는 10이라는 10진수가 들어있을 것이다.

이건 이제 너무나도 잘 알고 있을 것이다.

그런데 여기서

변수 i에 10이 아니라

 

int i = c;

 

라고 적으면 어떻게 될까?

상식적으로 생각했을 때 i는 정수형, 다시 말해 숫자가 들어가야하는데

A라는 문자가 들어간다는게 말이 되질 않는다.

이 코드는 분명히 에러가 발생할 거라고 생각할 것이다.

아니 생각해야한다.

그래야 이 글을 읽은 의미가 있지.

만약 아니다. 맞다. 문제없다.라고 생각한다면 이 글을 읽을 필요가 없다.

아는데 뭣하러 시간낭비하면서 이 글을 읽고 있나.

그 시간에 다른 더 어려운 공부를 해야지.

 

정답부터 말하자면 에러도 나지 않고 틀린 부분도 없다.

작성자가 미친 놈인가?하는 생각도 들겠지만

이 코드에서 전혀 문제가 발생하지 않는 이유가 바로 형변환이라는 녀석이 있기 때문이다.

위의 코드를 실행하면

변수 i에는 65라는 숫자가 저장된다.

왜 65냐면 알파벳 대문자 A를 숫자로 변환한 아스키 코드(ASCII Code)가 바로 65이기 때문이다

(아스키 코드는 인터넷에 검색해서 확인해 보자.)

문자인 A를 숫자 65로 자동으로 변환해주는 것,

다른 타입으로 변환하는 것을 바로 형변환이라고 하는 것이다.

 

2. 강제 형변환

 

형변환은 기본적으로 자동으로 해당 타입을 다른 타입으로 변환을 시켜주지만

여기에는 조건이 따라온다.

바로 타입의 크기와 표현 범위에 영향을 받는다는 것이다.

기본적으로 형변환, 그러니까 자동 형변환이 되는 경우는

 

byte -> short -> char -> int -> long -> float -> double

 

순서로 왼쪽의 타입에서 오른쪽의 타입으로 변경된다면 자동으로 형변환이 가능하다.

우리들이 굳이 형변환을 하라고 말하지 않아도 말이다.

앞서 변수 타입들의 특징에 대해서 배웠었는데

잘 보면 순서의 특징이 보일 것이다.

바로 변수 타입의 크기 순이라는게 눈에 보일 것이다.

 

그런데 long타입8bytefloat타입4byte인데 이거 잘못 쓴거 아니냐고 묻겠지만

여기에서 방금 말한 표현 범위가 영향을 끼치게 된다.

long타입8byte의 크기를 가지고 있지만 정수만 표현이 가능하다.

하지만 float타입4byte의 크기를 가지지만 실수까지 표현할 수 있기 때문에

long타입보다 float타입이 표현할 수 있는 표현 범위가 훨씬 넓은 셈이 되는 것이다.

대신 float타입은 long타입보다 크기가 작기 때문에

저 순서대로 형변환이 발생한다면 데이터의 손실이 발생할 수도 있다.

 

우리가 변수를 선언할 때 이 순서를 지켜서 코드를 작성한다면 컴퓨터가 알아서

자동 형변환을 시켜주기 때문에 특별히 뭔가를 하지 않아도 되지만

여기에서 반대상황이 발생한다면 얘기가 달라진다.

 

double -> float -> long -> int -> char -> short -> byte

 

순서로 거꾸로 형변환이 발생한다면 어떻게 될까?

일단 기본적으로 큰 쪽에서 작은 쪽으로 가는 것이기 때문에 데이터 손실이 무지하게 일어날 것이다.

물론 바뀌는 타입보다 작은 값이 들어간다면 손실이 일어나지 않지만

기본적으로 크기를 넘어서면 데이터 손실이 발생하게 된다.

이 것을 우리는 오버플로우(Overflow)현상이라고 말하는데 이 내용은 다음에 자세하게 알아보자.

 

다시 돌아와서

이 경우에는 일단 형변환이 가능하지만 우리들이 형변환을 하라고 명령을 내려줘야 한다.

이 것이 바로 강제 형변환인 것이다.

 

3. 강제 형변환 방법

 

그렇다면 강제 형변환을 하는 방법에 대해서 알아보자.

다시 코드를 작성해보자.

 

int i = 10;

byte b = i;

 

이렇게 작성하면 오류를 출력해줄 것이다.

이유는 형변환을 해주지 않았기 때문이다.

형변환을 하는 방법은 변환할 값(또는 변수) 앞에 변환될 타입을 적어주면 된다.

위 코드를 강제 형변환해서 고쳐쓰면

 

int i = 10;

byte b = (byte)i;

 

처럼 i앞에 변환할 타입 (byte)를 붙여주면 된다.

이렇게 적어서 형변환을 하는 것을 강제 형변환 또는 명시적 형변환이라고 한다.

 

여기까지가 형변환에 대한 설명이었다.

다시 한 번 복기하자면 형변환은 자동으로 타입을 변환시켜주기는 하지만

데이터의 손실이 발생할 수도 있으니 그 부분을 항상 생각하는 것이 좋다.

Comments