코딜기

[Java] 다형성 (Polymorphism) 본문

Language/Java

[Java] 다형성 (Polymorphism)

코딜기 2024. 9. 19. 19:06
반응형

다형성(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