Java

[Java] 상속과 메서드 오버라이딩

Chunho 2021. 8. 15. 19:23

상속이란 중복된 코드를 줄이며, 다형성을 구현하기 위해 하위(자식) 클래스가 상위(부모) 클래스의 맴버 변수와 메서드를 물려받는것을 의미한다. 

 

상속은 extends 키워드를 통해 선언할 수 있다. extends의 앞에 나오는 것이 하위 클래스이며, extends의 뒤에 나오는 것이 상위 클래스이다. 

 

상속을 사용해보기 위해 고객 관리 프로그램을 예로 고객 클래스 하나를 정의해보자. 

 

Customer 클래스의 맴버변수

Customer 클래스의 맴버 변수로는 고객의 아이디를 저장하는 customerID, 고객의 이름을 저장하는 customerName, 고객의 맴버등급을 저장하는 customerGrade, 고객의 보너스 포인트를 저장하는 bonusPoint, 고객의 보너스 적립 비율을 저장하는 bonusRatio가 있다.

 

Customer 클래스의 메서드

또한 Customer 클래스의 메서드로는 ID와 Name을 변경해주는 set메서드, 매개변수가 없는 생성자, 매개변수로 ID와 Name값을 받는 생성자가 있다. 

calcPrice 메서드는 결제 기능을 구현한 메서드이다. 매개변수로 가격이 들어가면, 가격과 bonusRatio를 곱해준 만큼 bonusPoint가 쌓이게 된다. 

showCustomerInfo 메서드는 Customer객체의 정보를 출력해주는 메서드이다.

 

여기서 고객들이 점점 늘어나고 단골 고객이 생겼다고 가정해보자. 

 

단골 고객은 VIP로 관리하며, VIP고객을 나타내는 VIPCustomer 클래스를 작성해야 할 것이다.  

 

VIP고객은 일반 고객과 다르게 담당 상담원이 있으며 결제 시 일정 비율 할인이 된다고 가정한다면, 기존 Customer 클래스에 담당 상담원의 ID와 결제 시 할인 기능만 구현하면 될 것이다. 

 

이때 상속(extends)를 통해 코드 중복을 최소화 할 수 있다.

 

VIPCustomer 클래스의 맴버변수

extends 키워드를 통해 Customer를 상속한 VIPCustomer를 만들었다. Customer 클래스의 맴버 변수는 모두 상속되므로 VIPCustomer의 맴버 변수만 추가적으로 작성하면 된다. 

 

다음으로는 super 키워드를 통한 부모 클래스의 생성자 호출에 대하여 알아보자.

 

customerID, customerName, 그리고 담당 상담원의 ID인 agentID를 매개변수로 받는 VIPCustmoer의 생정자를 작성하였다. 

이 때 customerID와 customerName을 매개변수로 받아 저장해주는 생성자는 이미 부모 클래스인 Customer클래스에 있기 때문에 부모 클래스의 생성자를 호출해 준 뒤에 agentID값만 저장을 해주면 된다. 

 

부모 클래스의 생성자를 호출하는 키워드는 'super' 이다.

super 키워드를 사용하며 매개변수로 customerID와 customerName의 값을 넣어주면 해당 값을 전달하여 부모 클래스의 생성자를 호출할 수 있다. 

 

 

마지막으로 메서드 오버라이딩에 대하여 알아보자. 

VIP고객은 일반 고객과 달리 결제 시 가격할인이 된다고 가정했다. 따라서 결제 기능을 구현한 calcPrice 메서드를 재정의할 필요가 있다. 

calcPrice 메서드 오버라이딩

반환값의 자료형, 이름, 매개변수의 자료형과 매개변수의 개수가 모두 동일하며, 내용만 다르게  하위 클래스에서 메서드를 재정의 하였을 때 메서드 오버라이딩이 된다. 이름은 같지만 다른 기능을 구현하는 것이다. 

 

VIPCustomer의 clacPrice는 가격을 리턴할 때 기존 가격에서 할인율이 적용 된 가격을 빼줌으로써 메서드 오버라이딩을 하여 할인 기능을 추가하였다. 

 

또한 @Override 에노테이션을 통해 컴파일러에게 해당 메서드는 재정의된 메서드라는것을 명시적으로 알릴 수 있다. 

 

이와 같이 상속을 통해 부모 클래스의 필드와 메서드를 물려받은 하위 클래스가 각각의 요구사항에 맞게 기능을 확장하거나 변경하는것을 '다형성' 이라고 한다. 

'Java' 카테고리의 다른 글

[Java] Vector 선언과 사용  (0) 2021.10.24
[JAVA] 랜덤 수(난수)생성  (0) 2021.09.19
[JAVA] 추상 메소드와 추상 클래스  (0) 2021.09.05
[JAVA] 향상된 for문  (0) 2021.08.29
[JAVA] ArrayList 선언과 사용  (0) 2021.08.29