클래스란 무엇인가 [2]
빵은 같아도 내용물은 달라야해
모든 메뉴에는 빵이 들어가지만 모든 메뉴에 치즈가 들어가진 않습니다.
우리는 보통 메뉴 이름을 통해서 내용물을 구분하니까 그렇게 동작하도록 해야겠어요.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Burger {
constructor(name: String) {
// 버거를 제작할 때 일단 바닥 빵을 둡니다.
switch(name) {
case 'cheese':
// 치즈버거는 치즈를 올릴 겁니다.
break;
}
this.end_of_burger();
}
end_of_burger() {
// 버거를 마무리할 때 맨 위에 빵으로 덮습니다.
}
}
...
var Burger = new Burger('cheese');
constructor()
도 함수와 동일하게 동작하기 때문에 인자 구성을 할 수 있습니다.
그리고는 this
라는걸 쓰게 되는데, 여기서 this
는 Burger
클래스를 말합니다. 영어 해석 그대로 이것(이 클래스)
인 셈이죠.
.
은 ~안에
라는 뜻입니다.
this.end_of_burger()
는 그러니까, 이 클래스에 안에 있는 end_of_burger() 함수를 쓰겠다는 뜻이 됩니다.
더 다양한, 더 짧은 구성을 위해
그런데 저런식으로 Burger 클래스를 구성하면 switch
구문이 엄청 길어지겠죠?
그러면 우리가 100장, 1000장의 레시피를 쓰는 것과 다를게 없어지잖아요..
그래서 클래스에는 확장이라는 개념이 있습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Burger {
constructor(name: String) {
// 버거를 제작할 때 일단 바닥 빵을 둡니다.
}
end_of_burger() {
// 버거를 마무리할 때 맨 위에 빵으로 덮습니다.
}
}
class CheeseBurger extends Burger {
constructor() {
super(); // 여기서 바닥 빵을 둡니다.
// 치즈버거에는 치즈가 들어갑니다.
this.end_of_burger(); // 빵 덮기
}
}
...
var NewBurger = new CheeseBurger();
새로운 클래스인 CheeseBurger
는 Burger
클래스를 상속받아 만들었습니다.(extends는 확장이란 뜻이니 직역하자면 Burger의 개념을 확장하여 정도가 됩니다)
갑자기 생긴 super()
는 상속받았던 클래스의 해당 함수, Burger 클래스의 constructor()
를 실행시키겠다는 뜻입니다. 클래스에 내장되어 있는 기능입니다.
CheeseBurger
클래스 안에 end_of_burger()
함수가 없는데도 this
로 호출할 수 있는건 상속받았던 Burger 클래스에 있는 것을 그대로 사용할 수 있기 때문입니다.
Burger
로서 기본적으로 해야할 일들(시작하자마자 빵 두기, 마지막에 빵 덮기)이 이미 준비된 상태로 치즈버거일 때에만 해야할 일(치즈 넣기)만 신경써주면 치즈버거는 온전하게 만들어집니다.
더 더 다양하게, 더 더 복잡하게
메뉴 관리에 능숙해져, 몇장 안되는 레시피로 더 많은 메뉴를 관리하다보면 구조상 비슷하게 동작하긴하나 기본 개념을 타파하는 방식의 레시피를 준비하고 싶어질지 모릅니다.
예를 들면 민트초코파인애플버거
를 만들고 싶을지도 모르겠네요.
위 아래가 빵이 아닌 파인애플조각인 녀석으로 말이죠. 안돼
그 때부터는 다형성(Polymorphism)
이라는 개념이 들어가는데 지금 다루지는 않을 예정입니다. 햄버거 예시로 지나가듯 쉽게 설명하자면 상속받은 클래스에서 일부 함수를 덮어씌워 재가공하는 방법(이 경우, end_of_burger() 에서 빵 대신 파인애플로 덮기) 같은걸 할 수 있습니다.
햄버거로는 설명하기 어려운 개념들이 있으니 다음에 다른 예시로 준비해볼께요.