테스트 사이트 - 개발 중인 베타 버전입니다

JavaScript로 Class 없이 OOP 하기

· 9년 전 · 890 · 17

시작하며

한국 루비 커뮤니티 2015년 대림절 달력 첫 글을 JavaScript로 옮겨보겠습니다. 그냥 Copy&Paste해서 몇몇 부분만 고칠 거라 이상해도 양해 부탁드립니다.

OOP라고 하면 Class와 Instance 개념을 떠올리는 경우가 많습니다. 객체끼리 서로 협력한다는 기본 원리만 가지고도 프로그래밍이 가능하다면 어떻게 될까요? Class가 없는 언어 중 하나인 JavaScript(ES6 이전 기준)를 통해 Class 없는 OOP를 경험해 봅시다.

 

준비물

  • Node.js
  • 흥미
  • 용기
  • 사랑과 우정 (필수는 아님)

 

객체 만들기

간단한 객체를 만들어 봅시다. 일단 Node 인터프리터 환경을 실행하죠.

 

$ node

 

객체가 뭘까요? 객체를 설명하는 방법은 너무나도 많은데, 추상화 단계를 너무 높이지 않고 손에 만져지는 걸로 살펴봅시다. “한 소년이 있었습니다” 정도면 어떨까요?

 

var boy = new Object();

소년이 하나 만들어졌습니다. 제대로 잘 됐는지 한번 확인해 보죠.

 

console.log(boy);

결과:

{}

우리가 잘 아는 게 나왔죠? 그냥 빈 객체를 만들 땐 힘들게 `new Object` 하지 말고, 그냥 `{}` 쓰시면 됩니다.

 

객체에 특성 부여하기

소년을 소년이라고 부르니 뭔가 밋밋한 것 같네요. 소년에게 이름을 붙여주면 어떨까요? 무난하게 “강동원”이라고 합시다. 객체에 이름을 넣어주면 간단히 해결됩니다.

 

boy.name = 'Kang Dong-won';

자, 이제 소년의 이름을 한번 확인해 볼까요?

 

console.log(boy.name);

결과:

Kang Dong-won

또 다른 객체 만들기

소년은 혼자 있으니 슬펐습니다. 그러니 여자친구를 하나 만들어보죠.

 

var girl = Object.create(boy);

강동원을 프로토타입으로 소녀 객체가 만들어졌습니다. 강동원을 프로토타입으로 삼고 있기 때문에 한가지 문제가 있습니다. 소녀가 강동원가 똑같이 행동한다는 거죠.

 

console.log(girl.name);

결과:

Kang Dong-won

“그럴 땐 얘기를 나누자 거울 속의 나하고”가 아니라면 이 상황을 벗어나야겠죠? 여자친구에게 이름을 하나 지어줍시다.

 

girl.name = 'Don Don';

이제 둘을 사랑스럽게 엮어줄 수 있겠네요.

 

console.log([boy.name, girl.name].join(''));

결과:

Kang Dong-won ♥ Don Don

액션!

Class 없이 객체를 만들고, 특성을 부여하고, 이걸 활용하는 게 얼마나 쉬운지 우리는 경험했습니다. 강동원에게 구마 의식을 수행하게 하는 것도 이제는 쉽겠죠?

 

girl.bad = true;

// 소녀의 상태 확인
console.log(girl.bad);

// 강동원에게 구마 능력 부여
// ES6 arrow function 사용함. MDN 문서 참고: http://bit.ly/1NQfCfS
boy.performExorcism = target => { target.bad = false };

// 구마
boy.performExorcism(girl);

// 소녀의 상태 다시 확인
console.log(girl.bad);

 

정리하며

객체지향의 핵심은 객체입니다. 타입을 명확히 하고 싶어서 클래스를 사용하는 거죠. 이 둘을 명확히 구분해서 쓸 때, 유연함과 견고함의 균형을 맞출 수 있지 않을까요?

 

P.S. TypeScript도 한번 써보세요!

 

댓글 작성

댓글을 작성하시려면 로그인이 필요합니다.

로그인하기

댓글 17개

그분이 틀린 게 아니라, 벤지님께서 이해를 못 하고 계신 것 뿐입니다. 마지막으로 쓴 내용은 너무 쉬워서, 더이상 덧붙일 수 있는 게 없습니다. 해당 내용을 충분히 공부하고 실험해 보세요.

과장해서 하는 말이 아니라, 정말로 다들 이렇게 잘 쓰고 있습니다. 다들 잘 쓰는 걸 혼자 안 하는 건 혼자 손해보는 거죠. 이게 갑자기 나온 최신 기술이 아니라, 이미 오래된 전략이란 게 더 중요한 사실이죠.

이미 첫번째 답변에서 모든 답을 다 했다고 생각하기 때문에 더이상 덧붙일 건 없다고 생각합니다.
저의 글과 또 다른 얘기를.....
학교쪽에도 알아본 내용을 댓글로 계속 단것이고 M$ 메뉴얼에도 나와 있는데
Babel 만 사용하면 다 되시는것처럼 말씀하시니....

나중에 아실듯합니다.

즐거운 코딩되세요.
그냥 뭘 알아본다 같은 게 아니라, 공부하고 실무에서 써보고 하세요. 제발 자기가 아는 것만 얘기합시다. 해보지도 않은 것, 자기가 모르는 것, 이런 걸로 선입견을 가지고 있으니 오래된 기술조차 두려움을 가지고 기피하게 되는 겁니다.
엥......싸우게 되겠네요.....어느쪽이든 한쪽이 틀린거겠죠.
오래된 기술이라.....ㅎㅎㅎ

감정은 없습니다....즐거운 주말 되세요.
감정의 문제가 아니라, 틀린 내용을 작성해서 다른 사람들에게 악영향을 끼치는 게 문제입니다. 다들 잘 쓰고 있는 걸 시기상조란 이야기를 꺼내서 시도조차 못 하게 하는 건 낙후된 회사들의 전형적인 특징이거든요. 특히 PHP 개발자 커뮤니티에서 흔히 나타나는데, 그런 식으로 흘러가는 거 대단히 안 좋습니다.

Babel은 2014년에 나왔고, (다음에 소개하려고 하는) TypeScript는 2012년에 등장했습니다(이 친구는 별도의 플러그인 없이 처음부터 ES3까지 커버합니다). 이 정도가 오래된 기술로 여겨지지 않는다면, 우리의 기술에 대한 민감도가 너무 떨어지는 거죠.

다시 한번 반복하면, 공부하고 실험하고 그걸 내것으로 소화하고, 그렇게 해서 아는 걸 이야기해야 합니다.
제안을 하나 하겠습니다. 여기에 ES6로 코드를 작성하시면, 제가 그걸 IE8에서 제대로 돌아갈 수 있게 도와드리겠습니다. 탁상공론을 하는 것보다는, 실제로 어떻게 써먹는지 직접 보여드리는 게 좋을 것 같네요.
9년 전
좋아요 + 1

게시글 목록

번호 제목
20318
20317
20316
20315
20314
20313
20312
20311
20310
20309
20308
20307
20306
20303
20302
20301
20300
20299
20298
20297
20296
20295
20294
20293
20292
8222
20291
20290
20289
20288
20287
20286
20285
20284
20283
20282
20281
20280
20276
20275
20274
20273
8216
20272
20271
20270
20269
20268
20267
20265
20264
20263
20262
20261
20259
20258
20257
20256
20255
20254
20253
20252
20251
20250
20249
31028
20248
20247
20246
8215
20245
20244
20243
20242
20241
20240
20239
20238
20237
20236
20235
20234
20233
8197
20232
20231
20230
20229
20228
20227
20225
20224
20223
20222
20221
20220
20219
20218
20217
20216