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 자식 클래스로 형변환을 시도할 위험이 있기 때문에 조심해서 사용하여야 한다.
'CS' 카테고리의 다른 글
| 비동기 진화사: async/await은 정말 비동기일까? (2) | 2025.07.24 |
|---|---|
| 배열의 범위를 넘어서면 항상 segfault가 발생할까? (1) | 2025.07.08 |
| 운영체제 기본 3 - CPU는 어떻게 컴퓨터를 제어하는가 (0) | 2023.07.08 |
| 가상화 - 컴퓨팅 자원을 유연하게 쓰는 방법 (0) | 2023.06.29 |
| 포트와 소켓 - 네트워크 (0) | 2023.06.29 |