프로그래밍 언어/자바

자바 5. 형변환

닉네임못짓는사람 2020. 8. 7. 12:01
반응형

이번 글에선 지금까지 몇 번 언급했던 형변환이 뭔지 알아봅시다.

 

형변환이란?


우리는 지금까지 변수와 상수에는 여러 가지 자료형을 지정해주어야 한다는걸 알았습니다.

우리는 앞으로 이런 변수들을 사용해서 여러가지 계산들을 수행해야 할 것입니다.

 

그런데, 자바에서는 서로 같은 타입의 피연산자들로만 계산이 가능합니다.

따라서 피연사자들의 자료형을 서로 같은 타입으로 바꾸어주어야 하는데, 이를 형변환이라고 합니다.

예를 들어 int형 변수와 float형 변수간 연산을 수행하려면,

두 변수를 int형이나 float형으로 통일시켜줘야 한다는 겁니다.

 

형변환은 기본형과 참조형 모두 가능하지만, 기본형은 기본형으로, 참조형은 참조형으로만 가능합니다.

형변환 방법은 매우 간단한데, 변수의 앞에 변환하고자 하는 자료형만 적어주시면 됩니다.

public class example{
    public static void main(String[] args){
        int in = 10;
        System.out.print((float)in);
    }
}

이처럼 int형 변수 int을 float으로 형변환해서 출력하니 값이 10.0이 출력된 것을 볼 수 있습니다.

이때 사용하는 괄호는 '캐스트 연산자'또는 '형변환 연산자'라고 하며, 형변환을 캐스팅이라고도 합니다.

여기서 주의하셔야 할 점은 출력할 때 형변환을 하셨어도 이후 in의 값 자체는 바뀌지 않습니다.

다만 출력에서 사용할 때만 in변수를 float형으로 바꾸어준 것뿐이죠.

값을 저장하고 싶다면 따로 float형 변수에 int을 형변환해서 저장하면 될 것입니다.

public class example{
    public static void main(String[] args){
        int in = 10;
        float fl = (float)in;
        System.out.print(fl);
    }
}

이외에도 형변환을 할 때 알아두셔야 할 점이 있는데, 한번 알아봅시다.

암시적 형변환, 명시적 형변환


 

 

위에서 형변환이 무엇인지, 어떻게 형변환을 사용하는지에 대해 알아봤는데,

이 형변환은 다시 암시적 형변환과 명시적 형변환으로 나뉘게 됩니다.

 

명시적 형변환

형변환할 자료형을 변수, 또는 상수 앞에 명시적으로 적어주는것을 말합니다.

int in = 10;
long lo = (long)in;

암시적 형변환

자료형을 명시하지 않아도 컴파일러가 알아서 적절한 자료형으로 변환시켜주는 것을 말합니다.

int in = 10;
long lo = in;

위와 같이 형변환을 두 종류로 나눌 수 있습니다.

하지만 이때 암시적 형변환은 자신보다 큰 자료형으로만 변환이 가능하니 주의하셔야 합니다.

이게 무슨 소리인지, 왜 그런 건지 한번 알아보도록 합시다.

 

아시다시피 우리가 알아본 자료형들은 각각 byte단위로 크기가 정해져 있습니다.

그런데 여러분이 long형 변수 lo를 int형으로 명시적 형변환 한다고 생각해봅시다.

이때 lo의 값이 int의 표현 범위에 포함되어있다면 아무 일도 없겠지만,

만약 이를 넘어간다면 어떻게 될까요? 간단하게 그림을 보면서 생각해봅시다.

이 그림처럼 10리터 통에 있는 물을 5리터 통으로 옮기면 5리터 이상부터 물이 넘치게 될 것입니다.

이와 같이 데이터도 자신보다 작은 자료형에 억지로 넣으려고 하면 데이터의 손실이 발생합니다.

public class example{
    public static void main(String[] args){
        long lo = Integer.MAX_VALUE + 1;
        int in = (int)lo;

        System.out.print(in);
    }
}

코드를 보시면 int의 최댓값을 넘은 값을 형변환해서 in변수에 입력하니 int의 최솟값이 입력됐습니다.

 

따라서 여러분이 큰 자료형에서 작은 자료형으로 형변환을 하고싶다면,

명시적 형변환을 통해 컴파일러에게 형변환을 해도 데이터의 손실이 없다고 보장해줘야 합니다.

하지만 암시적 형변환의 경우 이를 보장해줄 사람이 없으니

큰 자료형에서 작은 자료형으로는 암시적 형변환이 불가능한겁니다.

 

이번엔 5리터 물을 10리터로 옮기는 경우를 생각해봅시다.

이때는 작은 곳에서 큰 곳으로 가기 때문에 데이터 손실이 발생하지 않습니다.

따라서 컴파일러는 누가 보장해주지 않아도 자신이 알아서 적절한 자료형으로 변환이 가능하며,

여러분이 바꿀 자료형을 지정해서 형변환을 해줄 수도 있습니다.

 

기본적으로 암시적 형변환은 저장하려는 변수에 맞춰서 형변환되고,

계산식의 경우 가장 큰 자료형으로 암시적 형변환이 이루어집니다.

 

그럼 이런 자료형들의 크기 순서는 어떻게 될까요? 그림으로 한 번 확인해봅시다.

그림을 보시면 long의 경우 8byte로 4byte인 float보다 크지만 더 앞에 있는 것을 볼 수 있습니다.

전에 말했다시피 실수형의 경우 정수형보다 더 큰 수를 표현할 수 있습니다.

때문에 float이 long보다 더 큰 수를 표현할 수 있어서 long이 더 앞에 위치한 것입니다.

 

그리고 그림에 boolean이 없는데, 자바에서 boolean은 다른 자료형으로 형변환이 불가능합니다.

또한 short와 char의 경우 short는 -32,768 ~ 32,767의 값을 가지고,

char은 0 ~ 65535까지의 값을 가지기 때문에 어느 경우에도 데이터 손실이 발생할 수 있습니다.

때문에 두 자료형은 서로 암시적 형변환이 불가능하다는 점 기억하시길 바랍니다.

 

이상으로 형변환에 대한 설명을 마치도록 하고, 다음 글에선 연산자에 대해 알아봅시다.

감사합니다.

반응형

'프로그래밍 언어 > 자바' 카테고리의 다른 글

자바 7. 연산자-2  (0) 2020.08.11
자바 6. 연산자-1  (0) 2020.08.10
자바 4. 자료형-2  (0) 2020.08.06
자바 3. 자료형-1  (0) 2020.08.05
자바 2. 변수와 상수  (0) 2020.08.03