코딜기
[Java] 다형성 (Polymorphism) 본문
반응형
다형성(Polymorphism)이란?
- 다형성이란 하나의 객체가 여러 가지 타입으로 사용되는 것을 의미합니다.
- 부모 타입 변수에 어떠한 자식 객체든 들어갈 수 있습니다.
- 다형성은 상속을 전제 조건으로 합니다.
객체 생성과 배열 사용에서의 다형성
- 아래 그림을 보면 Animal이라는 부모 클래스가 있고, Dog, Cat, Duck 클래스가 존재합니다.
- 모든 자식 클래스는 부모가 물려준 sound()라는 메서드를 본인의 클래스에 맞게 재정의(override)해서 사용하고 있습니다.
- 위 사진을 참고하였을 때, 다형성이 적용되지 않았을 때는 아래와 같이 참조 변수의 타입을 객체에 맞게 작성해 주어야 합니다.
Dog dog = new Dog();
Cat cat = new Cat();
Duck duck = new Duck();
- 또한 각자 다른 세 개의 자식 객체를 하나의 배열에 넣고 싶어도 같은 배열에 모여있을 수 없습니다.
- 배열은 기본적으로 동종 모음 구조이기 때문입니다.
- 하지만 이러한 상황에서, 다형성을 적용하게 되면 훨씬 더 쉽게 객체들을 관리할 수 있습니다.
1. 부모 타입으로 객체를 생성할 수 있습니다.
// 클래스 타입 Dog -> Animal 타입으로 자동 형 변환(promotion)
Animal dog = new Dog();
Animal cat = new Cat();
Animal duck = new Duck();
2. 모든 자식의 객체가 하나의 배열에 모여 있을 수가 있습니다.
Animal[] animals = {dog, cat, duck};
메서드 사용에서의 다형성
- 자바의 메서드 매개변수는 타입을 정확하게 지켜서 전송해야 하기 때문에, 다형성이 없다면 아래와 같이 타입별로 메서드를 각각 선언해야 할 것입니다.
// 매개변수에 다형성이 적용되어 있지 않다면 오버로딩을 통해 일일이 구현해 주어야 합니다.
public void makeSound(Dog dog) {}
public void makeSound(Cat cat) {}
public void makeSound(Duck duck) {}
- 그러나 다형성을 사용하면 아래 코드와 같이 하나의 메서드로 여러 타입의 객체를 받아 처리할 수 있습니다.
- Animal의 자식 클래스들은 모두 sound() 메서드를 가지므로, 매개변수로 어떤 객체를 전달하든지 sound()가 호출됩니다.
// 매개변수에 다형성을 준 경우
public void makeSound(Animal animal) {
// dog, cat, duck 모두 sound() 호출 가능.
animal.sound();
}
- 다형성은 리턴 타입에도 적용될 수 있습니다.
- 자바의 메서드는 반드시 리턴 타입에 맞는 값을 반환해야 하지만, 다형성을 적용하면 부모 타입으로 모든 자식 객체를 반환할 수 있습니다.
반응형
'Language > Java' 카테고리의 다른 글
[Java] 다형성의 instanceof (0) | 2024.09.19 |
---|---|
[Java] 다형성의 타입 캐스팅 (Type Casting) (0) | 2024.09.19 |
[Java] super와 super() (0) | 2024.09.02 |
[Java] 오버라이딩 (Overriding) (0) | 2024.09.02 |
[Java] 상속 (Inheritance) (0) | 2024.09.02 |
Comments