본문으로 바로가기

다형성(polymorphism)의 개념

category 프로그래밍/Java 2021. 5. 22. 01:19

다형성(polymorphism)

다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 구현하였다. 좀 더 구체적으로 말하자면, 부모클래스 타입의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하는 것이다.

 

예제

 

위 그림과 같이 3개의 클래스가 Animal 클래스를 상속받는다고 가정하자. 아래 코드는 Animal 클래스에 메서드를 하나 정의하고 상속받는 클래스에서 재정의하는 코드이다.

class Animal {
	public void move() {
    	System.out.println("동물이 움직입니다.");
    }
}

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

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

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

public class AnimalTest {
	public static void main(String[] args) {
    	AnimalTest aTest = new AnimalTest();
        aTest.moveAnimal(new Human());
        aTest.moveAnimal(new Tiger());
        aTest.moveAnimal(new Eagle());
    }
       
    public void moveAnimal(Animal animal) {
       	animal.move();
    }
}

테스트를 하기 위해 AnimalTest 클래스에 moveAnimal() 메서드를 만들었다. 이 메서드는 어떤 인스턴스가 매개변수로 넘어와도 모두 Animal형으로 변환된다. 예를 들어 매개변수가 전달되는 부분에 Human 인스턴스가 전달되었다면 아래 코드처럼 형 변환이 발생한다.

Animal ani = new Human();

Animal에서 상속받은 클래스가 매개변수로 넘어오면 모두 Animal형으로 변환되므로 animal.move() 메서드를 호출할 수 있다. 가상 메서드 원리에 따라 animal.move() 메서드가 호출하는 메서드는 Animal의 move가 아닌 매개변수로 넘어온 실제 인스턴스의 메서드이다. animal.move() 메서드는 변함이 없지만 어떤 매개변수가 넘어왔느냐에 따라 출력문이 달라진다.

다형성(polymorphism)

 

다형성의 장점

다른 동물이 새로 추가되는 경우를 생각해보자. 새로 추가되는 동물도 Animal 클래스를 상속받아 구현하면 모든 클래스를 Animal 자료형으로 관리할 수 있다. 각 자료형에 따라 코드를 다르게 구현한다면 코드는 훨씬 복잡하고 내용도 길어질 것이다. 즉, 상위 클래스에서 공통부분의 메서드를 제공하고, 하위 클래스에서는 추가 요소를 덧붙여 구현하면 쉽게 확장이 가능하며 유지보수를 함에 있어서도 용이해진다.

 

 

정리

1. 자바에서 다형성이란 부모클래스의 참조변수로 자식클래스의 인스턴스를 참조할 수 있도록 하는 것

2. 다형성을 이용하면 프로그램의 확장성과 유지보수에 있어 용이하다.

3. 부모타입의 참조변수로 자식타입의 인스턴스를 참조할 수 있으나, 반대의 경우에는 참조가 불가능하다.

'프로그래밍 > Java' 카테고리의 다른 글

예외처리(Exception Handling)란?  (0) 2021.11.14
변수의 유효 범위(scope)  (0) 2021.06.08