안녕하세요, 여행벌입니다.

 오늘은 JAVA의 자동 형 변환(Implicit Conversion) 과 명시적 형 변환(Explicit Conversion) 에 대해서 다뤄보겠습니다.


자료형의 변환


 연산을 진행할 때, 컴파일러는 변수가 자료형이 동일할 것을 기대합니다. 하지만, 다음과 같이 서로 다른 자료형에 대해서 덧셈 연산을 진행한다면 어떻게 될까요?

int num = 5;
long num2 = 10L;
// num + num2 ??

 int 형 변수 num과 long 형 변수 num2 에 대해서 덧셈 연산을 진행한다면 데이터를 다루는 범위가 더 큰 long 형으로 자료형을 통일해줘야 데이터의 손실 없이 연산이 가능할 것입니다.

- num에 저장된 값을 long 형으로 변환하여 메모리에 임시 저장한다.

- 변환된 값과 num2에 저장된 값을 대상으로 덧셈을 진행한다.

따라서, 위의 두 과정이 진행되야만 우리가 원하는 결과를 얻을 수 있을 것입니다.

이러한 과정을 '자료형 변환' 또는 '형 변환' 이라고 합니다.


자동 형 변환(Implicit Conversion)


 프로그래머가 명시한 형 변환이 아니고 필요한 상황에서 규칙에 근거하여 자동으로 일어나는 형 변환을 '자동 형 변환' 이라고 합니다.

- 자료형의 크기가 큰 방향으로 형 변환이 일어난다.

- 자료형의 크기에 상관없이 정수 자료형보다 실수 자료형을 우선시한다.

 위의 두 규칙에 근거하여 자바에서는 자동 형 변환이 발생합니다.

 

 예시를 통해서 조금만 익혀보겠습니다.

int num1 = 50;
long num2 = 9999999999L;
System.out.println(num1 + num2); // num1을 long 형으로 자동 형 변환 후 연산 진행

 자동 형 변환에 의해 에러 없이 다음과 같이 결과가 나옵니다.

[console]
10000000049

 이번에는 정수형과 실수형을 같이 연산해보겠습니다.

package Hello;

public class HelloWorld {
	public static void main(String args[]) {
		int num1 = 50;
		float num2 = 3.04f;
		System.out.println(num1 + num2); // num1을 long 형으로 자동 형 변환 후 연산 진행
	}
}
[console]
53.04

 에러 없이 결과가 나오는 것을 확인할 수 있습니다.


명시적 형 변환(Explicit Conversion)


 자동 형 변환이 진행되지 않는 상황에서도 필요하다면 프로그래머가 '명시적 형 변환' 을 통해서 강제로 형 변환이 이뤄지도록 할 수 있습니다.

double num1 = 3.1415;
int num2 = (int)num1; // num1을 강제로 형 변환 -> num2 = 3

 다음과 같이 변수 앞에 (우리가 원하는 자료형) 을 통해 강제로 형 변환을 진행할 수 있습니다. 위의 예시는 double 형을 int 형으로 강제로 형 변환했으므로 소수점 이하의 값들은 날아가고 num2 에는 3만 저장됩니다.

short num1 = 3;
short num2 = 5;
short result = num1 + num2;

 short 형 num1과 num2를 연산해서 같은 자료형 result에 저장했습니다. 위의 코드는 문제가 없을까요??

 문제가 있습니다!! '자바에서 정수형 연산은 int 형으로 진행한다.' 때문에 num1 + num2의 결과는 int 형입니다. 따라서 다음과 같이 강제로 형 변환을 해야만 에러가 발생하지 않습니다.

package Hello;

public class HelloWorld {
	public static void main(String args[]) {
		short num1 = 3;
		short num2 = 5;
		short result = (short)(num1 + num2);
	}
}

 

+ Recent posts