Skip to content

Commit 7332e1d

Browse files
[클래스와 기본 문법] 보완
1 parent e890955 commit 7332e1d

File tree

1 file changed

+47
-47
lines changed

1 file changed

+47
-47
lines changed

1-js/09-classes/01-class/article.md

Lines changed: 47 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,21 @@
22
# 클래스와 기본 문법
33

44
```quote author="위키백과"
5-
클래스(class)는 객체 지향 프로그래밍(OOP)에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀로, 객체를 정의하기 위한 상태(멤버 변수)와 메서드(함수)로 구성된다.
5+
클래스는 객체 지향 프로그래밍에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀로, 객체를 정의하기 위한 상태(멤버 변수)와 메서드(함수)로 구성된다.
66
```
77

88
실무에선 사용자나 물건같이 동일한 종류의 객체를 여러 개 생성해야 하는 경우가 잦습니다.
99

10-
이럴 때 <info:constructor-new>에서 배운 `new function` 사용할 수 있습니다.
10+
이럴 때 <info:constructor-new>에서 배운 `new function` 사용할 수 있습니다.
1111

12-
여기에 더하여 모던 자바스크립트에 도입된 `클래스`라는 문법을 사용하면 객체 지향 프로그래밍에서 사용되는 다양한 기능을 자바스크립트에서도 사용할 수 있습니다.
12+
여기에 더하여 모던 자바스크립트에 도입된 `클래스(class)`라는 문법을 사용하면 객체 지향 프로그래밍에서 사용되는 다양한 기능을 자바스크립트에서도 사용할 수 있습니다.
1313

1414
## 기본 문법
1515

1616
클래스는 다음과 같은 기본 문법을 사용해 만들 수 있습니다.
1717
```js
1818
class MyClass {
19-
// 다양한 메서드
19+
// 여러 메서드를 정의할 수 있습니다.
2020
constructor() { ... }
2121
method1() { ... }
2222
method2() { ... }
@@ -25,7 +25,7 @@ class MyClass {
2525
}
2626
```
2727

28-
이렇게 클래스를 만들고, `new MyClass()`를 호출하면 위 예시에서 정의한 메서드가 들어있는 객체가 생성됩니다.
28+
이렇게 클래스를 만들고, `new MyClass()`를 호출하면 위에서 정의한 메서드가 들어 있는 객체가 생성됩니다.
2929

3030
객체의 기본 상태를 설정해주는 생성자 메서드 `constructor()``new`에 의해 자동으로 호출되므로, 특별한 절차 없이 객체를 초기화 할 수 있습니다.
3131

@@ -49,28 +49,28 @@ let user = new User("John");
4949
user.sayHi();
5050
```
5151

52-
`new User("John")`를 호출하면 아래와 같은 일이 일어납니다.
52+
`new User("John")`를 호출하면 다음과 같은 일이 일어납니다.
5353
1. 새로운 객체가 생성됩니다.
54-
2. `constructor`가 자동으로 실행됩니다. 위 예시에선 이때 인수 `"John"``this.name`에 할당됩니다.
54+
2. 넘겨받은 인수와 함께 `constructor`가 자동으로 실행됩니다. 이때 인수 `"John"``this.name`에 할당됩니다.
5555

56-
`user.sayHi()` 같은 객체 메서드를 호출할 수 있는 이유가 바로 이런 과정 때문입니다.
56+
이런 과정을 거친 후에 `user.sayHi()` 같은 객체 메서드를 호출할 수 있습니다.
5757

5858

5959
```warn header="클래스 메서드 사이엔 쉼표가 없습니다."
60-
초보 개발자는 클래스 메서드 사이에 쉼표를 넣는 실수를 저지르곤 합니다. 이렇게 쉼표를 넣게 되면 문법 에러가 발생합니다.
60+
초보 개발자는 클래스 메서드 사이에 쉼표를 넣는 실수를 저지르곤 합니다. 이렇게 쉼표를 넣으면 문법 에러가 발생합니다.
6161
62-
클래스와 관련된 표기법은 객체 리터럴 표기법과 차이가 있음에 유의하시기 바랍니다. 클래스에선 메서드 사이에 쉼표를 넣지 않아도 됩니다.
62+
클래스와 관련된 표기법은 객체 리터럴 표기법과 차이가 있습니다. 클래스에선 메서드 사이에 쉼표를 넣지 않아도 됩니다.
6363
```
6464

6565
## 클래스란?
6666

67-
이 시점에서 "`클래스`가 정확히 뭔가요?"라는 의문이 생기실 겁니다. 클래스는 이 글을 읽고 계신 여러분의 생각처럼 자바스크립트 차원에서 새롭게 창안 한 개체(entity)가 아닙니다.
67+
이 시점에서 "`클래스`가 정확히 뭔가요?"라는 의문이 생기실 겁니다. 클래스는 자바스크립트에서 새롭게 창안 한 개체(entity)가 아닙니다.
6868

69-
클래스가 보여주는 다양한 마법의 원리를 하나씩 알아보며 클래스가 정확히 무엇인지 알아봅시다. 이 과정을 거치고 나면 자바스크립트의 복잡한 기능을 이해할 수 있게 됩니다.
69+
클래스가 보여주는 다양한 마법의 원리를 하나씩 파헤치면서 클래스가 정확히 무엇인지 알아봅시다. 이 과정을 거치고 나면 자바스크립트의 복잡한 기능을 이해할 수 있게 됩니다.
7070

7171
자바스크립트에서 클래스는 함수의 한 종류입니다.
7272

73-
코드를 통해 이를 확인해봅시다.
73+
코드로 확인해봅시다.
7474

7575
```js run
7676
class User {
@@ -84,18 +84,18 @@ alert(typeof User); // function
8484
*/!*
8585
```
8686

87-
`class User {...}`라는 문법 구조가 진짜 하는 일은 다음과 같습니다.
87+
`class User {...}` 문법 구조가 진짜 하는 일은 다음과 같습니다.
8888

89-
1. 클래스 선언의 결과로 `User`라는 이름을 가진 함수가 만들어집니다. 함수 본문의 코드는 생성자 메서드 `constructor`에서 가져옵니다(생성자 메서드가 없다면 함수 본문이 비어진 채로 함수가 만들어집니다).
89+
1. `User`라는 이름을 가진 함수를 만듭니다. 함수 본문은 생성자 메서드 `constructor`에서 가져옵니다. 생성자 메서드가 없으면 본문이 비워진 채로 함수가 만들어집니다.
9090
2. `sayHi`같은 클래스 내에서 정의한 메서드를 `User.prototype`에 저장합니다.
9191

92-
`new User`를 호출해 객체를 만들고, 객체의 메서드를 호출하면 <info:function-prototype>챕터에서 설명한 것처럼 해당 메서드를 프로토타입에서 가져옵니다. 이 과정이 있기 때문에 객체에서 클래스 메서드에 접근할 수 있습니다.
92+
`new User`를 호출해 객체를 만들고, 객체의 메서드를 호출하면 <info:function-prototype>에서 설명한 것처럼 메서드를 프로토타입에서 가져옵니다. 이 과정이 있기 때문에 객체에서 클래스 메서드에 접근할 수 있습니다.
9393

94-
`class User` 선언의 결과를 그림으로 나타내면 아래와 같습니다.
94+
`class User` 선언 결과를 그림으로 나타내면 아래와 같습니다.
9595

9696
![](class-user.svg)
9797

98-
아래 코드를 실행해 보면서 지금까지 설명한 것들을 다시 확인해봅시다.
98+
지금까지 했던 설명을 코드로 표현하면 다음과 같습니다.
9999

100100
```js run
101101
class User {
@@ -112,25 +112,25 @@ alert(User === User.prototype.constructor); // true
112112
// 클래스 내부에서 정의한 메서드는 User.prototype에 저장됩니다.
113113
alert(User.prototype.sayHi); // alert(this.name);
114114

115-
// 이 예시에서 프로토타입에는 메서드개만 있습니다.
115+
// 현재 프로토타입에는 메서드가개입니다.
116116
alert(Object.getOwnPropertyNames(User.prototype)); // constructor, sayHi
117117
```
118118

119119
## 클래스는 단순한 편의 문법이 아닙니다.
120120

121-
어떤 사람들은 `class`라는 키워드 없이도 클래스 역할을 하는 함수를 선언할 수 있어서 `클래스`는 '편의 문법(syntactic sugar, 기존 문법을 편리하게 읽기 위해 만든 문법으로, 기능은 동일함)'에 불과하다고 이야기합니다.
121+
어떤 사람들은 `class`라는 키워드 없이도 클래스 역할을 하는 함수를 선언할 수 있기 때문에 `클래스`는 '편의 문법'에 불과하다고 이야기합니다. 참고로 기능은 동일하나 기존 문법을 쉽게 읽을 수 있게 만든 문법을 편의 문법(syntactic sugar, 문법 설탕)이라고 합니다.
122122

123123
```js run
124-
// 순수 함수만으로 class User와 동일한 기능을 하는 코드를 만들어보겠습니다.
124+
// class User와 동일한 기능을 하는 순수 함수를 만들어보겠습니다.
125125

126126
// 1. 생성자 함수를 만듭니다.
127127
function User(name) {
128128
this.name = name;
129129
}
130-
// 모든 함수의 프로토타입은 constructor 프로퍼티를 기본으로 갖고 있으므로
130+
// 모든 함수의 프로토타입은 constructor 프로퍼티를 기본으로 갖고 있기 때문에
131131
// constructor 프로퍼티를 명시적으로 만들 필요가 없습니다.
132132

133-
// 2. prototype 프로퍼티에 메서드를 추가합니다.
133+
// 2. prototype에 메서드를 추가합니다.
134134
User.prototype.sayHi = function() {
135135
alert(this.name);
136136
};
@@ -140,13 +140,13 @@ let user = new User("John");
140140
user.sayHi();
141141
```
142142

143-
위 예시처럼 순수 함수로 클래스 역할을 하는 함수를 선언하는 방법과 `class` 키워드를 사용하는 방법의 결과는 거의 같습니다. `class`를 사용하는 방법이 단순한 편의 문법이라고 생각하는 이유가 여기에 있습니다.
143+
위 예시처럼 순수 함수로 클래스 역할을 하는 함수를 선언하는 방법과 `class` 키워드를 사용하는 방법의 결과는 거의 같습니다. `class` 단순한 편의 문법이라고 생각하는 이유가 여기에 있습니다.
144144

145-
그럼에도 불구하고, 두 방법에는 다음과 같은 중요한 차이점가지가 있습니다.
145+
그런데 두 방법에는 중요한 차이가가지 있습니다.
146146

147-
1. `class`로 만든 함수엔 수동으로 만든 함수와는 달리 특수한 내부 프로퍼티인 `[[FunctionKind]]:"classConstructor"`가 이름표처럼 붙습니다.
147+
1. `class`로 만든 함수엔 특수 내부 프로퍼티인 `[[FunctionKind]]:"classConstructor"`가 이름표처럼 붙습니다. 이것만으로도 두 방법엔 분명한 차이가 있음을 알 수 있습니다.
148148

149-
여기에 더하여 일반 함수와 달리 클래스 생성자는 반드시 `new`와 함께 호출해야 합니다.
149+
여기에 더하여 클래스 생성자는 일반 함수와 달리 반드시 `new`와 함께 호출해야 합니다.
150150

151151
```js run
152152
class User {
@@ -167,21 +167,21 @@ user.sayHi();
167167
alert(User); // class User { ... }
168168
```
169169

170-
2. 클래스 메서드는 열거형이 아닙니다(non-enumerable).
171-
클래스의 `"prototype"` 프로퍼티에 추가된 모든 메서드의 `enumerable` 플래그는 `false`입니다.
170+
2. 클래스 메서드는 열거할 수 없습니다(non-enumerable).
171+
클래스의 `"prototype"` 프로퍼티에 추가된 메서드 전체의 `enumerable` 플래그는 `false`입니다.
172172

173-
`for..in`으로 객체를 순회할 때, 메서드는 순회 대상에서 제외하고자 하는 경우가 많으므로 이 특징은 도움이 됩니다.
173+
`for..in`으로 객체를 순회할 때, 메서드는 순회 대상에서 제외하고자 하는 경우가 많음므로 이 특징은 도움이 됩니다.
174174

175175
3. 클래스는 항상 `엄격 모드`로 실행됩니다(`use strict`).
176-
클래스 생성자 안의 모든 코드엔 자동으로 엄격 모드가 적용됩니다.
176+
클래스 생성자 안 코드 전체엔 자동으로 엄격 모드가 적용됩니다.
177177

178-
이 외에도 `class`를 사용하면 다양한 기능이 따라오는데, 이에 대해선 추후에 다루도록 하겠습니다.
178+
이 외에도 `class`를 사용하면 다양한 기능이 따라오는데, 자세한 내용은 곧 다루겠습니다.
179179

180180
## 클래스 표현식
181181

182-
함수와 마찬가지로 클래스도 다른 표현식 내부에서 정의, 전달, 반환, 할당될 수 있습니다.
182+
함수처럼 클래스도 다른 표현식 내부에서 정의, 전달, 반환, 할당될 수 있습니다.
183183

184-
아래는 클래스 표현식에 대한 예시입니다.
184+
클래스 표현식을 만들어보겠습니다.
185185

186186
```js
187187
let User = class {
@@ -191,7 +191,7 @@ let User = class {
191191
};
192192
```
193193

194-
기명 함수 표현식(Named Function Expression)과 유사하게 클래스 표현식도 이름을 붙일 수 있습니다.
194+
기명 함수 표현식(Named Function Expression)과 유사하게 클래스 표현식에도 이름을 붙일 수 있습니다.
195195

196196
클래스 표현식에 이름을 붙이면, 이 이름은 오직 클래스 내부에서만 사용할 수 있습니다.
197197

@@ -206,7 +206,7 @@ let User = class *!*MyClass*/!* {
206206
207207
new User().sayHi(); // 제대로 동작합니다(MyClass의 정의를 보여줌).
208208
209-
alert(MyClass); // 에러가 발생합니다. MyClass는 클래스 밖에서 사용할 수 없습니다.
209+
alert(MyClass); // Error: MyClass is not defined, MyClass는 클래스 밖에서 사용할 수 없습니다.
210210
```
211211

212212

@@ -229,11 +229,11 @@ new User().sayHi(); // Hello
229229
```
230230

231231

232-
## getter,setter를 비롯한 기타 단축 구문
232+
## getter·setter를 비롯한 기타 단축 문법
233233

234-
리터럴 표기법을 사용해 만든 객체처럼 클래스도 getter나 setter, 계산된 프로퍼티(computed property)를 포함할 수 있습니다.
234+
리터럴을 사용해 만든 객체처럼 클래스도 getter나 setter, 계산된 프로퍼티(computed property)를 포함할 수 있습니다.
235235

236-
아래 예시에선 `get``set`을 이용해 `user.name`에 값을 할당하고 있습니다.
236+
`get``set`을 이용해 `user.name`을 조작할 수 있게 해봅시다.
237237

238238
```js run
239239
class User {
@@ -282,7 +282,7 @@ Object.defineProperties(User.prototype, {
282282
});
283283
```
284284

285-
아래 예시와 같이 대괄호 `[...]`를 이용한 계산된 프로퍼티명도 사용할 수 있습니다.
285+
계산된 프로퍼티는 다음과 같이 사용할 수 있습니다.
286286

287287
```js run
288288
class User {
@@ -300,11 +300,11 @@ new User().sayHi();
300300

301301
## 클래스 프로퍼티
302302

303-
```warn header="구식 브라우저는 폴리필이 필요할 수 있습니다."
304-
클래스 레벨의 프로퍼티는 근래에 더해진 기능입니다.
303+
```warn header="구식 브라우저에선 폴리필이 필요할 수 있습니다."
304+
클래스 레벨 프로퍼티는 근래에 더해진 기능입니다.
305305
```
306306

307-
예시의 `User` 메서드 하나만 있는데, 프로퍼티를 더해 봅시다.
307+
예시에선 `User` 메서드 하나만 있었습니다. 프로퍼티를 추가해 봅시다.
308308

309309
```js run
310310
class User {
@@ -319,11 +319,11 @@ class User {
319319
320320
new User().sayHi();
321321
322-
alert(User.prototype.sayHi); // User.prototype에 있음
323-
alert(User.prototype.name); // undefined, User.prototype에 없음
322+
alert(User.prototype.sayHi); // sayHi는 User.prototype에 있음
323+
alert(User.prototype.name); // undefined, name은 User.prototype에 없음
324324
```
325325

326-
프로퍼티 `name``User.prototype`있지 않습니다. 대신 생성자를 호출하기 전, `new`에 의해 생성됩니다. `name`객체 자체의 프로퍼티입니다.
326+
프로퍼티 `name``User.prototype`없습니다. `name` 생성자를 호출하기 전, `new`에 의해 만들어지고 객체 자체의 프로퍼티가 됩니다.
327327

328328
## 요약
329329

@@ -342,7 +342,7 @@ class MyClass {
342342
get something(...) {} // getter 메서드
343343
set something(...) {} // setter 메서드
344344
345-
[Symbol.iterator]() {} // 계산된 이름(computed name)을 사용해 만드는 메서드 (심볼도 가능)
345+
[Symbol.iterator]() {} // 계산된 이름(computed name)을 사용해 만드는 메서드 (심볼)
346346
// ...
347347
}
348348
```

0 commit comments

Comments
 (0)