77
88잠시 개발을 벗어나 현실 세계로 눈을 돌려, 내부 인터페이스와 외부 인터페이스 구분이 무엇을 의미하는지 알아봅시다.
99
10- 일상생활에서 접하게 되는 기계들은 꽤 복잡한 구조로 되어 있습니다. 하지만 내부인터페이스와 외부 인터페이스가 구분되어있기 때문에 문제없이 기계를 사용할 수 있습니다.
10+ 일상생활에서 접하게 되는 기계들은 꽤 복잡한 구조로 되어 있습니다. 하지만 내부 인터페이스와 외부 인터페이스가 구분되어 있기 때문에 문제없이 기계를 사용할 수 있습니다.
1111
1212## 실생활 예제
1313
1919
2020![ ] ( coffee-inside.jpg )
2121
22- 뭔가 디테일한 것들이 아주 많네요. 하지만 이 모든 것을 알지 못해도 커피 머신을 사용하는 데 지장이 없습니다.
22+ 뭔가 디테일한 것들이 아주 많네요. 하지만, 이 모든 것을 알지 못해도 커피 머신을 사용하는 데 지장이 없습니다.
2323
2424커피 머신은 꽤 믿음직한 기계입니다. 수년 간 사용할 수 있고, 중간에 고장이 나도 수리를 받으면 됩니다.
2525
4242
4343내부 인터페이스의 세부사항들은 서로의 정보를 이용하여 객체를 동작시킵니다. 발열 장치에 부착된 관을 통해 뜨거운 물이 이동하는 것처럼 말이죠.
4444
45- 그런데 커피 머신은 보호 커버에 둘러싸여 있기 때문에 보호 커버를 벗기지 않고는 커피머신 외부에서 내부로 접근할 수 없습니다. 밖에선 세부 요소를 알 수 없고, 접근도 불가능합니다. 내부 인터페이스의 기능은 외부 인터페이스를 통해야만 사용할 수 있습니다.
45+ 그런데 커피 머신은 보호 커버에 둘러싸여 있기 때문에 보호 커버를 벗기지 않고는 커피 머신 외부에서 내부로 접근할 수 없습니다. 밖에선 세부 요소를 알 수 없고, 접근도 불가능합니다. 내부 인터페이스의 기능은 외부 인터페이스를 통해야만 사용할 수 있습니다.
4646
4747이런 특징 때문에 외부 인터페이스만 알아도 객체를 가지고 무언가를 할 수 있습니다. 객체 안이 어떻게 동작하는지 알지 못해도 괜찮다는 점은 큰 장점으로 작용합니다.
4848
@@ -96,13 +96,9 @@ class CoffeeMachine {
9696 _waterAmount = 0 ;
9797
9898 set waterAmount (value ) {
99- <<<<<< < HEAD
100- if (value < 0 ) throw new Error (" 물의 양은 음수가 될 수 없습니다." );
101- ====== =
10299 if (value < 0 ) {
103100 value = 0 ;
104101 }
105- >>>>>> > upstream/ master
106102 this ._waterAmount = value;
107103 }
108104
@@ -119,19 +115,11 @@ class CoffeeMachine {
119115// 커피 머신 생성
120116let coffeeMachine = new CoffeeMachine (100 );
121117
122- <<<<<< < HEAD
123118// 물 추가
124- coffeeMachine .waterAmount = - 10 ; // Error: 물의 양은 음수가 될 수 없습니다 .
119+ coffeeMachine .waterAmount = - 10 ; // _waterAmount는 -10이 아닌 0이 됩니다 .
125120```
126121
127- 이제 물의 양을 0 미만으로 설정하면 실패합니다.
128- =======
129- // add water
130- coffeeMachine.waterAmount = -10; // _ waterAmount will become 0, not -10
131- ```
132-
133- Now the access is under control, so setting the water amount below zero becomes impossible.
134- >>>>>>> upstream/master
122+ 이제 접근을 통제할 수 있기 때문에 물의 양을 0 미만으로 설정하는 것은 불가능합니다.
135123
136124## 읽기 전용 프로퍼티
137125
@@ -173,11 +161,7 @@ class CoffeeMachine {
173161 _waterAmount = 0;
174162
175163 *!*setWaterAmount(value)*/!* {
176- <<<<<<< HEAD
177- if (value < 0) throw new Error("물의 양은 음수가 될 수 없습니다.");
178- =======
179164 if (value < 0) value = 0;
180- >>>>>>> upstream/master
181165 this._waterAmount = value;
182166 }
183167
@@ -191,7 +175,7 @@ new CoffeeMachine().setWaterAmount(100);
191175
192176다소 길어보이긴 하지만, 이렇게 함수를 선언하면 다수의 인자를 받을 수 있기 때문에 좀 더 유연합니다(위 예시에선 인자가 하나뿐이긴 하지만요).
193177
194- 반면 get, set 문법을 사용하면 코드가 짧아진다는 장점이 있습니다. 어떤걸 사용해야 한다는 규칙은 없으므로 원하는 방식을 선택해서 사용하세요.
178+ 반면 get, set 문법을 사용하면 코드가 짧아진다는 장점이 있습니다. 어떤 걸 사용해야 한다는 규칙은 없으므로 원하는 방식을 선택해서 사용하세요.
195179````
196180
197181``` smart header="protected 필드는 상속됩니다."
@@ -208,11 +192,7 @@ private 프로퍼티와 메서드는 제안(proposal) 목록에 등재된 문법
208192
209193private 프로퍼티와 메서드는 ` # ` 으로 시작합니다. ` # ` 이 붙으면 클래스 안에서만 접근할 수 있습니다.
210194
211- <<<<<<< HEAD
212- 물 용량 한도를 나타내는 private 프로퍼티 ` #waterLimit ` 과 남아있는 물의 양을 확인해주는 private 메서드 ` #checkWater ` 를 구현해봅시다.
213- =======
214- For instance, here's a private ` #waterLimit ` property and the water-checking private method ` #fixWaterAmount ` :
215- >>>>>>> upstream/master
195+ 예를 들어, 물 용량 한도를 나타내는 private 프로퍼티 ` #waterLimit ` 과 물의 양을 보정해주는 private 메서드 ` #fixWaterAmount ` 가 있습니다.
216196
217197``` js run
218198class CoffeeMachine {
@@ -221,15 +201,9 @@ class CoffeeMachine {
221201*/ ! *
222202
223203* ! *
224- <<<<<< < HEAD
225- #checkWater (value ) {
226- if (value < 0 ) throw new Error (" 물의 양은 음수가 될 수 없습니다." );
227- if (value > this .#waterLimit) throw new Error (" 물이 용량을 초과합니다." );
228- ====== =
229204 #fixWaterAmount (value ) {
230205 if (value < 0 ) return 0 ;
231206 if (value > this .#waterLimit) return this .#waterLimit;
232- >>>>>> > upstream/ master
233207 }
234208*/ ! *
235209
@@ -242,13 +216,8 @@ class CoffeeMachine {
242216let coffeeMachine = new CoffeeMachine ();
243217
244218* ! *
245- <<<<<< < HEAD
246- // 클래스 외부에서 private에 접근할 수 없음
247- coffeeMachine.#checkWater (); // Error
248- ====== =
249- // can't access privates from outside of the class
219+ // 클래스 외부에서 private에 접근할 수 없습니다.
250220coffeeMachine.#fixWaterAmount (123 ); // Error
251- >>>>>> > upstream/ master
252221coffeeMachine.#waterLimit = 1000 ; // Error
253222*/ ! *
254223```
@@ -269,11 +238,7 @@ class CoffeeMachine {
269238 }
270239
271240 set waterAmount (value ) {
272- <<<<<< < HEAD
273- if (value < 0 ) throw new Error (" 물의 양은 음수가 될 수 없습니다." );
274- ====== =
275241 if (value < 0 ) value = 0 ;
276- >>>>>> > upstream/ master
277242 this .#waterAmount = value;
278243 }
279244}
@@ -322,12 +287,12 @@ class User {
322287
323288객체 지향 프로그래밍에선 내부 인터페이스와 외부 인터페이스를 구분하는 것을 [ 캡슐화(encapsulation)] 라는 용어를 사용해 설명합니다.
324289
325- 캡슐화는 이점은 다음과 같습니다.
290+ 캡슐화의 이점은 다음과 같습니다.
326291
327292사용자가 자신의 발등을 찍지 않도록 보호
328- : 커피 머신를 함께 사용하는 개발팀이 있다고 상상해봅시다. "Best CoffeeMachine"이라는 회사에서 만든 이 커피 머신은 현재 잘 작동하고 있지만, 보호 커버가 없어서 내부 인터페이스가 노출되어있는 상황입니다.
293+ : 커피 머신을 함께 사용하는 개발팀이 있다고 상상해봅시다. "Best CoffeeMachine"이라는 회사에서 만든 이 커피 머신은 현재 잘 작동하고 있지만, 보호 커버가 없어서 내부 인터페이스가 노출되어 있는 상황입니다.
329294
330- 교양있는 팀원들은 모두 설계 의도에 맞게 커피 머신을 사용합니다. 그런데 어느 날 John이라는 개발자가 자신의 능력을 과신하며 커피 머신 내부를 살짝 만지게 됩니다. 이틀 후, 커피 머신은 고장이 나버렸죠.
295+ 교양 있는 팀원들은 모두 설계 의도에 맞게 커피 머신을 사용합니다. 그런데 어느 날 John이라는 개발자가 자신의 능력을 과신하며 커피 머신 내부를 살짝 만지게 됩니다. 이틀 후, 커피 머신은 고장이 나버렸죠.
331296
332297 커피 머신이 고장 난 건 John의 잘못이라기보다는, 보호 커버를 없애고 John이 마음대로 조작하도록 내버려 둔 사람의 잘못입니다.
333298
0 commit comments