자바에서 상속은 개념적으로는 부모 클래스의 멤버 변수와 메소드를 가져다 사용할 수 있는 자식 클래스를 생성하는 것이며, 구조적으로는 비슷한 클래스들의 공통되는 부분을 합쳐서 중복되는 코드를 줄일 수 있는 방법이다.
우테코 미션 중 하나인 블랙잭 게임을 예로 들어보면, 블랙잭 게임의 구성원은 한 명의 딜러와 여러 명의 플레이어로 나뉘는데, 이들이 취하는 행위는 서로 같은 것도 있고 다른 것도 있다.
딜러가 하는 행위는 -
- 시작할 때 카드를 두 장 받기
- 카드를 한 장만 보여주기
- 카드를 전부 보여주기
- 점수가 16 이하라면 한 장 더 뽑기
- 자기 점수를 계산하기
- 첫 2장의 합이 21이면 블랙잭 선언하기
- 점수가 21을 초과하면 버스트 선언하기
플레이어가 하는 행위는 -
- 시작할 때 카드를 두 장 받기
- 카드를 전부 보여주기
- 자신의 턴이 왔을 때 카드를 더 받을지 선택하기
- 자기 점수를 계산하기
- 첫 2장의 합이 21이면 블랙잭 선언하기
- 점수가 21을 초과하면 버스트 선언하기
이 중에서 볼드체로 되어있는 행위는 겹친다는 것을 알 수 있다. 그렇다면 이렇게 정리할 수 있다.
이 게임의 구성원이 하는 행위는 -
- 시작할 때 카드를 두 장 받기
- 카드를 전부 보여주기
- 자기 점수를 계산하기
- 첫 2장의 합이 21이면 블랙잭 선언하기
- 점수가 21을 초과하면 버스트 선언하기
딜러만 하는 행위는 -
- 카드를 한 장만 보여주기
- 점수가 16 이하라면 한 장 더 뽑기
플레이어만 하는 행위는 -
- 자신의 턴이 왔을 때 카드를 더 받을지 선택하기
이 때 구성원 클래스를 User라 한다면 Dealer와 Player 클래스가 User를 상속받아 각각 고유한 특징만을 직접 구현하고, 공통된 특징들은 공유하도록 할 수 있는 것이다.
`public abstract class User { ... }`
`public class Dealer extends User { ... } public class Player extends User { ... }`
이것은 상속을 통해 구현될 수 있다.
반면에 인터페이스는 구현을 일체 포함하지 않고, 메소드의 ‘껍데기’만을 포함하고 있다. 이는 인터페이스를 상속받는 클래스로 하여금 해당 기능들의 구현을 강제하게 한다.
`public interface PaymentMethod { void pay(int price); }`
`public class CashPaymentMethod extends PaymentMethod { ... public void pay(int price) { ... } } public class CardPaymentMethod extends PaymentMethod { ... public void pay(int price) { ... } }`
인터페이스를 쓰는 의의는 인터페이스로 변수 타입을 지정하면 그 인터페이스를 구현하는 클래스라면 무엇이든 넣을 수 있다는 것이다. 즉 쉽게 인터페이스의 구현체를 갈아끼워 기능을 변경할 수 있다.
`PaymentMethod paymentMethod = new CardPaymentMethod(); paymentMethod.pay();`
만약 paymentMethod를 결제를 담당하는 클래스 PaymentService의 생성자로 주입 받는다면, PaymentService의 코드를 하나도 바꾸지 않고도 카드와 현금 결제를 경우에 따라 처리하고, 상품권 결제 기능을 추가할 수도 있다. 이를 전략 패턴이라 한다.
Comments powered by Disqus.