
안녕하세요, 여행벌입니다.
오늘은 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);
}
}
'Computer Language > JAVA' 카테고리의 다른 글
[JAVA] #6 자바 단항 연산자 - travelbeeee (0) | 2020.03.17 |
---|---|
[JAVA] #5 자바 이항 연산자 - travelbeeee (0) | 2020.03.16 |
[JAVA] #3 자바 리터럴(Literals), 리터럴 상수 - travelbeeee (0) | 2020.03.13 |
[JAVA] #2 자바 상수 ( final ) - travelbeeee (0) | 2020.03.13 |
[JAVA] #1 자바 변수와 자바 자료형의 종류 - travelbeeee (0) | 2020.03.12 |