캡슐화의 예시를 종합감기약을 예시로 들수 있다.
종합감기약을 먹으면 코감기와 재채기, 두통이 낫는다. (책의 예시에서는 코감기가 두 번…(?))
Non-Encapsulation
아래의 소스는 캡슐화를 적용하지 않은 소스다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
| class SinivelCap { public void take() { System.out.println("콧물 감기가 낫습니다!"); } }
class SneezeCap { public void take() { System.out.println("재치기가 낫습니다!"); } }
class SnuffleCap { public void take() { System.out.println("코감기가 낫습니다!"); } }
class ColdPatiend { public void takeSinivelCap(SinivelCap cap) { cap.take(); } public void takeSneezeCap(SneezeCap cap) { cap.take(); } public void takeSnuffleCap(SnuffleCap cap) { cap.take(); } }
public class NotEncapsulation { public static void main(String[] args) { ColdPatiend sufferer = new ColdPatiend(); sufferer.takeSinivelCap(new SinivelCap()); sufferer.takeSneezeCap(new SneezeCap()); sufferer.takeSnuffleCap(new SnuffleCap()); } }
|
전체적으로 보면은 종합감기약 같지만 결국은 기능에 맞는 알약을 하나하나 먹는 것과 같다. 그래서 3개의 알약을 먹게 된다. 종합감기약과는 다른 의미가 되어버린다.
Encapsulation
그러면 이제 캡슐화(Encapsulation)을 이용해서 종합감기약의 기능을 구현해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
| class SinivelCap { public void take() { System.out.println("콧물 감기가 낫습니다!"); } }
class SneezeCap { public void take() { System.out.println("재치기가 낫습니다!"); } }
class SnuffleCap { public void take() { System.out.println("코감기가 낫습니다!"); } }
class Pill { private SinivelCap sinivelCap; private SneezeCap sneezeCap; private SnuffleCap snuffleCap;
public Pill() { sinivelCap = new SinivelCap(); sneezeCap = new SneezeCap(); snuffleCap = new SnuffleCap(); }
public void take() { sinivelCap.take(); sneezeCap.take(); snuffleCap.take(); } }
class ColdPatient { public void takePill(Pill pill) { pill.take(); } }
public class Encapsulation { public static void main(String[] args) { ColdPatient coldPatient = new ColdPatient(); coldPatient.takePill(new Pill());
} }
|
캡슐화는 보기에는 쉬우나, 범위를 결정하는 것이 쉽지 않다. 경험있는 프로그래머를 구분하는 첫 번째 기준이 된다고 한다.