You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: 1-js/04-object-basics/04-object-methods/article.md
+46-46Lines changed: 46 additions & 46 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -38,7 +38,7 @@ user.sayHi(); // 안녕하세요!
38
38
39
39
이렇게 객체 프로퍼티에 할당된 함수를 *메서드(method)* 라고 부릅니다.
40
40
41
-
위 예시에선 `user`의`sayHi`가 메서드이죠.
41
+
위 예시에선 `user`에 할당된`sayHi`가 메서드이죠.
42
42
43
43
메서드는 아래와 같이 이미 정의된 함수를 이용해서 만들 수도 있습니다.
44
44
@@ -63,7 +63,7 @@ user.sayHi(); // 안녕하세요!
63
63
```smart header="객체 지향 프로그래밍"
64
64
객체를 사용하여 개체를 표현하는 방식을 [객체 지향 프로그래밍(object-oriented programming, OOP)](https://en.wikipedia.org/wiki/Object-oriented_programming) 이라 부릅니다.
65
65
66
-
OOP는 그 자체만으로도 학문의 분야를 만드는 중요한 주제입니다. 올바른 개체를 선택하는 방법, 개체 사이의 상호작용을 나타내는 방법 등에 관한 의사결정은 (객체 지향) 설계를 기반으로 이뤄집니다. 관련 추천도서로는 에릭 감마의 "GoF의 디자인 패턴", 그래디 부치의 "UML을 활용한 객체지향 분석 설계" 등이 있습니다.
66
+
OOP는 그 자체만으로도 학문의 분야를 만드는 중요한 주제입니다. 올바른 개체를 선택하는 방법, 개체 사이의 상호작용을 나타내는 방법 등에 관한 의사결정은 객체 지향 설계를 기반으로 이뤄집니다. 객체 지향 프로그래밍 관련 추천도서로는 에릭 감마의 'GoF의 디자인 패턴', 그래디 부치의 'UML을 활용한 객체지향 분석 설계' 등이 있습니다.
67
67
```
68
68
### 메서드 단축 구문
69
69
@@ -88,19 +88,19 @@ user = {
88
88
};
89
89
```
90
90
91
-
위처럼 `"function"`을 생략해도 메서드를 정의할 수 있습니다.
91
+
위처럼 `function`을 생략해도 메서드를 정의할 수 있습니다.
92
92
93
93
일반적인 방법과 단축 구문을 사용한 방법이 완전히 동일하진 않습니다. 객체 상속과 관련된 미묘한 차이가 존재하는데 지금으로선 이 차이가 중요하지 않기 때문에 넘어가도록 하겠습니다.
94
94
95
-
## 메서드와 "this"
95
+
## 메서드와 'this'
96
96
97
97
메서드는 객체에 저장된 정보에 접근할 수 있어야 제 역할을 할 수 있습니다. 모든 메서드가 그런 건 아니지만, 대부분의 메서드가 객체 프로퍼티의 값을 활용합니다.
98
98
99
-
`user.sayHi()`의 내부 코드에서 객체 `user`에 저장된 이름(name)을 이용해 인사말을 만드는 경우가 이런 경우에 속합니다.
99
+
`user.sayHi()`의 내부 코드에서 객체 `user`에 저장된 이름(name)을 이용해 인사말을 만드는 경우가 이런 경우에 속합니다.
100
100
101
101
**메서드 내부에서 `this` 키워드를 사용하면 객체에 접근할 수 있습니다.**
102
102
103
-
"점 앞"의 `this`는 객체를 나타냅니다. 정확히는 메서드를 호출할 때 사용된 객체를 나타내죠.
103
+
이때 '점 앞'의 `this`는 객체를 나타냅니다. 정확히는 메서드를 호출할 때 사용된 객체를 나타내죠.
104
104
105
105
예시:
106
106
@@ -111,7 +111,7 @@ let user = {
111
111
112
112
sayHi() {
113
113
*!*
114
-
//"this"는 "현재 객체"를 나타냅니다.
114
+
//'this'는 '현재 객체'를 나타냅니다.
115
115
alert(this.name);
116
116
*/!*
117
117
}
@@ -132,16 +132,16 @@ let user = {
132
132
133
133
sayHi() {
134
134
*!*
135
-
alert(user.name); //"this" 대신 "user"를 이용함
135
+
alert(user.name); //'this' 대신 'user'를 이용함
136
136
*/!*
137
137
}
138
138
139
139
};
140
140
```
141
141
142
-
그런데 이렇게 외부 변수를 사용해 객체를 참조하면 예상치 못한 에러가 발생할 수 있습니다. `user`를 복사해 다른 변수에 할당(`admin = user`)하고, `user`는 전혀 다른 값으로 덮어썼다고 가정해 봅시다. sayHi()는 원치 않는 값(null)을 참조할 겁니다.
142
+
그런데 이렇게 외부 변수를 사용해 객체를 참조하면 예상치 못한 에러가 발생할 수 있습니다. `user`를 복사해 다른 변수에 할당(`admin = user`)하고, `user`는 전혀 다른 값으로 덮어썼다고 가정해 봅시다. `sayHi()`는 원치 않는 값(null)을 참조할 겁니다.
143
143
144
-
실제 코드를 이용해 에러를 만들어 보겠습니다.
144
+
예시:
145
145
146
146
```js run
147
147
let user = {
@@ -179,7 +179,7 @@ function sayHi() {
179
179
180
180
`this` 값은 런타임에 결정됩니다. 컨텍스트에 따라 달라지죠.
181
181
182
-
동일한 함수라도 다른 객체에서 호출했다면 "this"가 참조하는 값이 달라집니다.
182
+
동일한 함수라도 다른 객체에서 호출했다면 'this'가 참조하는 값이 달라집니다.
183
183
184
184
```js run
185
185
let user = { name:"John" };
@@ -190,17 +190,17 @@ function sayHi() {
190
190
}
191
191
192
192
*!*
193
-
//다른 객체에서 동일한 함수를 사용함
193
+
//별개의 객체에서 동일한 함수를 사용함
194
194
user.f= sayHi;
195
195
admin.f= sayHi;
196
196
*/!*
197
197
198
-
//"this"는 "점(.) 앞의" 객체를 참조하기 때문에
198
+
//'this'는 '점(.) 앞의' 객체를 참조하기 때문에
199
199
// this 값이 달라짐
200
200
user.f(); // John (this == user)
201
201
admin.f(); // Admin (this == admin)
202
202
203
-
admin['f'](); // Admin (점(.)과 대괄호는 동일하게 동작함)
203
+
admin['f'](); // Admin (점과 대괄호는 동일하게 동작함)
204
204
```
205
205
206
206
규칙은 간단합니다. `obj.f()`를 호출했다면 `this`는 `f`를 호출하는 동안의 `obj`입니다. 위 예시에선 `obj`가 `user`나 `admin`을 참조하겠죠.
@@ -218,25 +218,25 @@ sayHi(); // undefined
218
218
219
219
위와 같은 코드를 엄격 모드에서 실행하면, `this`엔 `undefined`가 할당됩니다. `this.name`으로 name에 접근하려고 하면 에러가 발생하죠.
220
220
221
-
그런데 엄격 모드가 아닐 때는 `this`가 *전역 객체*를 참조합니다(브라우저 환경에선 `window`. 전역 객체는 [](info:global-object)에서 자세히 다룰 예정입니다). 이런 동작 차이는 `"use strict"`가 도입된 배경이기도 합니다.
221
+
그런데 엄격 모드가 아닐 때는 `this`가 *전역 객체*를 참조합니다. 브라우저 환경에선 `window`라는 전역 객체를 참조하죠. 이런 동작 차이는 `"use strict"`가 도입된 배경이기도 합니다. 전역 객체는 [](info:global-object)에서 자세히 다룰 예정입니다.
222
222
223
223
이런 식의 코드는 대게 실수로 작성된 경우가 많습니다. 함수 본문에 `this`가 사용되었다면, 객체 컨텍스트 내에서 함수를 호출할 것이라고 예상하시면 됩니다.
224
224
````
225
225
226
226
```smart header="자유로운 `this`가 만드는 결과"
227
-
다른 언어를 사용하다 자바스크립트로 넘어온 개발자는 `this`를 혼동하기 쉽습니다. `this`는 항상 메서드가 정의된 객체를 참조할 것이라고 착각하죠. 이런 개념을 "bound `this`"라고 부릅니다.
227
+
다른 언어를 사용하다 자바스크립트로 넘어온 개발자는 `this`를 혼동하기 쉽습니다. `this`는 항상 메서드가 정의된 객체를 참조할 것이라고 착각하죠. 이런 개념을 'bound `this`'라고 합니다.
228
228
229
-
자바스크립트에서 `this`는 런타임에 결정됩니다. 메서드가 어디서 정의되었는지에 상관없이 `this`는 "점 앞의" 객체가 무엇인가에 따라 "자유롭게" 결정됩니다.
229
+
자바스크립트에서 `this`는 런타임에 결정됩니다. 메서드가 어디서 정의되었는지에 상관없이 `this`는 '점 앞의' 객체가 무엇인가에 따라 '자유롭게' 결정됩니다.
230
230
231
231
이렇게 `this`가 런타임에 결정되면 좋은 점도 있고 나쁜 점도 있습니다. 함수(메서드)를 하나만 만들어 여러 객체에서 재사용할 수 있다는 것은 장점이지만, 이런 유연함이 실수로 이어질 수 있다는 것은 단점입니다.
232
232
233
-
자바스크립트가 this를 다루는 방식이 좋은지, 나쁜지는 우리가 판단할 문제가 아닙니다. 개발자는 this의 동작 방식을 충분히 이해하고, 장점을 취하면서 실수를 피하는 데만 집중하면 됩니다.
233
+
자바스크립트가 `this`를 다루는 방식이 좋은지, 나쁜지는 우리가 판단할 문제가 아닙니다. 개발자는 `this`의 동작 방식을 충분히 이해하고 장점을 취하면서 실수를 피하는 데만 집중하면 됩니다.
234
234
```
235
235
236
236
## 참조 타입
237
237
238
238
```warn header="심화 학습"
239
-
이번 절은 특정 에지 케이스(edge case)를 설명하기 위해 작성된 심화 내용입니다.
239
+
이번 절에선 특정 에지 케이스(edge case)를 설명하기 위해 작성된 심화 내용을 다룹니다.
240
240
241
241
튜토리얼을 빠르게 학습하고 싶다면 넘어가거나 미뤄도 괜찮습니다.
242
242
```
@@ -258,30 +258,30 @@ user.hi(); // John (간단한 호출은 의도한 대로 잘 동작합니다.)
258
258
*/!*
259
259
```
260
260
261
-
마지막 줄에서 조건부 연산자를 사용해 `user.hi`나 `user.bye` 중 하나가 호출되도록 했습니다. user의 name이 "John"이므로 결과는 `user.hi`가 될 것입니다.
261
+
마지막 줄에서 조건부 연산자를 사용해 `user.hi`나 `user.bye` 중 하나가 호출되도록 했습니다. user의 name이 "John"이므로 `user.hi`가 호출될 것이라 예상하며 말이죠.
262
262
263
-
`()`가 있어서 메서드 hi가 즉시 호출될 것이라 예상했는데, 에러가 발생했습니다.
263
+
그런데 에러가 발생했습니다. 뒤에 `()`가 있어서 메서드 hi가 즉시 호출될 것이라 예상했는데 원하는 대로 되지 않았네요.
264
264
265
-
에러는 메서드를 호출할 때 `"this"`에 `undefined`가 할당되어있기 때문에 발생했습니다.
265
+
에러는 메서드를 호출할 때 `"this"`에 `undefined`가 할당되었기 때문에 발생했습니다.
`hi = user.hi`는 함수를 변수에 할당해주는데, 마지막 줄 코드와는 완전히 독립적으로 동작하므로 `this`엔 아무런 값도 저장되지 않습니다.
301
+
`hi = user.hi`에선 함수가 변수에 할당됩니다. 그런데 마지막 줄과는 완전히 독립적으로 동작하므로 `this`엔 아무런 값도 저장되지 않습니다.
302
302
303
-
**`user.hi()`를 의도한 대로 동작시키기 위해 자바스크립트는 속임수를 사용합니다. `'.'`은 함수가 아닌, [참조 타입(Reference Type)](https://tc39.github.io/ecma262/#sec-reference-specification-type) 값을 반환하게 합니다.**
303
+
**`user.hi()`를 의도한 대로 동작시키기 위해 자바스크립트는 속임수를 사용합니다. `'.'`가 함수가 아닌, [참조 타입(Reference Type)](https://tc39.github.io/ecma262/#sec-reference-specification-type) 값을 반환하게 하죠.**
304
304
305
-
참조 타입은 "명세에서만 사용되는 타입(specification type)"입니다. 개발자가 실제론 사용할 수 없는 자료형입니다.
305
+
참조 타입은 '명세에서만 사용되는 타입(specification type)'입니다. 개발자가 실제론 사용할 수 없는 자료형입니다.
306
306
307
-
참조 타입 값은 `(base, name, strict)`이 조합된 형태입니다.
307
+
참조 타입 값은 `(base, name, strict)`이 조합된 형태를 띱니다.
308
308
309
-
- `base`: 객체,
310
-
- `name`: 프로퍼티의 이름,
311
-
- `strict`: 엄격 모드에선 true임
309
+
- `base`: 객체
310
+
- `name`: 프로퍼티의 이름
311
+
- `strict`: 엄격 모드에서 true
312
312
313
-
`user.hi`로 프로퍼티에 접근하면 함수가 아닌, 참조 타입 값을 반환합니다. 엄격 모드였다면 아래와 같은 값이 반환되었겠죠.
313
+
`user.hi`로 프로퍼티에 접근하면 함수가 아닌, 참조 타입 값을 반환합니다. 엄격 모드였다면 아래와 같은 값이 반환됩니다.
314
314
315
315
```js
316
316
// 참조 타입 값
317
317
(user, "hi", true)
318
318
```
319
319
320
-
참조형 값에 괄호 `()`를 붙여 호출하면 객체, 객체의 메서드와 연관된 모든 정보를 받습니다. 이 정보를 이용해 `this`(`=user`)를 결정합니다.
320
+
참조형 값에 괄호 `()`를 붙여 호출하면 객체, 객체의 메서드와 연관된 모든 정보를 받습니다. 이 정보를 이용해 `this`(`=user`)가 결정됩니다.
321
321
322
-
참조 타입은 "중개인" 역할을 하는 특별한 내부 타입으로, 점 `.`연산에서 알아낸 정보를 괄호 `()`로 전달해주는 역할을 합니다.
322
+
참조 타입은 '중개인' 역할을 하는 특별한 내부 타입으로, 점 `.`연산에서 알아낸 정보를 괄호 `()`로 전달해주는 역할을 합니다.
323
323
324
-
점 연산 이외의 연산(할당 연산 등)은 참조 타입을 통째로 버리고 `user.hi`(함수) 값만 받아 전달합니다. 이런 과정 중에 `this` 정보가 사라집니다.
324
+
그런데 점 연산 이외의 연산(할당 연산 등)은 참조 타입을 통째로 버리고 `user.hi`(함수) 값만 받아 전달합니다. 이런 과정 때문에 `this` 정보가 사라지는 것입니다.
325
325
326
326
`obj.method()` 같이 점을 사용하거나, `obj[method]()` 같이 대괄호를 사용해 함수를 호출했을 때만 `this` 값이 의도한 대로 전달됩니다. 이런 문제는 [func.bind()](/bind#solution-2-bind) 등을 이용하면 해결 할 수 있는데, 이에 대해선 추후에 알아보도록 하겠습니다.
327
327
328
-
## "this"가 없는 화살표 함수
328
+
## 'this'가 없는 화살표 함수
329
329
330
-
화살표 함수는 일반 함수와는 다르게 "고유한" `this`를 가지지 않습니다. 화살표 함수에서 `this`를 참조하면, (화살표 함수가 아닌) "평범한" 외부 함수에서 `this` 값을 가져옵니다.
330
+
화살표 함수는 일반 함수와는 달리 '고유한' `this`를 가지지 않습니다. 화살표 함수에서 `this`를 참조하면, 화살표 함수가 아닌 '평범한' 외부 함수에서 `this` 값을 가져옵니다.
331
331
332
-
아래 예시에서 함수 `arrow()`의 `this`는 외부 함수 `user.sayHi()`의 `this`를 사용합니다.
332
+
아래 예시에서 함수 `arrow()`의 `this`는 외부 함수 `user.sayHi()`의 `this`가 됩니다.
333
333
334
334
```js run
335
335
let user = {
336
-
firstName: "Ilya",
336
+
firstName: "보라",
337
337
sayHi() {
338
338
let arrow = () => alert(this.firstName);
339
339
arrow();
340
340
}
341
341
};
342
342
343
-
user.sayHi(); // Ilya
343
+
user.sayHi(); // 보라
344
344
```
345
345
346
346
별개의 `this`가 만들어지는 건 원하지 않고, 외부 컨텍스트에 있는 `this`를 이용하고 싶은 경우 화살표 함수가 유용합니다. 이에 대한 자세한 내용은 별도의 챕터, <info:arrow-functions>에서 다루겠습니다.
347
347
348
348
349
349
## 요약
350
350
351
-
- 객체 프로퍼티에 저장된 함수를 "메서드"라고 부릅니다.
352
-
- `object.doSomthing()`은 객체를 "행동"할 수 있게 해줍니다.
351
+
- 객체 프로퍼티에 저장된 함수를 '메서드'라고 부릅니다.
352
+
- `object.doSomthing()`은 객체를 '행동'할 수 있게 해줍니다.
353
353
- 메서드는 `this`로 객체를 참조합니다.
354
354
355
355
`this` 값은 런타임에 결정됩니다.
356
356
- 함수를 선언할 때 `this`를 사용할 수 있습니다. 다만, 함수가 호출되기 전까지 `this`엔 값이 할당되지 않습니다.
357
357
- 함수를 복사해 객체 간 전달할 수 있습니다.
358
-
- 함수를 객체 프로퍼티에 저장해 `object.method()`같이 "메서드" 형태로 호출하면 `this`는 `object`를 참조합니다.
358
+
- 함수를 객체 프로퍼티에 저장해 `object.method()`같이 '메서드' 형태로 호출하면 `this`는 `object`를 참조합니다.
359
359
360
360
화살표 함수는 자신만의 `this`를 가지지 않는다는 점에서 독특합니다. 화살표 함수 안에서 `this`를 사용하면, 외부에서 `this` 값을 가져옵니다.
0 commit comments