본문 바로가기
CS

형변환이란?

by seongjko 2025. 5. 28.
728x90

 

데이터를 바라보는 관점을 바꾸는 행위

→ 똑같은 숫자 1이라도 int에 넣으면 정량적인 숫자 1을 의미하게 되고, bool에 넣으면 논리적 참을 의미하게 됨.

→ 똑같은 숫자 65라도 int에 넣으면 정량적인 숫자 65를 의미하게 되고, char에 넣으면 대문자 A를 의미하게 됨.

 

기본 자료형에서의 형변환은 위의 정의만으로도 충분히 이해가 되지만 참조 자료형 사이의 형변환은 충분하지 못한 측면이 있다. 왜냐하면, 참조 자료형 사이의 형변환은 heap 영역에 할당된 인스턴스 자체의 크기를 바꾸는 게 아니라 stack 영역에 할당된 인스턴스의 참조에 관한 이야기이기 때문이다. 이러한 측면에서, 형변환을 참조 자료형에 국한하여 다시 정의하자면 아래와 같다:

모호성의 범위를 조절하는 행위

 

upcasting: 구체적인 것을 모호하게 바라보기

→ 구체적인 것을 모호하게 바라봄으로써 관리가 더욱 쉬워진다.

Animal[] zoo = {
    new Dog(),
    new Cat(),
    new Bird()
};

// 모든 구체적 특성을 동물이라는 모호한 렌즈로 뭉뚱그려 반복문 하나로 관리
for (Animal animal : zoo) {
    animal.eat();
}

하지만, 구체적인 것을 모호하게 바라본다는 것은 생략되는 부분이 있다는 것을 뜻한다.

기술적으로는 오버라이딩된 메서드 대신 각 자식 클래스의 고유 메서드를 사용할 수가 없다는 것을 뜻한다.

이때 downcasting을 사용한다.

 

downcasting: 모호한 것을 구체적으로 바라보기

→ 자식들을 하나로 뭉뜽그려 관리하다가 구체적 기능(자식 클래스의 고유 메서드)이 필요할 때 이용한다.

Animal animal = new Cat();
Dog dog = (Dog)animal; 

하지만, 위 코드와 같이 실제로는 Cat 자식 클래스인데 개발자가 Dog 자식 클래스로 형변환을 시도할 위험이 있기 때문에 조심해서 사용하여야 한다.