본문 바로가기
JAVA/객체지향

자바 다형성 의미, 사용방법 (feat.객체지향)

by 스코리아 2023. 9. 2.

안녕하세요, 스코리아입니다.

오늘은 자바의 객체지향의 핵심이라고 할 수 있는 다형성에 대해서 알아보도록 하겠습니다.

 

다형성 (polymorphism) 이란?

  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
  • 즉, 같은 타입이지만 실행 결과가 다양한 객체를 대입할 수 있는 성질
  • 같은 코드에서 여러 실행 결과가 나옴
  • 객체지향의 중요한 부분 중 하나임 (상속, 정보은닉 등)
  • 다형성을 잘 활용해서 프로그래밍을 하면 유연하고 확정석 있는 유지보수가 편한 프로그램 코드를 짤 수 있음

자바의 다형성

자동타입변환

  • 부모 타입에는 모든 객체 대입 가능 (자식 타입은 부모 타입으로 자동 변환)
  • 효과: 객체를 부품화 시킬 수 있음 (다형성으로 연결됨)
  • 자동타입변환의 자세한 내용 참고하기: https://skorea6.tistory.com/22

매개변수의 다형성

  • 매개변수가 부모 클래스 타입일 경우 : 해당 클래스의 객체를 대입하는 것이 원칙이나 자식 객체를 대입하는 것도 허용됨
  • 즉, 자동타입변환과 다형성이 활용

다형성 직접 사용하기 (예시)

  • Animal class를 만들고, 안에 move 메소드를 만들어주겠습니다.
  • 그리고 Human, Tiger, Eagle 3개의 클래스는 Animal 클래스를 extends (상속) 하도록 하며, Animal(부모) 클래스의 move 메소드를 오버라이딩하여 모두 작성해 주었습니다. 
class Animal{
    public void move() {
        System.out.println("동물이 움직입니다.");
    }
}

class Human extends Animal{
    @Override
    public void move() {
        System.out.println("사람이 두발로 걷습니다.");
    }
}

class Tiger extends Animal{
    @Override
    public void move() {
        System.out.println("호랑이가 네 발로 뜁니다.");
    }
}


class Eagle extends Animal{
    @Override
    public void move() {
        System.out.println("독수리가 하늘을 날아갑니다.");
    }
}


public class AnimalTest {
    public static void main(String[] args) {
        Animal hAnimal = new Human();
        Animal tAnimal = new Tiger();
        Animal eAnimal = new Eagle();

        moveAnimal(hAnimal); // [1] 다형성이 지켜짐.
        moveAnimal(tAnimal);
        moveAnimal(eAnimal);

        System.out.println();

        ArrayList<Animal> animalList = new ArrayList<>();
        animalList.add(hAnimal);
        animalList.add(tAnimal);
        animalList.add(eAnimal);

        for(Animal animal : animalList) {
            animal.move(); // [2] 다형성이 지켜짐.
        }
    }

    public static void moveAnimal(Animal animal) { // 매개변수의 다형성
        animal.move();
    }
 }

 

AnimalTest class를 만들고 main 함수 안에 테스트 코드를 짜보겠습니다.

먼저 매개변수의 다형성을 사용해 보겠습니다.

  • moveAnimal 메소드를 생성하고 매개변수에는 Animal(부모 클래스)를 넣었습니다. 그리고 메소드 안에 move 메소드를 호출하였습니다.
  • 이렇게 되면 매개변수의 다형성이 지켜진 것으로 볼 수 있습니다. moveAnimal 메소드의 매개변수에 부모 클래스인 Animal이 오게 되면 상속된 자식 클래스들(Human, Tiger, Eagle)중 아무거나 올 수 있습니다.
  • move 메소드는 Animal(부모 클래스)에 정의되어 있고 자식 클래스들이 모두 재정의(오버라이딩) 한 상태이므로, 다형성을 지키며 호출할 수 있습니다.

그리고 ArrayList에서 다형성을 사용해보았습니다.

  • animalList 이름을 가지는 ArrayList에 Animal(부모 클래스)를 타입으로 하여 만들어 봅시다.
  • ArrayList인 animalList을 이용해 향상된 for문을 돌리고 안에 move 메소드를 호출합니다.
  • 이렇게 되면 다형성이 지켜진 것으로, 같은 코드에서 여러 다른 실행 결과가 나옵니다. 즉, 하나의 코드가 여러 자료형으로 구현되어 실행됩니다.

자바 다형성 예시 - 실행결과

자식 클래스에 부모 클래스를 오버라이딩한 메소드 외에도 다른 메소드(자식 클래스만의 메소드)를 적을 수도 있습니다.

이럴 경우 moveAnimal 메소드에서 해당 메소드를 그대로 호출할 수는 없습니다. 꼭 자식 타입이 맞는지 확인 후 해당 메소드를 호출하여합니다. 이에 관한 자세한 내용은 다음시간에 instanceof를 이용해 알아보겠습니다. (https://skorea6.tistory.com/27)

 

 

다형성을 사용하는 이유

  • 위의 예제에서 자식 클래스인 Cat을 추가해야 한다고 할 때, 손쉽게 추가할 수 있음
  • 상속과 메소드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음
  • 그렇지 않고 if-else if문을 이용해서 구현해 버리면 코드의 유지보수가 어려워짐 (아래와 같이)
if(animal.equals("human")){

}else if(animal.equals("tiger")){

}else if(animal.equals("eagle")){

}
  • 상위 클래스에서는 공통적인 부분을 작성하고, 하위 클래스에서는 각 클래스에 맞는 기능 구현
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링할 수 있음 => 다형성

 


지금까지 자바(Java)의 다형성에 대해서 알아보았습니다.

읽어주셔서, 감사합니다.