Post

클래스란 무엇인가 [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라는걸 쓰게 되는데, 여기서 thisBurger클래스를 말합니다. 영어 해석 그대로 이것(이 클래스)인 셈이죠.
.~안에 라는 뜻입니다.

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();

새로운 클래스인 CheeseBurgerBurger클래스를 상속받아 만들었습니다.(extends는 확장이란 뜻이니 직역하자면 Burger의 개념을 확장하여 정도가 됩니다)

갑자기 생긴 super()는 상속받았던 클래스의 해당 함수, Burger 클래스의 constructor()를 실행시키겠다는 뜻입니다. 클래스에 내장되어 있는 기능입니다.

CheeseBurger 클래스 안에 end_of_burger() 함수가 없는데도 this로 호출할 수 있는건 상속받았던 Burger 클래스에 있는 것을 그대로 사용할 수 있기 때문입니다.

Burger로서 기본적으로 해야할 일들(시작하자마자 빵 두기, 마지막에 빵 덮기)이 이미 준비된 상태로 치즈버거일 때에만 해야할 일(치즈 넣기)만 신경써주면 치즈버거는 온전하게 만들어집니다.

더 더 다양하게, 더 더 복잡하게

mess
메뉴 관리에 능숙해져, 몇장 안되는 레시피로 더 많은 메뉴를 관리하다보면 구조상 비슷하게 동작하긴하나 기본 개념을 타파하는 방식의 레시피를 준비하고 싶어질지 모릅니다.

예를 들면 민트초코파인애플버거를 만들고 싶을지도 모르겠네요.
위 아래가 빵이 아닌 파인애플조각인 녀석으로 말이죠. 안돼

그 때부터는 다형성(Polymorphism)이라는 개념이 들어가는데 지금 다루지는 않을 예정입니다. 햄버거 예시로 지나가듯 쉽게 설명하자면 상속받은 클래스에서 일부 함수를 덮어씌워 재가공하는 방법(이 경우, end_of_burger() 에서 빵 대신 파인애플로 덮기) 같은걸 할 수 있습니다.

햄버거로는 설명하기 어려운 개념들이 있으니 다음에 다른 예시로 준비해볼께요.

This post is licensed under CC BY 4.0 by the author.