-
JAVA - 다형성 OverrideJava/JAVA17 2024. 11. 12. 10:49반응형
업캐스팅과 다운캐스팅은 **오버라이드(Override)**와 함께 자주 사용됩니다. 오버라이딩은 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것이며, 이를 통해 다형성(Polymorphism)을 구현할 수 있습니다. 업캐스팅을 통해 상위 클래스 타입으로 객체를 참조할 때, 오버라이드된 하위 클래스의 메서드가 호출됩니다. 다운캐스팅은 하위 클래스에만 있는 메서드나 필드에 접근하기 위해 사용됩니다.
예시 코드
class Animal { void sound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Dog barks"); } void fetch() { System.out.println("Dog fetches the ball"); } } class Cat extends Animal { @Override void sound() { System.out.println("Cat meows"); } void scratch() { System.out.println("Cat scratches"); } } public class Main { public static void main(String[] args) { // 업캐스팅 Animal animalDog = new Dog(); Animal animalCat = new Cat(); // 업캐스팅된 상태에서 메서드 호출 animalDog.sound(); // "Dog barks" 출력 (오버라이딩된 메서드 호출) animalCat.sound(); // "Cat meows" 출력 (오버라이딩된 메서드 호출) // 다운캐스팅 if (animalDog instanceof Dog) { Dog dog = (Dog) animalDog; dog.fetch(); // "Dog fetches the ball" 출력 } if (animalCat instanceof Cat) { Cat cat = (Cat) animalCat; cat.scratch(); // "Cat scratches" 출력 } } }설명
- 업캐스팅:
- Animal animalDog = new Dog();와 같이 Dog 객체를 Animal 타입으로 참조하면 업캐스팅이 됩니다.
- 업캐스팅된 상태에서 animalDog.sound()를 호출하면, Dog 클래스에서 오버라이딩된 sound() 메서드가 호출되어 "Dog barks"가 출력됩니다. animalCat.sound()도 마찬가지로 Cat 클래스의 sound() 메서드가 호출됩니다.
- 업캐스팅을 통해 하위 클래스의 오버라이드된 메서드를 상위 클래스 타입을 통해 호출할 수 있습니다.
- 다운캐스팅:
- animalDog가 Dog 객체인 것을 확인(instanceof)한 후, Dog 타입으로 다운캐스팅합니다.
- 다운캐스팅 후에는 Dog 클래스에만 있는 fetch() 메서드를 호출할 수 있습니다.
- animalCat 역시 Cat 타입으로 다운캐스팅하여 Cat 클래스의 scratch() 메서드에 접근합니다.
정리
- 업캐스팅: 상위 클래스 타입으로 참조할 때, 하위 클래스에서 오버라이드된 메서드가 호출됩니다. 이를 통해 다형성을 구현할 수 있습니다.
- 다운캐스팅: 하위 클래스에 있는 고유한 메서드나 필드에 접근하기 위해 사용됩니다.
부모와 자식 관계에서 자식 클래스가 부모 클래스의 메서드를 오버라이드(Override) 했을 경우, 자식 클래스의 메서드가 호출됩니다. 이것은 다형성(polymorphism) 원리에 따른 것이며, 상위 클래스의 타입으로 참조된 객체가 실제로 어떤 클래스의 인스턴스인지에 따라 오버라이드된 메서드가 호출됩니다.
원리
- 자바에서는 객체가 실제 생성된 클래스의 메서드를 호출합니다. 상위 클래스 타입으로 객체를 참조하더라도, 실제 객체가 자식 클래스의 인스턴스라면 자식 클래스에서 오버라이드된 메서드가 호출됩니다.
예시 코드
class Animal { void sound() { System.out.println("Animal makes a sound"); } } class Dog extends Animal { @Override void sound() { System.out.println("Dog barks"); } } public class Main { public static void main(String[] args) { Animal animal = new Dog(); // Animal 타입으로 Dog 객체를 참조 (업캐스팅) animal.sound(); // "Dog barks" 출력 } }설명
- Animal animal = new Dog();에서 animal은 Animal 타입이지만, 실제 객체는 Dog 클래스의 인스턴스입니다.
- animal.sound();를 호출하면 Animal 클래스의 sound() 메서드가 아닌 Dog 클래스에서 오버라이드된 sound() 메서드가 호출됩니다.
- 이처럼 부모-자식 관계에서 메서드를 오버라이드하면 자식 클래스의 오버라이드된 메서드가 우선적으로 호출됩니다.
요약
부모와 자식 관계에서 자식 클래스가 부모의 메서드를 오버라이드했다면, 객체가 실제로 자식 클래스의 인스턴스일 경우 항상 오버라이드된 자식 클래스의 메서드가 호출됩니다.
반응형'Java > JAVA17' 카테고리의 다른 글
[JAVA] - 1.8 -> 17 버전 업그레이드 Base64오류 (0) 2025.06.27 JAVA - Generic을 사용해야하는 이유 (1) 2025.06.12 JAVA - GENERIC 사용방법, 사용이유 파헤치기 (1) 2025.06.10 JAVA - 다형성, 추상메서드, 인터페이스 사용하는 이유 (0) 2024.11.12 JAVA - 다형성 (업케스팅, 다운케스팅, instanceof) (0) 2024.11.12 - 업캐스팅: