Inor

[Java] Casting (형변환 : 캐스팅) 본문

Computer Engineering/Java

[Java] Casting (형변환 : 캐스팅)

Inor 2017. 11. 29. 18:25

- Casting


 캐스팅은 프로그래밍 언어에서 자료형을 변환하는 연산입니다. 캐스팅 연산이라고 부르며 자바에서 2번째로 높은 연산 우선순위를 갖고 있습니다. 캐스팅 연산은 기본형 변수(int, double 등), 참조형 변수(객체를 참조하는 변수)에서 사용 가능합니다. 같은 종류의 변수끼리 캐스팅이 가능하고 기본형과 참조형 사이에는 캐스팅 연산이 불가능합니다. 캐스팅 연산이 중요한 이유 중 하나는 객체지향 프로그래밍(OOP) 특성인 다형성과 관련되어있기 때문입니다. 이 글에서는 기본형이 캐스팅 되는 과정을 보며 캐스팅 연산의 특징을 알아보겠습니다. 이후 다른 글에서 업 캐스팅과 다운 캐스팅을 알아보며 참조형 변수에서 캐스팅이 실행되는 과정을 학습하고 다형성이 어떻게 실현되는지 알아보겠습니다.




- 기본형 Casting



 기본형 변수는 기본형 변수간에만 캐스팅 연산이 가능합니다. 자바에서 기본형 변수는 위와 같은 순서로 캐스팅이 가능합니다. 주로 범위가 작은 타입에서 큰 타입으로 캐스팅 연산이 가능하고 캐스팅에는 명시적 캐스팅과 암시적 캐스팅이 존재합니다. 암시적 캐스팅은 코드에서 캐스팅 연산자를 사용하지 않고 형변환이 일어나는 상황입니다. 명시적 캐스팅은 코드에서 캐스팅 연산자를 사용해 형변환이 일어나는 상황입니다.


public class Casting {

	public static void main(String[] args) {
		int mIntType = 1;
		double mDoubleType = 2.0;
		
		//암시적 캐스팅
		mDoubleType = mIntType;

		/*
		 * 컴파일 에러
		 * mIntType = mDoulbeType;
		 */
		//명시적 캐스팅
		mIntType = (int)mDoubleType;
	}

}


 암시적 캐스팅은 캐스팅 연산을 코드에서 명시하지 않아도 컴파일러가 자동적으로 캐스팅 연산을 수행하는 상황입니다. 컴파일러는 기본형 타입의 크기를 알고 있기 때문에 작은 범위에서 큰 범위로 형변환 할때 데이터 손실이 발생되지 않는다는 것을 알고있습니다. 그래서 작은 범위를 갖고 있는 데이터 타입에서 큰 범위의 데이터 타입으로 형변환이 일어나도 컴파일 에러를 발생시키지 않습니다. 코드에서 컴파일 에러 부분을 보면 큰 범위를 갖고있는 타입(double)에서 작은 범위 타입(int)로 형변환을 시도하고 있습니다. 이 상황에서 데이터 범위를 알고있는 컴파일러는 데이터 손실을 우려하기 때문에 컴파일 에러를 발생 시킵니다.

 데이터 범위가 큰 타입에서 작은 타입으로 형변환을 수행하는 상황은 프로그래머가 인지하고 있어야하는 상황입니다. 캐스팅 연산자를 코드에 추가하여 컴파일러에게 프로그래머가 인지하고 있는 부분이라는 사실을 알립니다. 컴파일러는 데이터 손실이 발생하지만 캐스팅 연산을 수행합니다. 소수점을 포함하고 있는 double 타입 변수를 int 타입 변수에 넣어주면 소수가 사라지는 이유는 데이터 손실이 발생했기 때문입니다.

 기본적으로 캐스팅 연산은 캐스팅 연산자를 사용해야합니다. 암시적 캐스팅이 가능한 이유는 컴파일러가 이미 데이터 타입 범위를 알고있기 때문입니다. 암시적 캐스팅은 컴파일러가 컴파일 하는 과정에서 데이터 손실을 감수하고 결국 캐스팅 연산을 수행한 후에 완료됩니다.

Comments