..

Search

11) 타입 변환

11) 타입 변환

타입 변환


타입 변환(type conversion)

하나의 타입을 다른 타입으로 바꾸는 것을 타입 변환(type conversion)이라고 합니다.

자바에서는 boolean형을 제외한 나머지 기본 타입 간의 타입 변환을 자유롭게 수행할 수 있습니다.

 

자바에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행됩니다.

메모리에 할당받은 바이트의 크기가 상대적으로 작은 타입에서 큰 타입으로의 타입 변환은 생략할 수 있습니다.

 

하지만 메모리에 할당받은 바이트의 크기가 큰 타입에서 작은 타입으로의 타입 변환은 데이터의 손실이 발생합니다.

따라서 상대적으로 바이트의 크기가 작은 타입으로 타입 변환을 할 경우 자바 컴파일러는 오류를 발생시킵니다.


타입 변환의 종류

자바에서 타입 변환은 크게 다음과 같이 두 가지 방식으로 나뉩니다.

 

1. 묵시적 타입 변환(자동 타입 변환)

2. 명시적 타입 변환(강제 타입 변환)


묵시적 타입 변환(자동 타입 변환, implicit conversion)

묵시적 타입 변환이란 대입 연산이나 산술 연산에서 컴파일러가 자동으로 수행해주는 타입 변환을 가리킵니다.

자바에서는 데이터의 손실이 발생하지 않거나, 데이터의 손실이 최소화되는 방향으로 묵시적 타입 변환을 진행합니다.

또한, 자바에서는 데이터의 손실이 발생하는 대입 연산은 허용하지 않습니다.

 

다음 예제는 대입 연산과 산술 연산에서 일어나는 묵시적 타입 변환을 보여줍니다.

예제

① double num1 = 10;

② // int num2 = 3.14;

③ double num3 = 7.0f + 3.14;

 

System.out.println(num1);

System.out.println(num3);

코딩연습 ▶

실행 결과

10.0

10.14

 

위 예제의 ①번 라인에서는 double형 변수에 int형 데이터를 대입하므로, int형 데이터가 double형으로 자동 타입 변환됩니다.

하지만 주석 처리된 ②번 라인에서는 int형 변수가 표현할 수 있는 범위보다 더 큰 double형 데이터를 대입하므로, 데이터의 손실이 발생합니다.

따라서 이 대입 연산에 대해서는 자바 컴파일러가 오류를 발생시킬 것입니다.

 

③번 라인에서는 float형 데이터와 double형 데이터의 산술 연산을 수행합니다.

이때에도 데이터의 손실이 최소화되도록 float형 데이터가 double형으로 자동 타입 변환됩니다.

 

이렇게 자바 컴파일러가 자동으로 수행하는 타입 변환은 언제나 데이터의 손실이 최소화되는 방향으로 이루어집니다.

따라서 자바에서는 타입의 표현 범위에 따라 다음과 같은 방향으로 자동 타입 변환이 이루어집니다.

 

byte형 → short형 → int형 → long형 → float형 → double형

                 char형 ↗

 

예제

① byte num1 = 100;        // OK

② byte num2 = 200;        // Type mismatch

③ int num3 = 9876543210;  // Out of range

④ long num4 = 9876543210; // Out of range

⑤ float num5 = 3.14;      // Type mismatch

 

위 예제의 ①번 라인에서는 byte형 변수에 표현 범위가 더 큰 int형 데이터를 대입하고 있습니다.

하지만 정수 100은 byte형 변수가 표현할 수 있는 범위 내에 있으므로, 자동으로 타입 변환이 이루어져 대입됩니다.

그러나 ②번 라인처럼 byte형 변수가 표현할 수 있는 범위를 벗어난 int형 데이터는 타입 변환되지 못하고, 오류를 발생시킬 것입니다.

⑤번 라인도 마찬가지로 float형 변수가 표현할 수 있는 범위를 벗어난 double형 데이터를 대입하므로, 오류를 발생시킵니다.

 

③번 라인과 ④번 라인에서는 모두 Out of range 오류가 발생할 것입니다.

이것은 int형 리터럴이 표현할 수 있는 최대 범위인 2,147,483,647을 초과하는 정수형 리터럴을 사용했기 때문입니다.

이렇게 int형 리터럴보다 더 큰 정수를 사용하기 위해서는 다음 예제처럼 리터럴의 마지막에 L이나 l 접미사를 추가하여 long형 리터럴로 명시해야만 합니다.

예제

⑥ int num3 = 9876543210L;  // Type mismatch

long num4 = 9876543210L; // OK

 

하지만 ⑥번 라인에서는 int형 변수가 표현할 수 있는 범위를 벗어난 long형 데이터를 대입하므로, 오류를 발생시킬 것입니다.


명시적 타입 변환(강제 타입 변환, explicit conversion)

명시적 타입 변환이란 사용자가 타입 캐스트 연산자(())를 사용하여 강제적으로 수행하는 타입 변환을 가리킵니다.

 

자바에서는 다음과 같이 명시적 타입 변환을 수행할 수 있습니다.

문법

(변환할타입) 변환할데이터

 

변환시키고자 하는 데이터의 앞에 괄호(())를 넣고, 그 괄호 안에 변환할 타입을 적으면 됩니다.

자바에서는 이 괄호를 타입 캐스트(type cast) 연산자라고 합니다.

 

다음 예제는 명시적 타입 변환을 보여주는 예제입니다.

예제

int num1 = 1, num2 = 4;

 

① double result1 = num1 / num2;

② double result2 = (double) num1 / num2;

 

System.out.println(result1);

System.out.println(result2);

코딩연습 ▶

실행 결과

0.0

0.25

 

위 예제의 ①번 라인에서 나눗셈 연산의 결과로는 0이 반환됩니다.

자바에서 산술 연산을 수행하고 얻는 결괏값의 타입은 언제나 피연산자의 타입과 일치해야 합니다.

즉, int형 데이터끼리의 산술 연산에 대한 결괏값은 언제나 int형 데이터의 결과로 나오게 됩니다.

따라서 1 나누기 4의 결과로는 0.25가 반환되지만, int형으로 자동 타입 변환되어 0이 반환되게 됩니다.

그리고서 double형 변수에 그 결과가 대입될 때, double형으로 자동 타입 변환되어 0.0이라는 결과가 출력되게 됩니다.

 

따라서 정확한 결과를 얻고자 한다면 ②번 라인처럼 피연산자 중 하나의 타입을 double형으로 강제 타입 변환해야 합니다.

이렇게 피연산자 중 하나의 타입이 double형이 되면, 나눗셈 연산을 위해 나머지 하나의 피연산자도 double형으로 자동 타입 변환됩니다.

따라서 그 결과 또한 double형인 0.25가 될 것이며, 이 결과가 double형 변수에 제대로 대입될 것입니다.


연습문제