
이번 글에서는 객체 지향 프로그래밍(Object-Oriented Programming, OOP)의 핵심 요소 중 하나인 '다운캐스팅'에 대해 깊게 다루겠습니다. 이전에는 업캐스팅과 그 활용법에 대해 살펴봤지만, 이번 글에서는 다운캐스팅을 어떻게 활용하는지, 그리고 왜 필요한지 등에 대해 심화된 내용과 실제 사례를 통해 설명하겠습니다.
1. 다운캐스팅이란 무엇인가?
객체 지향 프로그래밍에서 '다운캐스팅(Downcasting)'은 슈퍼클래스(Superclass)의 참조 변수로 참조되고 있는 서브클래스(Subclass)의 객체를 원래의 타입으로 복원하는 것을 말합니다. 다시 말해, 업캐스팅된 객체를 원래 클래스로 되돌리는 것입니다. 이 과정을 통해 서브클래스가 가진 고유한 메소드와 필드들을 사용할 수 있게 됩니다.
2. 왜 다운캐스팅을 사용하는가?
다운캐스팅은 역동적인 코드 작성을 가능하게 합니다. 예를 들어 여러 종류의 동물들이 모여있는 동물원에서 특정 동물만 선택하여 그 동물만의 행동(메소드)을 실행하려면 어떻게 해야 할까요? 모든 동물들이 공통적으로 가지고 있는 메소드만 실행할 수 있다면 제한적일 것입니다. 하지만 다운캐스팅을 통해서 선택된 동물(서브클래스)의 고유한 메소드를 실행할 수 있습니다.
3. 다운캐스팅 활용하기
Java 언어 기준으로 Animal 클래스가 있고 Dog 클래스와 Cat 클래스가 Animal 클래스를 상속받았다고 가정하겠습니다.
예시 코드:
public class Animal {
public void sound() {
System.out.println("The animal makes a sound");
}
}
public class Dog extends Animal {
@Override
public void sound() {
System.out.println("The dog barks");
}
public void wagTail() {
System.out.println("The dog wags its tail");
}
}
public class Cat extends Animal {
@Override
public void sound() {
System.out.println("The cat meows");
}
public void purr() {
System.out.println("The cat purrs");
}
}
위 예제에서 Dog 클래스와 Cat 클래스는 모두 Animal 클래스로부터 sound() 메소드를 상속받았습니다. 그리고 각자 자신만의 방식으로 이 메소드를 재정의(Override)하여 사용하였습니다. 또한 각각 wagTail(), purr()과 같은 고유한 메소드를 가지고 있습니다.
4. 다운캐스팅 예시
Animal myAnimal = new Dog();
Dog myDog = (Dog)myAnimal;
myDog.sound(); // Outputs: "The dog barks"
myDog.wagTail(); // Outputs: "The dog wags its tail"
위 코드는 다운캐스팅의 예시입니다. Animal 타입의 변수 myAnimal에 Dog 객체를 할당한 후, 이를 다시 Dog 타입으로 다운캐스팅하였습니다. sound() 메소드 호출 시, 실제로 생성된 객체인 Dog 클래스의 sound() 메소드가 호출됩니다. 또한, 다운캐스팅을 통해 Dog 클래스의 고유한 메소드인 wagTail()도 호출할 수 있게 되었습니다.
5. 주의사항
다운캐스팅은 반드시 해당 객체가 원래 어떤 클래스에서 생성되었는지 정확히 알고 있어야만 안전하게 사용할 수 있습니다. 잘못된 클래스로 다운캐스팅을 시도하면 ClassCastException이 발생할 수 있습니다.
6. 결론
객체 지향 프로그래밍에서 '다운캐스팅'은 중요한 개념입니다. 이 개념을 이해하고 활용하면 코드의 유연성과 확장성을 높일 수 있으며, 복잡한 문제에 대응하는데 유용합니다.
그러나 이러한 도구들을 사용할 때에도 주의사항이 존재합니다. 항상 올바른 방법과 위치에서 다운캐스팅을 사용하는 것이 중요합니다.
'Programming > 객체 지향 프로그래밍(OOP)' 카테고리의 다른 글
OOP 활용: 오버라이딩(Overriding) (0) | 2023.10.05 |
---|---|
OOP 활용: 객체 확인 연산자(다형성) (0) | 2023.10.04 |
OOP 활용: 업캐스팅(다형성) (0) | 2023.10.02 |
OOP 활용: 상속관계(다형성) (0) | 2023.10.01 |
OOP 활용: 클래스, 필드와 메소드 접근 지정자 (0) | 2023.09.30 |