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/06-constructor-new/article.md
+32-32Lines changed: 32 additions & 32 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,15 +1,15 @@
1
-
# 'new' 연산자와 생성자 함수
1
+
# new 연산자와 생성자 함수
2
2
3
3
객체 리터럴 `{...}` 을 사용하면 객체를 쉽게 만들 수 있습니다. 그런데 개발을 하다 보면 유사한 객체를 여러 개 만들어야 할 때가 생기곤 합니다. 복수의 사용자, 메뉴 내 다양한 아이템을 객체로 표현하려고 하는 경우가 그렇죠.
4
4
5
-
`"new"` 연산자와 생성자 함수를 사용하면 유사한 객체 여러 개를 쉽게 만들 수 있습니다.
5
+
`'new'` 연산자와 생성자 함수를 사용하면 유사한 객체 여러 개를 쉽게 만들 수 있습니다.
6
6
7
7
## 생성자 함수
8
8
9
9
생성자 함수(constructor function)와 일반 함수에 기술적인 차이는 없습니다. 다만 생성자 함수는 아래 두 관례를 따릅니다.
10
10
11
11
1. 함수 이름의 첫 글자는 대문자로 시작합니다.
12
-
2. 반드시 `"new"` 연산자를 붙여 실행합니다.
12
+
2. 반드시 `'new'` 연산자를 붙여 실행합니다.
13
13
14
14
예시:
15
15
@@ -20,10 +20,10 @@ function User(name) {
20
20
}
21
21
22
22
*!*
23
-
let user =newUser("Jack");
23
+
let user =newUser("보라");
24
24
*/!*
25
25
26
-
alert(user.name); //Jack
26
+
alert(user.name); //보라
27
27
alert(user.isAdmin); // false
28
28
```
29
29
@@ -51,20 +51,20 @@ function User(name) {
51
51
}
52
52
```
53
53
54
-
이제 `let user = new User("Jack")`는 아래 코드를 입력한 것과 동일하게 동작합니다.
54
+
이제 `let user = new User("보라")`는 아래 코드를 입력한 것과 동일하게 동작합니다.
55
55
56
56
```js
57
57
let user = {
58
-
name:"Jack",
58
+
name:"보라",
59
59
isAdmin:false
60
60
};
61
61
```
62
62
63
-
`new User("Jack")`이외에도 `new User("Ann")`, `new User("Alice")` 등을 이용하면 손쉽게 사용자 객체를 만들 수 있습니다. 객체 리터럴 문법으로 일일이 객체를 만드는 방법보다 훨씬 간단하고 읽기 쉽게 객체를 만들 수 있게 되었죠.
63
+
`new User("보라")`이외에도 `new User("호진")`, `new User("지민")` 등을 이용하면 손쉽게 사용자 객체를 만들 수 있습니다. 객체 리터럴 문법으로 일일이 객체를 만드는 방법보다 훨씬 간단하고 읽기 쉽게 객체를 만들 수 있게 되었죠.
64
64
65
65
생성자의 의의는 바로 여기에 있습니다. 재사용할 수 있는 객체 생성 코드를 구현하는 것이죠.
66
66
67
-
잠깐! 모든 함수는 생성자 함수가 될 수 있다는 점을 잊지 마시기 바랍니다. `new`를 붙여 실행한다면 어떤 함수라도 위에 언급된 알고리즘이 실행됩니다. 이름 "첫 글자가 대문자"인 함수는 `new`를 붙여 실행해야 한다는 점도 잊지 마세요. 공동의 약속이니까요.
67
+
잠깐! 모든 함수는 생성자 함수가 될 수 있다는 점을 잊지 마시기 바랍니다. `new`를 붙여 실행한다면 어떤 함수라도 위에 언급된 알고리즘이 실행됩니다. 이름의 '첫 글자가 대문자'인 함수는 `new`를 붙여 실행해야 한다는 점도 잊지 마세요. 공동의 약속이니까요.
68
68
69
69
````smart header="new function() { ... }"
70
70
재사용할 필요가 없는 복잡한 객체를 만들어야 한다고 해봅시다. 많은 양의 코드가 필요할 겁니다. 이럴 땐 아래와 같이 코드를 익명 생성자 함수로 감싸주는 방식을 사용할 수 있습니다.
@@ -98,18 +98,18 @@ function User() {
98
98
alert(new.target);
99
99
}
100
100
101
-
//"new" 없이 호출함
101
+
//'new' 없이 호출함
102
102
*!*
103
103
User(); // undefined
104
104
*/!*
105
105
106
-
//"new"를 붙여 호출함
106
+
// 'new'를 붙여 호출함
107
107
*!*
108
108
newUser(); // function User { ... }
109
109
*/!*
110
110
```
111
111
112
-
함수 본문에서 `new.target`을 사용하면 해당 함수가 `new`와 함께 호출되었는지(“in constructor mode”) 아닌지(“in regular mode”)를 확인할 수 있습니다.
112
+
함수 본문에서 `new.target`을 사용하면 해당 함수가 `new`와 함께 호출되었는지(in constructor mode) 아닌지(in regular mode)를 확인할 수 있습니다.
113
113
114
114
이를 활용해 일반적인 방법으로 함수를 호출해도 `new`를 붙여 호출한 것과 같이 동작하도록 만들어보겠습니다.
115
115
@@ -122,49 +122,49 @@ function User(name) {
122
122
this.name= name;
123
123
}
124
124
125
-
let john =User("John"); // 'new User'를 쓴 것처럼 바꿔줍니다.
126
-
alert(john.name); //John
125
+
let john =User("보라"); // 'new User'를 쓴 것처럼 바꿔줍니다.
126
+
alert(john.name); //보라
127
127
```
128
128
129
129
라이브러리를 분석하다 보면 위와 같은 방식이 쓰인 걸 발견할 때가 있을 겁니다. 이런 방식을 사용하면 `new`를 붙여 함수를 호출하든 아니든 코드가 동일하게 동작하기 때문에, 좀 더 유연하게 코드를 작성할 수 있습니다.
130
130
131
-
그런데 `new`를 생략하면 코드가 정확히 무슨 일을 하는지 알기 어렵습니다. `new`가 붙어있으면 새로운 객체를 만든다는 걸 누구나 알 수 있는 반면에 말이죠. 이 방법은 정말 필요한 경우에만 사용하시고 남발하지 않으시길 바랍니다.
131
+
그런데 이 방법을 믿고 객체를 만드는 경우에도 `new`를 생략하면 코드가 정확히 무슨 일을 하는지 알기 어렵습니다. `new`가 붙어있으면 새로운 객체를 만든다는 걸 누구나 알 수 있기 때문에 `new`를 생략해서 객체를 만드는것은 정말 필요한 경우에만 사용하시고 남발하지 않으시길 바랍니다.
132
132
133
133
## 생성자와 return문
134
134
135
135
생성자 함수엔 보통 `return` 문이 없습니다. 반환해야 할 것들은 모두 `this`에 저장되고, `this`는 자동으로 반환되기 때문에 반환문을 명시적으로 써 줄 필요가 없습니다.
136
136
137
137
그런데 만약 `return` 문이 있다면 어떤 일이 벌어질까요? 아래와 같은 간단한 규칙이 적용됩니다.
138
138
139
-
- 객체를 `return` 한다면,`this` 대신 객체가 반환됩니다.
140
-
- 원시형을 `return` 한다면,`return`문이 무시됩니다.
139
+
- 객체를 `return` 한다면 `this` 대신 객체가 반환됩니다.
140
+
- 원시형을 `return` 한다면 `return`문이 무시됩니다.
141
141
142
142
`return` 뒤에 객체가 오면 생성자 함수는 해당 객체를 반환해주고, 이 외의 경우는 `this`가 반환되죠.
143
143
144
-
아래 예시에선 첫 번째 규칙이 적용돼,`return`은 `this`를 무시하고 객체를 반환합니다.
144
+
아래 예시에선 첫 번째 규칙이 적용돼 `return`은 `this`를 무시하고 객체를 반환합니다.
145
145
146
146
```js run
147
147
functionBigUser() {
148
148
149
-
this.name="John";
149
+
this.name="원숭이";
150
150
151
-
return { name:"Godzilla" }; // <-- this가 아닌 새로운 객체를 반환함
151
+
return { name:"고릴라" }; // <-- this가 아닌 새로운 객체를 반환함
152
152
}
153
153
154
-
alert( newBigUser().name ); //Godzilla
154
+
alert( newBigUser().name ); //고릴라
155
155
```
156
156
157
157
아무것도 `return`하지 않는 예시를 살펴봅시다. 원시형을 반환하는 경우와 마찬가지로 두 번째 규칙이 적용됩니다.
158
158
159
159
```js run
160
160
functionSmallUser() {
161
161
162
-
this.name="John";
162
+
this.name="원숭이";
163
163
164
164
return; // <-- this를 반환함
165
165
}
166
166
167
-
alert( newSmallUser().name ); //John
167
+
alert( newSmallUser().name ); //원숭이
168
168
```
169
169
170
170
`return`문이 있는 생성자 함수는 거의 없습니다. 여기선 튜토리얼의 완성도를 위해 특이 케이스를 소개해보았습니다.
@@ -178,7 +178,7 @@ let user = new User; // <-- 괄호가 없음
178
178
let user = new User();
179
179
```
180
180
181
-
명세서엔 괄호를 생략해도 된다고 정의되어 있지만, "좋은 스타일"은 아닙니다.
181
+
명세서엔 괄호를 생략해도 된다고 정의되어 있지만, '좋은 스타일'은 아닙니다.
182
182
````
183
183
184
184
## 생성자 내 메서드
@@ -194,19 +194,19 @@ function User(name) {
194
194
this.name= name;
195
195
196
196
this.sayHi=function() {
197
-
alert( "My name is: "+this.name );
197
+
alert( "제 이름은 "+this.name+"입니다." );
198
198
};
199
199
}
200
200
201
201
*!*
202
-
letjohn=newUser("John");
202
+
letbora=newUser("이보라");
203
203
204
-
john.sayHi(); //My name is: John
204
+
john.sayHi(); //내 이름은 이보라입니다.
205
205
*/!*
206
206
207
207
/*
208
-
john = {
209
-
name: "John",
208
+
bora = {
209
+
name: "이보라",
210
210
sayHi: function() { ... }
211
211
}
212
212
*/
@@ -219,12 +219,12 @@ john = {
219
219
- 생성자 함수(짧게 줄여서 생성자)는 일반 함수입니다. 다만, 일반 함수와 구분하기 위해 함수 이름 첫 글자를 대문자로 씁니다.
220
220
- 생성자 함수는 반드시 `new` 연산자와 함께 호출해야 합니다. `new`와 함께 호출하면 내부에서 `this`가 암시적으로 만들어지고, 마지막엔 `this`가 반환됩니다.
221
221
222
-
유사한 객체를 여러 개 만들 때 생성자 함수가 유용합니다.
222
+
생성자 함수는 유사한 객체를 여러 개 만들 때 유용합니다.
223
223
224
224
자바스크립트는 언어 차원에서 다양한 생성자 함수를 제공합니다. 날짜를 나타내는 데 쓰이는 `Date`, 집합(set)을 나타내는 데 쓰이는 `Set` 등의 내장 객체는 이런 생성자 함수를 이용해 만들 수 있습니다. 자세한 내용은 다시 살펴보도록 하겠습니다.
225
225
226
226
```smart header="아직 배울 게 많습니다!"
227
-
이번 챕터에서 다룬 것은 객체와 생성자에 대한 기본에 불과합니다. 다음 챕터에서 다룰 자료형과 함수를 이해하는 데 꼭 필요한 내용이죠.
227
+
이번 챕터에서 다룬 것은 객체와 생성자에 대한 기본에 불과합니다. 이어지는 챕터에서 다룰 자료형과 함수를 이해하는 데 꼭 필요한 내용이죠.
228
228
229
-
객체에 대한 학습은 아직 끝나지 않았습니다. 자료형과 함수를 학습한 이후에, 다시 객체로 돌아와 <info:prototypes>, <info:classes>등을 다루도록 하겠습니다.
229
+
객체에 대한 학습은 아직 끝나지 않았습니다. 자료형과 함수를 학습한 이후에 다시 객체로 돌아와 <info:prototypes>, <info:classes>등을 다루도록 하겠습니다.
0 commit comments