본문 바로가기

프로그래밍 언어/JAVA

JAVA 입문 - 다형성

지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 메서드 오버라이딩

 

다형성

더보기

바로 전 글까지 공부한 묵시적 클래스 형 변환과 가상 메서드를 바탕으로 객체 지향의 중요한 특성인 다형성(polymorph ism)을 공부해보자. 다형성이란 하나의 코드가 여러 자료형으로 구현되어 실행되는 것을 의미한다. 쉽게 말하면 같은 코드에서 여러 실행 결과가 나오는 것이다. 이를 예를 통해 알아보자.

 

시나리오:

Animal 클래스를 생성하고 Human 클래스와 Tiger 클래스, Eagle 클래스가 Animal 클래스를 상속받는 경우이다. Animal 클래스에서 메서드를 하나 정의하고 상속받은 클래스에서 재정의한다.

 

테스트 프로그램 구현

 

Animal 클래스 구현
AnimalTest 클래스 구현
출력 결과

테스트를 위해 AnimalTest 클래스에 moveAnimal( ) 메서드를 만들었다. 이 메서드는 어떤 인스턴스가 매개변수로 넘어와도 모두 animal형으로 변환한다. Animal에서 상속 받은 클래스가 매개변수로 넘어오면 모두 Animal형으로 변환되므로 animal.move( ) 메서드를 호출할 수 있다. 가상 메서드 원리에 따라 animal.move( ) 메서드가 호출하는 것은 매개변수로 넘어온 인스턴스 메서드이다. animal.move( ) 메서드에서는 변함이 없지만 어떤 매개변수가 넘어왔느냐에 따라 출력문이 달라지는 것이 바로 다형성이다.

 

다형성의 장점

더보기

다른 동물이 새로 추가되는 경우를 생각해보자. 새로운 동물도 Animal 클래스를 상속받아 구현하면 모든 클래스를 Animal 자료형 하나로 쉽게 관리할 수 있을 것이다. 이것이 다형성을 활용한 프로그램의 확장성이다. 상위 클래스에서 공통 부분의 메서드를 제공하고, 하위 클래스에서는 그에 기반한 추가 요소를 덧붙여 구현하면 코드 양도 줄고 유지보수도 편리해진다. 또 필요에 따라 상속받은 모든 클래스를 하나의 상위 클래스로 처리할 수 있고 다형성에 의해 각 클래스의 여러가지 구현을 실행할 수 있으므로 프로그램을 쉽게 확장할 수 있다.

 

다형성을 활용해 VIP 고객 클래스 완성하기

기존 Customer 클래스와 달라진 점은 20~23행의 initCustomer( ) 메서드가 있다. 이 메서드는 멤버 변수를 초기화하는데, Customer 클래스를 생성하는 두 생성자에서 공통으로 사용하는 코드이므로 메서드로 분리하여 호출했다.

 

다음은 VIP 고객 클래스 코드를 수정해보자.

VIP 고객 클래스에서 calcPrice( ) 메서드와 showCustomerInfo( ) 메서드를 재정의했다. 일반 고객 클래스에서 calcPrice( ) 메서드는 정가를 그대로 반환하지만, VIP 고객 클래스에서는 할인율을 반영한 지불 가격을 반환한다. 또 일반 고객 클래스에서 showCustomerInfo( ) 메서드는 고객 등급과 이름만 출력했지만 VIP 고객 클래스에서는 담당 상담원 번호까지 출력한다.

 

고객 관리 프로그램 완성하기

출력 결과

출력 결과를 보면 10,000원자리 상품을 구입했을 때 등급에 따라 다른 할인율과 포인트 적립이 이루어지는 것을 알 수 있다. 또 customer1과 customer2 모두  Customer형으로 선언되었고, 고객의 자료형은 Customer형으로 동일하지만 할인율과 보너스 포인트는 각 인스턴스의 메서드에 맞게 계산되었다. 정리하자면 상속 관계에 있는 상위 클래스와 하위 클래스는 같은 상위 클래스 자료형으로 선언되어 생성할 수 있지만 재정의된 메서드는 각각 호출될 뿐만 아니라 이름이 같은 메서드가 서로 다른 역할을 구현하고 있다.

 

참고 서적: 자바 프로그래밍 입문 - 박은종