Skip to content

Commit b1ae38f

Browse files
committed
update post
1 parent 59e9e17 commit b1ae38f

12 files changed

+184
-27
lines changed

content/posts/자원/JavaScript/Javascript.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ tags:
44
- web
55
- javascript
66
createdAt: 2025-04-12 09:09:33
7-
modifiedAt: 2025-04-19 15:22:20
7+
modifiedAt: 2025-04-19 18:43:43
88
publish: 자원/JavaScript
99
related: ""
1010
series: ""
@@ -28,3 +28,4 @@ series: ""
2828
- [[클로저(Closure)란 무엇인가]]
2929
- [[`this`키워드`]]
3030
- [[프로토타입(Prototype)과 프로토타입 상속]]
31+
- [[Javascript는 어떻게 비동기 처리가 가능한 것인가]]

content/posts/자원/JavaScript/var,let,const의 주요 차이점은 무엇인가.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ series: ""
2727

2828
> [!tip] 스코프 더 자세히 알아 보기
2929
>
30-
> - [[Javascript-스코프와 스코프 체인]]
30+
> - [[스코프(Scope)란 무엇인가]]
3131
3232
### 재선언(Redeclaration)
3333

content/posts/자원/JavaScript/실행컨텍스트(Execution Context).md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ tags:
33
- resource
44
- javascript
55
createdAt: 2025-04-19 10:37:27
6-
modifiedAt: 2025-04-19 13:26:08
6+
modifiedAt: 2025-04-19 17:30:58
77
publish: 자원/JavaScript
88
related: ""
99
series: ""

content/posts/자원/JavaScript/클로저(Closure)란 무엇인가.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,15 @@ tags:
33
- resource
44
- javascript
55
createdAt: 2025-04-18 22:36:08
6-
modifiedAt: 2025-04-19 13:13:00
6+
modifiedAt: 2025-04-19 16:55:15
77
publish: 자원/JavaScript
88
related: ""
99
series: ""
1010
---
1111

1212
# 클로저(Closure)란 무엇인가
1313

14-
클로저는 함수와 그 함수가 선언된 렉시컬 환경(Lexical Environment)의 조합이다. 간단하게 함수가 자신이 생성될 때의 환경(변수)을 기억하는 현상을 말한다.
14+
클로저는 함수와 그 **함수가 선언된 렉시컬 환경(Lexical Environment)의 조합**이다. 간단하게 **함수가 자신이 생성될 때의 환경(변수)을 기억하는 현상** 말한다.
1515

1616
클로저는 자바스크립트의 핵심 개념 중 하나로, 함수형 프로그래밍 패러다임과 다양한 디자인 패턴을 구현하는 데 필수적이다.
1717

Lines changed: 140 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
---
2+
tags:
3+
- resource
4+
- javascript
5+
createdAt: 2025-04-19 15:21:35
6+
modifiedAt: 2025-04-19 18:39:55
7+
publish: 자원/JavaScript
8+
related: ""
9+
series: ""
10+
---
11+
12+
# 프로토타입(Prototype)과 프로토타입 상속
13+
14+
## 프로토타입
15+
16+
자바스크립트의 모든 객체는 자신의 **원형(Prototype)** 이 되는 다른 객체와 내부적으로 연결되어 있다. 이 연결댄 객체를 '프로토타입 객체'또는 간단히 '프로토타입'이라고 부른다. 객체는 이 프로토타입으로부터 속성(property)과 메서드(method)를 상속받을 수 있다. 객체의 프로토타입은 내부 슬롯 `[[Prototype]]`에 저장되며, 일반적으로 `Object.getPrototypeOf()`메서드나 (비표준이지만 널리 사용되는) `__proto__` 접근자 속성을 통해 접근할 수 있다.
17+
18+
프로토 타입과 프로토 타입 체인은 자바스크립트에서 상속과 코드 재사용을 구현하는 근본적인 메커니즘 이다.
19+
20+
### 프로토타입 체인(Prototype Chain)
21+
22+
어떤 객체의 속성이나 메서드에 접근하려고 할 때, 자바스크립트 엔진은 먼저 해당 객체 자체에서 찾는다. 만약 찾지 못하면, 내부 `[[Prototype]]`링크를 따라 프로토타입 객체로 이동하여 다시 찾는다. 이 과정을 포로토타입 객체의 포로토타입으로 계속 올라가며 반복하게 되는데, 이 연결된 프로토타입들의 연쇄를 프로토타입 체인이라고 한다. 체인의 가장 마지막에는 일반적으로 `Object.prototype`이 있으며, 이 객체의 프로토타입은 `null`이므로 여기서 탐색이 종료된다.
23+
24+
## 프로토타입 기반 상속은 의 동작방식
25+
26+
프로토타입 기반 상속은 객체가 자신의 프로토타입으로부터 속성과 메서드를 물려받는 방식으로 동작한다.
27+
28+
1. 속성/메서드 탐색: 객체의 특정 속성이나 메서드에 접근할 때, 엔진은 먼저 객체 자신에게 해당 속성/메서드가 있는지 확인한다.
29+
2. 체인 탐색: 객체 자신에게 없다면, `[[Prototype]]` 링크를 따라 프로토타입 객체로 이동하여 해당 속성/메서드를 찾는다.
30+
3. 반복: 프로토타입 객체에도 없다면, 다시 그 객체의 프로토타입으로 이동하여 찾는 과정을 프로토타입 체인을 따라 반복한다.
31+
4. 종료: 속성/메서드를 찾으면 그 값을 반환하고 탐색을 종료한다. 체인의 끝(`null`)에 도달할 때까지 찾지 못하면 `undefined`를 반환한다.
32+
33+
```js
34+
let animal = {
35+
eats: true,
36+
walk() {
37+
console.log("동물이 걷고 있습니다.");
38+
},
39+
};
40+
41+
let rabbit = {
42+
jumps: true,
43+
__proto__: animal,
44+
};
45+
rabbit.walk(); // "동물이 걷고 있습니다." - animal 에서 상속받은 메서드
46+
console.log(rabbit.eats); // true - animal 에서 상속받은 속성
47+
```
48+
49+
### 상속 구현
50+
51+
#### 생성자 함수
52+
53+
**생성자 함수**를 사용하여 객체를 생성할 때, 생성자 함수의 `prototype` 속성이 가리키는 객체는 생성된 인스턴스들의 프로토타입이 된다. 따라서 생성자 함수의 `porototype`에 메서드를 추가하면, 모든 인스턴스는 프로토타입 체인을 통해 해당 메서드를 공유하고 사용할 수 있다. `Object.create()`메서드를 사용하면 명시적으로 특정 객체를 프로토타입으로 하는 새로운 객체를 생성하여 상속 관계를 만들 수도 있다.
54+
55+
```js
56+
function Animal(name) {
57+
this.name = name;
58+
}
59+
60+
//Animal 의 prototype 객체에 speak 메서드 추가
61+
Animal.prototype.speak = function () {
62+
console.log(`${this.name} make a noise.`);
63+
};
64+
65+
const dog = new Animal("Dog");
66+
dog.speak(); // dog 객체 자체에는 speak가 없지만, 프로토타입 체인을 통해 Animal.prototype.speak을 찾아 실행
67+
68+
console.log(dog.__proto__ === Animal.prototype); //true
69+
console.log(Animal.prototype.isPrototypeOf(dog)); //true
70+
```
71+
72+
#### 다른 방법들
73+
74+
1. `__proto__`사용 (권장되지 않음)
75+
76+
```js
77+
let animal = { eats: true };
78+
let rabbit = { jumps: true };
79+
80+
rabbit.__proto__ = animal; // 상속 설정
81+
```
82+
83+
2. `Object.create()`사용 (권장됨)
84+
85+
```js
86+
let animal = { eats: true };
87+
let rabbit = Object.create(animal); // animal을 프로토타입으로 하는 새 객체 생성
88+
rabbit.jumps = true;
89+
```
90+
91+
3. `Object.setPrototypeOf()`사용
92+
93+
```js
94+
let animal = { eats: true };
95+
let rabbit = { jumps: true };
96+
Object.setPrototypeOf(rabbit, animal); // rabbit의 프로토타입을 animal로 설정
97+
```
98+
99+
### 프로토타입 상속의 핵심 특징
100+
101+
1. 동적 특성: 프로토타입을 변경하면 해당 프로토타입을 상속받은 모든 객체에 영향을 미친다.
102+
2. 메모리 효율성: 모든 인스턴스가 메서드를 복제하지 않고 프로토타입의 메서드를 참조하므로 메모리를 절약한다.
103+
3. 속성 가리기(Property Shadowing): 객체가 프로토타입과 동일한 이름의 속성을 가지면 프로토타입의 속성을 가린다.
104+
105+
## 클래스와 프로토타입
106+
107+
ES6부터 도입된 클래스 문법도 내부적으로는 프로토타입을 사용한다.
108+
109+
```js
110+
class Animal {
111+
constructor(name) {
112+
this.name = name;
113+
}
114+
115+
walk() {
116+
console.log(`${this.name}이(가) 걷고 있습니다`);
117+
}
118+
}
119+
120+
class Rabbit extends Animal {
121+
constructor(name, earLength) {
122+
super(name);
123+
this.earLength = earLength;
124+
}
125+
126+
jump() {
127+
console.log(`${this.name}이(가) 점프합니다`);
128+
}
129+
}
130+
131+
let rabbit = new Rabbit("흰토끼", 10);
132+
rabbit.walk(); // "흰토끼이(가) 걷고 있습니다" - 상위 클래스에서 상속받은 메서드
133+
rabbit.jump(); // "흰토끼이(가) 점프합니다"
134+
```
135+
136+
## 주의점
137+
138+
1. 프로토타입 체인 깊이: 체인이 너무 깊으면 성능에 영향을 미칠 수 있다.
139+
2. 순환 참조: 프로토타입 체인에 순환 참조가 생기지 않도록 주의해야 한다.
140+
3. 내장 프로토타입 수정: 내장 객체(Array Object 등)의 프로토타입을 수정하는 것은 위험할 수 있다.

content/posts/자원/JavaScript/호이스팅(Hoisting)이란 무엇인가.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ tags:
33
- resource
44
- javascript
55
createdAt: 2025-04-17 14:08:12
6-
modifiedAt: 2025-04-18 14:58:20
6+
modifiedAt: 2025-04-19 17:42:08
77
publish: 자원/JavaScript
88
related: ""
99
series: ""

public/link-map.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,18 @@
11
{
22
"0.inbox/`this`키워드.md": "자원/JavaScript/`this`키워드",
3+
"0.inbox/프로토타입(Prototype)과 프로토타입 상속.md": "자원/JavaScript/프로토타입(Prototype)과 프로토타입 상속",
34
"3.resource/SWEA강의/SWEA 강의 정리노트.md": "자원/SWEA 강의 정리노트/SWEA 강의 정리노트",
45
"3.resource/Javascript/변수의 선언,초기화,할당의 차이점은 무엇인가.md": "자원/JavaScript/변수의 선언,초기화,할당의 차이점은 무엇인가",
56
"3.resource/Javascript/호이스팅(Hoisting)이란 무엇인가.md": "자원/JavaScript/호이스팅(Hoisting)이란 무엇인가",
67
"3.resource/Javascript/Javascript.md": "자원/JavaScript/Javascript",
7-
"3.resource/Javascript/var,let,const의 주요 차이점은 무엇인가.md": "자원/JavaScript/var,let,const의 주요 차이점은 무엇인가",
88
"3.resource/Javascript/데이터 타입과 불변성.md": "자원/JavaScript/데이터 타입과 불변성",
99
"3.resource/Javascript/null,undefined,undeclared 의 차이점은.md": "자원/JavaScript/null,undefined,undeclared 의 차이점은",
1010
"3.resource/Javascript/`==` 과 `===` 의 차이.md": "자원/JavaScript/`==` 과 `===` 의 차이",
1111
"3.resource/Javascript/스코프(Scope)란 무엇인가.md": "자원/JavaScript/스코프(Scope)란 무엇인가",
1212
"3.resource/Javascript/실행컨텍스트(Execution Context).md": "자원/JavaScript/실행컨텍스트(Execution Context)",
1313
"3.resource/Javascript/콜 스택(Call Stack)이란 무엇인가.md": "자원/JavaScript/콜 스택(Call Stack)이란 무엇인가",
1414
"3.resource/Javascript/클로저(Closure)란 무엇인가.md": "자원/JavaScript/클로저(Closure)란 무엇인가",
15+
"3.resource/Javascript/var,let,const의 주요 차이점은 무엇인가.md": "자원/JavaScript/var,let,const의 주요 차이점은 무엇인가",
1516
"3.resource/Web/동적 사이트 vs 정적사이트.md": "자원/웹개발/동적 사이트 vs 정적사이트",
1617
"3.resource/Web/HTTP(Hypertext Transfer Protocol).md": "자원/웹개발/HTTP(Hypertext Transfer Protocol)",
1718
"3.resource/Web/웹사이트는 어떻게 보여지는가-브라우저의 렌더링.md": "자원/웹개발/웹사이트는 어떻게 보여지는가-브라우저의 렌더링",

public/meta-data.json

Lines changed: 26 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,17 @@
1010
"modifiedAt": "2025-04-19 15:21:13",
1111
"publish": "자원/JavaScript"
1212
},
13+
{
14+
"urlPath": "자원/JavaScript/프로토타입(Prototype)과 프로토타입 상속",
15+
"title": "프로토타입(Prototype)과 프로토타입 상속",
16+
"summary": "",
17+
"image": "",
18+
"tags": ["resource", "javascript"],
19+
"series": "",
20+
"createdAt": "2025-04-19 15:21:35",
21+
"modifiedAt": "2025-04-19 18:39:55",
22+
"publish": "자원/JavaScript"
23+
},
1324
{
1425
"urlPath": "자원/SWEA 강의 정리노트/SWEA 강의 정리노트",
1526
"title": "SWEA 강의 정리노트",
@@ -40,7 +51,7 @@
4051
"tags": ["resource", "javascript"],
4152
"series": "",
4253
"createdAt": "2025-04-17 14:08:12",
43-
"modifiedAt": "2025-04-18 14:58:20",
54+
"modifiedAt": "2025-04-19 17:42:08",
4455
"publish": "자원/JavaScript"
4556
},
4657
{
@@ -51,18 +62,7 @@
5162
"tags": ["resource", "web", "javascript"],
5263
"series": "",
5364
"createdAt": "2025-04-12 09:09:33",
54-
"modifiedAt": "2025-04-19 15:22:20",
55-
"publish": "자원/JavaScript"
56-
},
57-
{
58-
"urlPath": "자원/JavaScript/var,let,const의 주요 차이점은 무엇인가",
59-
"title": "var,let,const의 주요 차이점은 무엇인가",
60-
"summary": "",
61-
"image": "",
62-
"tags": ["resource", "javascript"],
63-
"series": "",
64-
"createdAt": "2025-04-17 14:40:27",
65-
"modifiedAt": "2025-04-18 15:01:31",
65+
"modifiedAt": "2025-04-19 18:43:43",
6666
"publish": "자원/JavaScript"
6767
},
6868
{
@@ -117,7 +117,7 @@
117117
"tags": ["resource", "javascript"],
118118
"series": "",
119119
"createdAt": "2025-04-19 10:37:27",
120-
"modifiedAt": "2025-04-19 13:26:08",
120+
"modifiedAt": "2025-04-19 17:30:58",
121121
"publish": "자원/JavaScript"
122122
},
123123
{
@@ -139,7 +139,18 @@
139139
"tags": ["resource", "javascript"],
140140
"series": "",
141141
"createdAt": "2025-04-18 22:36:08",
142-
"modifiedAt": "2025-04-19 13:13:00",
142+
"modifiedAt": "2025-04-19 16:55:15",
143+
"publish": "자원/JavaScript"
144+
},
145+
{
146+
"urlPath": "자원/JavaScript/var,let,const의 주요 차이점은 무엇인가",
147+
"title": "var,let,const의 주요 차이점은 무엇인가",
148+
"summary": "",
149+
"image": "",
150+
"tags": ["resource", "javascript"],
151+
"series": "",
152+
"createdAt": "2025-04-17 14:40:27",
153+
"modifiedAt": "2025-04-18 15:01:31",
143154
"publish": "자원/JavaScript"
144155
},
145156
{
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
{
2-
"content": "\n# Javascript\n\n웹사이트에서 [[HTML]]과 [[CSS]]가 각각 내용의 구조를 정하고 그 내용이 어떤 모습으로 표현되어야 하는지 브라우져에게 설명하는 언어라면 Javascript 는 웹사이트와 사용자가 상호작용을 할 수 있도록 하는 언어이다.\n\n## 관련 포스트\n\n- [[변수의 선언,초기화,할당의 차이점은 무엇인가]]\n- [[var,let,const의 주요 차이점은 무엇인가]]\n- [[호이스팅(Hoisting)이란 무엇인가]]\n- [[데이터 타입과 불변성]]\n- [[null,undefined,undeclared 의 차이점은]]\n- [[`==` 과 `===` 의 차이]]\n- [[스코프(Scope)란 무엇인가]]\n- [[실행컨텍스트(Execution Context)]]\n- [[콜 스택(Call Stack)이란 무엇인가]]\n- [[클로저(Closure)란 무엇인가]]\n- [[`this`키워드`]]\n- [[프로토타입(Prototype)과 프로토타입 상속]]\n",
3-
"plainContent": "웹사이트에서 HTML]]과 [[CSS]]가 각각 내용의 구조를 정하고 그 내용이 어떤 모습으로 표현되어야 하는지 브라우져에게 설명하는 언어라면 Javascript 는 웹사이트와 사용자가 상호작용을 할 수 있도록 하는 언어이다.\n[[변수의 선언,초기화,할당의 차이점은 무엇인가]]\n[[var,let,const의 주요 차이점은 무엇인가]]\n[[호이스팅(Hoisting)이란 무엇인가]]\n[[데이터 타입과 불변성]]\n[[null,undefined,undeclared 의 차이점은]]\n[[== 과 === 의 차이]]\n[[스코프(Scope)란 무엇인가]]\n[[실행컨텍스트(Execution Context)]]\n[[콜 스택(Call Stack)이란 무엇인가]]\n[[클로저(Closure)란 무엇인가]]\n[[this키워드`]]\n[[프로토타입(Prototype)과 프로토타입 상속"
2+
"content": "\n# Javascript\n\n웹사이트에서 [[HTML]]과 [[CSS]]가 각각 내용의 구조를 정하고 그 내용이 어떤 모습으로 표현되어야 하는지 브라우져에게 설명하는 언어라면 Javascript 는 웹사이트와 사용자가 상호작용을 할 수 있도록 하는 언어이다.\n\n## 관련 포스트\n\n- [[변수의 선언,초기화,할당의 차이점은 무엇인가]]\n- [[var,let,const의 주요 차이점은 무엇인가]]\n- [[호이스팅(Hoisting)이란 무엇인가]]\n- [[데이터 타입과 불변성]]\n- [[null,undefined,undeclared 의 차이점은]]\n- [[`==` 과 `===` 의 차이]]\n- [[스코프(Scope)란 무엇인가]]\n- [[실행컨텍스트(Execution Context)]]\n- [[콜 스택(Call Stack)이란 무엇인가]]\n- [[클로저(Closure)란 무엇인가]]\n- [[`this`키워드`]]\n- [[프로토타입(Prototype)과 프로토타입 상속]]\n- [[Javascript는 어떻게 비동기 처리가 가능한 것인가]]\n",
3+
"plainContent": "웹사이트에서 HTML]]과 [[CSS]]가 각각 내용의 구조를 정하고 그 내용이 어떤 모습으로 표현되어야 하는지 브라우져에게 설명하는 언어라면 Javascript 는 웹사이트와 사용자가 상호작용을 할 수 있도록 하는 언어이다.\n[[변수의 선언,초기화,할당의 차이점은 무엇인가]]\n[[var,let,const의 주요 차이점은 무엇인가]]\n[[호이스팅(Hoisting)이란 무엇인가]]\n[[데이터 타입과 불변성]]\n[[null,undefined,undeclared 의 차이점은]]\n[[== 과 === 의 차이]]\n[[스코프(Scope)란 무엇인가]]\n[[실행컨텍스트(Execution Context)]]\n[[콜 스택(Call Stack)이란 무엇인가]]\n[[클로저(Closure)란 무엇인가]]\n[[this키워드`]]\n[[프로토타입(Prototype)과 프로토타입 상속]]\n[[Javascript는 어떻게 비동기 처리가 가능한 것인가"
44
}

0 commit comments

Comments
 (0)