
객체지향프로그래밍의 다형성(Polymorphism)이란?
상속 후에 여러 형태의 자식 클래스 & Over Ride를 의미한다
코드 예시
- 부모 클래스: Animal
- Animal을 부모로 하는 자식 클래스:Cat, Dog
public class Animal {
public void speech() {
System.out.println("Animal speech()");
}
}
public class Cat extends Animal {
@Override
public void speech() {
System.out.println("야옹야옹");
}
public void cat_method() {
System.out.println("저는 야옹이에요");
}
}
public class Dog extends Animal {
@Override
public void speech() {
System.out.println("멍멍");
}
public void dog_method() {
System.out.println("난 강아지다");
}
}
만약
최대 10개까지의 Dog 또는 Cat 클래스로 인스턴스를 만들고, 각 클래스의 메소드를 호출해보고 싶다.
Dog로만 10개를 만들 수도 있고, Cat으로만 10개를 만들 수도 있다.
Dog 타입의 배열을 10개, Cat 타입의 배열을 10개 선언해서 각자 만들어야 하나?
// dog + cat = 10
Dog[] dogArr = new Dog[10];
Cat[] catArr = new Cat[10];
dogArr[0] = new Dog();
catArr[0] = new Cat();
catArr[1] = new Cat();
dogArr[1] = new Dog();
이럴 때 Dog 클래스와 Cat 클래스의 부모 클래스인 Animal을 사용할 수 있다.
Animal ani = new Dog();
- ani는 Animal 타입으로 선언되었지만, Dog 클래스의 객체를 참조하고 있다.
- Dog 클래스의 객체가 할당되어 있기 때문에 Dog에 정의된 메서드를 실행할 수 있어야 함
- 그러나 ani는 Animal 타입이기 때문에, Animal 클래스에서 정의된 속성이나 메서드만 직접적으로 호출할 수 있다.
- Dog 클래스에서 추가된 속성이나 메서드는 ani를 통해 접근할 수 없다

(참고) 한편, instanceof 로 인스턴스 타입을 확인할 수 있다.
if (ani instanceof Dog) {
System.out.println("Dog 인스턴스입니다.");
}
즉, ani는 Dog 객체를 참조하고 있지만, Animal에서 상속받아 Dog에서 오버라이드한 메서드만 접근할 수 있다는 것이다.
Dog의 고유 메소드에는 어떻게 접근할 수 있을까?
강제 형변환
Dog d = (Dog)ani;
Dog 객체에서 super를 참조하고 있던 포인터가 this로 포인터를 바꾼 것과 같은 결과이다.



정상적으로 Dog의 고유 메소드에 접근할 수 있는 것을 확인할 수 있다.
최종 코드
// 하나의 인스턴스로 관리
Animal[] animal = new Animal[10];
animal[0] = new Dog();
animal[1] = new Cat();
animal[2] = new Cat();
animal[3] = new Dog();
for (Animal a: animal) {
if (a != null) {
a.speech(); // Animal으로부터 상속받은 Cat과 Dog의 오버라이드 메소드
}
if (a instanceof Dog) {
Dog d = (Dog)a; // 강제형변환 (포인터 변경)
d.dog_method(); // Dog의 고유 메소드
} else if (a instanceof Cat) {
((Cat)a).cat_method(); // 간결한 표현식
}
}

'Java > OOP' 카테고리의 다른 글
| [스크랩] JavaScript의 두 축 (Eric Elliott) (2) | 2025.01.24 |
|---|---|
| [Java] 상속 + Override (1) | 2025.01.08 |
| [Java] 오버로드 (Overload), 가변인수(...) (1) | 2025.01.06 |
| [Java] 객체 지향 프로그래밍 vs 절차 지향 프로그래밍 (1) | 2025.01.03 |
| [Java] 클래스 (Class) 정의, 접근 제어자, 상속, 인터페이스, 패키지 (1) | 2025.01.03 |