Java] Encapsulation

캡슐화의 예시를 종합감기약을 예시로 들수 있다.

종합감기약을 먹으면 코감기와 재채기, 두통이 낫는다. (책의 예시에서는 코감기가 두 번…(?))

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());
/*
* 콧물 감기가 낫습니다!
* 재치기가 낫습니다!
* 코감기가 낫습니다!
* */
}
}

캡슐화는 보기에는 쉬우나, 범위를 결정하는 것이 쉽지 않다. 경험있는 프로그래머를 구분하는 첫 번째 기준이 된다고 한다.