본문 바로가기

프로그래밍 언어/JAVA

JAVA 입문 - 상속

지난 글: [프로그래밍 언어/JAVA] - JAVA 입문 - 배열 응용 프로그램

 

객체 지향 프로그래밍의 중요한 특징 중 하나가 상속(inheritance)이라고 한다.

상속은 우리가 일반적으로 아는 '무언가를 물려받는 의미'이다. 

예로 B 클래스가 A 클래스를 상속받으면 B 클래스는 A 클래스의 멤버 변수와 메서드를 사용할 수 있다.

객체 지향 프로그램은 유지 보수하기 편하고 프로그램을 수정하거나 새로운 내용을 추가하는 것이 유연한데,

그 기반이 되는 가술이 바로 상속이라고 한다.

 

클래스의 상속

더보기

우선 상속과 관련하여 사용하는 용어와 문법에 대해 알아보자.

B 클래스가 A 클래스에서 상속받는다고 할 때 다음처럼 나타낼 수 있다.

상속에 있어서 헷갈리면 안되는 것이 상속을 하는 클래스에서 상속을 받는 클래스로 화살표가 가는게 아닌,

상속을 받는 클래스에서 상속을 하는 클래스로 화살표가 간다.

상위 클래스는 부모 클래스(parent class)라고도 하고 하위 클래스는 자식 클래스(child class)라고도 한다.

 

클래스 상속 문법

JAVA 문법으로 상속을 구현할 때는 extends 예약어를 사용한다. 이 때 사용하는 extends 예약어는 '연장, 확장하다'라는 뜻이다. 즉, A가 갖고 있는 속성이나 기능을 추가로 확장하여 B 클래스를 구현한다는 뜻이다. 일반적인 클래스 A에서 더 구체적인 클래스 B가 구현된다는 것이다. extends 사용법은 다음과 같다.

class B extends A{ } //B 클래스가 A 클래스를 상속받는다.
더보기

이런 상속 관계에서는 상위 클래스가 하위 클래스보다 일반적인 개념이고, 하위 클래스는 상위 클래스보다 구체적인 클래스가 된다. 

 

상속을 사용하여 고객 관리 프로그램 구현하기

더보기

Customer 클래스 구현

모든 멤버 변수를 반드시 private으로 선언할 필요는 없다. 필요에 따라 멤버 변수나 메서드를 외부에 노출하지 않을 목적일 때 private으로 선언한다.

 

새로운 고객 등급이 필요한 경우

시나리오:

고객이 점점 늘어나고 판매도 많아지다 보니 단골 고객이 생겼다. 단골 고객은 회사 매출에 많은 기여를 하는 우수 고객이다. 이 우수 고객에게 좋은 혜택을 주고 싶다. 우수 고객 등급은 VIP이고, 다음과 같은 혜택을 제공한다.

-제품을 살 때는 항상 10% 할인해 준다.

-보너스 포인트를 5% 적립해 준다.

-담당 전문 상담원을 배정해 준다.

============================================================================이 조건을 구현하기 위해 Customer 클래스에 VIP 고객에게 필요한 변수와 메서드까지 함께 포함하여 구현한다. 하지만 이렇게 구현하면 Customer 클래스의 코드가 복잡해질뿐더러 일반 고객의 인스턴스를 생성할 때는 VIP 고객과 관련된 기능은 필요 없는데 VIP고객의 내용까지 같이 생성되어 낭비가 발생한다. 이럴 때는 아래와 같이 VIPCustomer 클래스를 따로 만드는 것이 좋다.

직접 클래스를 만들어보니 앞서 만든 Customer 클래스와 겹치는 멤버 변수와 메서드가 보인다. calcPrice( )의 경우 이름은 같은데 구현 내용이 다르다. 생각해보면 VIP 고객도 우선 고객이다. 다만 일반 고객에게 제공하는 혜택은 기본이고 추가로 제공하는 속성과 메서드가 있는 것이다. 바로 이럴 때 상속을 사용한다. Customer 클래스에 일반 고객의 속성과 기능이 이미 구현되어 있기에 VIPCustomer 클래스는 Customer 클래스를 상속받고 VIP 고객에게 필요한 추가 속성과 기능을 구현하는 것이다.

 

Customer 클래스를 상속한 VIPCustomer 클래스 구현

상당히 간단해진 VIPCustomer 클래스의 코드를 볼 수 있다. 상위 클래스인 Customer에 이미 선언되어 있는 멤버 변수나 메서드는 상속을 받아서 사용할 것이기에 구현하지 않았다. 그런데 위 코드에서 두 가지 문제가 있다. 첫 번째는 customerGrade 변수에 발생한 오류이다. 상위 클래스에 선언한 변수인데 오류가 나는 이유는 customerGrade는 private으로 선언한 변수이기 때문이다. 따라서 외부 클래스에서는 이 변수를 사용할 수 없다. 두 번째는 VIP 고객에게 제공하는 혜택인 할인율과 세일 가격을 어떻게 적용할지 구현하지 않았다. 

 

상위 클래스 변수를 사용하기 위한 protected 예약어

우선 cutomerGrade 변수에 발생한 오류부터 수정하자. 상위 클래스에서 private으로 선언한 변수나 메서드는 외부 클래스에서 사용할 수 없지만 하위 클래스에서는 사용할 수 있도록 지정하는 예약어가 protected이다. 상속받은 하위 클래스에서는 public처럼 사용할 수 있다. 이제 상위 클래스인 Customer에 있는 private 변수를 다른 하위 클래스에서 사용할 수 있도록 protected로 바꾸고 protected로 선언한 변수를 사용하기 위해 get( ), set( ) 메서드를 추가하자.

protected로 선언한 변수는 하위 클래스가 상속받게 되고, 외부 클래스에서는 private 변수처럼 get( ), set( ) 메서드를 이용해 값을 가져오거나 지정할 수 있다. 

 

테스트 프로그램 실행하기

시나리오:

일반 고객 1명과 VIP 고객 1명이 있다. 일반 고객의 이름은 개발 초보, 아이디는 10010이다. 이 고객은 지금 보너스 포인트 1,000점이 있다. VIP 고객의 이름은 간호사, 아이디는 10020이다. 이 고객의 현재 보너스 포인트는 10,000점이다.

출력 결과

 

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