-
윈스턴 생성 프로그램을 가지고 시작할게요
-
새로운 개체 타입 Hopper를 추가했어요
-
호퍼가 외로워보였어요
그래서 윈스턴이랑 똑같이 정의를 했어요
-
생성자를 이용하여 특성을 정의할 수 있고요
그릴 수도 있으며
-
말할 수도 있고요
제가 이번에 새롭게 추가한
-
Horray입니다
호퍼는 축하하는 것을 좋아하는데 반면
-
윈스턴은 그렇지 않죠
그리고 밑부분에는 Hopper 객체를 2개 생성하였습니다
-
Little Hopper와 Big Hopper로 말이죠
-
이들을 그리고 말도 할 수 있고
만세도 할 수 있게 해줬어요
-
괜찮네요
-
여기 코드를 보면요
-
흥미로운 것을 발견할 수 있습니다
-
호퍼와 윈스턴의 코드가 유사하다는 것을 말이죠
생성자를 보면 talk 함수가
-
예전에 우리가 썼던 윈스턴의
talk 함수와 똑같다는 것을 알 수 있습니다
-
그리고 같은 draw 함수를 갖고 있고요
-
이 두 객체타입에는 공통점이 많습니다
-
이 세계에서는 호퍼와 윈스턴이
매우 비슷한 특성을 갖기 때문이죠
-
컴퓨터 밖 실제 세계에서 생각해본다면
-
대부분의 객체 타입들은 유사점들을
공유하고 있을 것입니다
-
다른 객체들과 말이죠
-
예를 들어 동물 왕국에서는
-
모든 동물은 비슷한 특성을 갖고 있습니다
하지만 서로 다른 동물 종이 있지요
-
인간과 같이 말이죠
인간은 동물이라는 점에서 유사성을 띄고 있지만
-
인간 고유의 특성을 가지고 있습니다
-
그래서
-
animal 타입은 human 타입에서
상속하는 객체 타입입니다
-
주석으로 시작할게요
우리는 animal 에 속해 있죠
-
모든 동물은 소리를 내죠
-
인간도 언어를 구사하죠
-
그래서 객체 상속의 개념은
-
프로그래밍할 때 유용합니다
-
여러 객체 상속을 자바스크립트에서
구현할 수 있습니다
-
그래서 이제 생각해야 될 것은
-
'객체 타입으로 공유할 특성이 무엇인가' 입니다
-
그리고 그것의 이름도 생각해 봅시다
-
새로운 객체타입을 만들 것이고
-
기존의 객체를 대표해야 합니다
-
그들을 이제 creature 이라고 합시다
-
그들은 모두 생명체입니다
-
var creature = 이고요
생성자도 필요하겠죠
-
호퍼와 윈스턴의 생성자의 내용을 복사합시다
-
좋아요
-
그러면 봅시다
-
이제
-
이제 뭘해야죠?
-
이제 "talk" 함수를 추가합시다
-
talk 함수는 호퍼에서 가져옵시다
물론 Creature.prototype 으로 고치고요
-
좋아요
-
이제 생명체 객체 타입을 만들었어요
-
그러면 우리는 이제 호퍼도 생명체라는
-
creature 객체임을 밝혀주어야 합니다
-
여기에다가 적어줄게요
-
Hopper.prototype = Object.create(Creature.prototype)
-
이 줄이 의미하는 것은 호퍼의 프로토타입이
생명체 프로토타입에 바탕이 된다는 것입니다
-
이제 호퍼의 함수를 호출할 때마다
호퍼 프로토타입에서 먼저 검색하지만
-
없다면 생명체 프로토타입에서 찾아볼 것입니다
-
이것을 프로토타입 체인이라고 합니다
-
이것을 했다면 기존의 talk 함수는
지워버려도 되겠죠?
-
호퍼에서 말이죠
-
이제 생명체 객체 타입에도 있으니깐요
-
이 함수는 프로토타입 체인으로 있겠죠
-
오호라
-
됐어요!
-
생명체 프로토타입이 호출되어서 실행이 됐어요
-
이제 윈스턴 것도 지워볼게요
-
talk라는 메소드가 없어서 오류가 나네요
-
왜 그럴까요?
윈스턴 생성자도 있고
-
draw 도 있는데 talk 만 없어요
-
윈스턴의 프로토타입이 생명체 프로토타입이
-
되어야하는 것을 깜빡했네요
-
매우 중요한 문장이예요
-
Winston.prototype = Object.create(Creature.prototype)
-
짜잔!
-
중요한 거예요
-
생성자 바로 뒤에 이 문장을 썼고
프로토타입에 무엇인가를 추가하기 전에 썼어요
-
보통 이런 식으로 하게 됩니다
-
시작할 때에는
-
프로토타입이 상속되어 있는 곳을 씁니다
-
그리고 나서야 프로토타입에 추가할 수 있습니다
-
왜냐하면 만약에 윈스턴이나 호퍼에게
특별한 것이 있다면
-
생명체 프로토타입에는 없어야죠
-
그리고 이들을 사용하므로써 좋아졌네요
-
근데 아직 반복되는 코드가 남아있어요
-
생성자 코드입니다
-
맞죠? 3번이나 있어요
-
그냥 지우면 안 될까요?
-
해봅시다
-
음.. 별로 좋아보이지는 않네요
-
호퍼가 좌측상단에 있고요
자신의 정보가 모두 사라졌어요
-
자바스크립트에서 프로토타입을 상속하더라도
같은 생성자를 쓸 수는 없기 때문이예요
-
그러면 이런 객체들을 위한 생성자를 정의해봅시다
-
객체에서 생성자를 부르기 쉽도록 말이죠
-
우리가 해야될 것은
-
Creature.call(this, nickname, age, x, y)
-
실행되었네요
이것이 뜻하는 바는 바로
-
creature의 생성자 함수를 부르는 것입니다
-
이 함수를 부르면 생성자 함수에 넣고 싶은 정보를
전달이 되고
-
마치 호퍼 객체의 생성자인 듯이 호출됩니다
-
그리고 괄호 안에 있는 인자가 전달이 됩니다
-
이 인자들은 아까 호퍼가 호출받은 정보들입니다
-
마치 위의 생성자가 호퍼 속에 있는 것처럼 됩니다
-
이것이 우리가 원하는 바입니다
실행됐어요
-
이제 우리는
-
이 문장을 윈스턴에도 붙여넣읍시다
-
성공했어요!
-
정리해볼게요 우리는 공유된 속성과 함수를
creature라는 하나의 객체 타입에 넣었어요
-
그리고 이것을 바탕으로 2개의
객체 타입을 만들었고요
-
이들은 몇 개의 함수를 상속받지만
그들만의 함수도 있습니다
-
주목해야 할 점은 공유된 특성을 한 곳에서
수정할 수 있다는 점입니다
-
만약에 age를 바꾸고 싶다면
여기에 "+ years old" 써주면
-
모두 끝에 years old 가 붙을 거예요
-
아니면 talk 함수에 "sup"을 대입시키면
이제 윈스턴과 호퍼도 "sup"을 외칠 거예요
-
이제 당신은 기본 객체 타입으로부터 상속시켜
새로운 객체 타입을 만드는 방법을 알게 되었습니다
-
여러분은 '상속'이 그림, 애니메이션, 시뮬레이션 및 게임에
유용하게 이용될 수 있음을 알 수 있어요
-
예를 들어 게임을 생각해보면
상당히 많은 종류의 캐릭터가 있어요
-
전부 뛸 수는 있지만 몇 명은 점프를 못합니다
-
이런 예에서 상속을 적용한다면 아주 쉽게 구현할 수 있지요
-
여러분은 이것 말고도 적용방안을 생각해 낼 수 있을 것이라 믿습니다