한가지 간단한 상속을 통한 예제를 살펴보도록 하겠습니다. 시나리오는 전 장에서 구현해본 음식점 체인 사업관련 예제 이다. 우선 본사에서 메뉴에 대한 가격 메소드를 정해 주고, 매장에서는 주변 환경에 맞게 가격을 책정(overriding) 한다. 단. 지난번과 달이 본사에서는 메뉴만 정해 주고, 가격을 매장에 전부 위임 한다.
추상 클래스는 정의할테니, 꼭 재정의 해서 사용하라는 것이다. 예제를 보자.
HeadQuarterStore.java
package com.javalec.abstractex;
public abstract class HeadQuarterStore {
public HeadQuarterStore() {
}
public void method1() {
System.out.println();
}
public abstract void orderKimChijjige();
public abstract void orderBuDaejjige();
public abstract void orderBiBimbap();
public abstract void orderSunDaeguk();
public abstract void orderGongGibap();
}
abstract를 사용해서 메소드를 선언만해주었다. 어차피 무조건 재정의 해야 하기 때문에 저렇게 추상메소드는 아무것도 없는 메소드로 선언되는 것이다.
StoreNum1.java
package com.javalec.abstractex;
public class StoreNum1 extends HeadQuarterStore{
public StoreNum1() {
}
@Override
public void orderKimChijjige() {
System.out.println("4,500원 입니다.");
}
@Override
public void orderBuDaejjige() {
System.out.println("5,000원 입니다.");
}
@Override
public void orderBiBimbap() {
System.out.println("6,000원 입니다.");
}
@Override
public void orderSunDaeguk() {
System.out.println("5,000원 입니다.");
}
@Override
public void orderGongGibap() {
System.out.println("1,000원 입니다.");
}
}
이렇게 @Override를 통해서 재정의를 하는 것이다.
MainClass.java
package com.javalec.abstractex;
public class MainClass {
public static void main(String[] args) {
StoreNum1 storeNum1 = new StoreNum1();
storeNum1.orderKimChijjige();
storeNum1.orderBiBimbap();
}
}
메인클래스에서 바로 객체를 만들어주고 써보면 알 수 있다.
출력
4,500원 입니다.
6,000원 입니다.
그렇다면 왜 추상메소드가 필요할까?
객체지향 언어를 하다 보면 추상화 또는 추상개념 등의 ‘추상’이라는 말을 많이 접하게 된다. 프로그래밍에서 ‘추상'이라는 것은 일반생활에서의 ‘추상’과 동일하다. 어떤 행위(메소드)를 추상적으로 정의만 해놓고, 실제로 필요한 곳에서 필요에 따라서 재정의 하는 방식이다. 상속을 사용하다가, 자식클래스들에서 강제로 무엇인가 꼭 재정의 해서 사용해야 될 경우가 발생되면, 추상 개념을 먼저 생각 하면 좋다.
추상 개념은 객체지향 언어에서는 아주 중요한 의미가 있다. 그리고 추상적으로 프로그래밍을 한다는 것은 결코 쉬운 것은 아니다.
오늘은 추상 메소드와 추상 개념에대해 알아보았다. 재정의 하는 부분에서 코드를 훨씬 줄일 수 있다는게 큰 장점인 것 같다..