캐스팅(형변환이라고도 불림)은 OOP에서 매우 중요한 개념이다.
캐스팅은 OOP의 특징 중에 다형성과 관련이 있다.
OOP(다형성)- 하나의 인터페이스나 추상 클래스를 통해 여러 다양한 구현체를 사용할 수 있는 성질
데이터를 바꾸는 것이 아닌, 코드를 적는 프로그래머가 이미 데이터 정보에 대해 이해한 가정하에, OOP의 다형성 측면에서 사용한다. 기본 데이터형에서의 캐스팅은 원칙적으로 데이터손실을 막고자 한다.
다형성은 객체 지향 프로그래밍의 중요한 개념으로, 클래스 간의 계층 구조와 인터페이스를 통해 관련 클래스들을 추상화하여 표현한다. 이 때, 상위 클래스나 인터페이스를 사용하여 다양한 하위 클래스의 객체를 다루는 것이 가능하며, 이러한 객체들을 해당 상위 클래스나 인터페이스의 참조 변수로 다룰 수 있다.
여기서 캐스팅이 중요한 역할을 한다. 다형성을 이용하면 상위 클래스나 인터페이스의 참조 변수를 통해 여러 개의 서로 다른 하위 클래스 객체를 다룰 수 있다. 그러나 때로는 이러한 참조 변수를 사용하여 실제 하위 클래스의 메소드나 속성에 접근해야 할 경우가 있다. 이때 캐스팅을 통해 해당 참조 변수를 실제 하위 클래스 타입으로 변환하여 사용할 수 있다.
(자바로 설명해보자)
int a = 1.0;
이 코드는 컴파일 에러가 일어난다. 우선 "1.0"은 실수이지만, int는 정수를 받아야한다.
double a = 1;
반면 이 코드는 컴파일 에러가 발생하지 않는다.
데이터의 형이 다르면 모두 컴파일 에러가 발생해야한다.
여기서 두번째 예시는 "묵시적 업캐스팅"이 발생한다. 발생하는 이유는 개발자의 컨펌없이도, 데이터의 손실이 발생하지 않기 때문에 발생한다.
반면 첫번째 예시는 그대로 컴파일 할 경우, 데이터의 손실이 발생하게 된다. 그래서 "명시적 다운캐스팅"이 필요하다.
int a = (int)1.0;
이 경우 "명시적 다운캐스팅"을 했기 때문에, 컴파일 에러가 발생하진 않지만, "명시적 다운캐스팅"은 데이터의 손실 우려가 있다.