├── README.md
├── ch0
├── README.md
├── a.js
├── a.json
├── api.json
├── b.js
├── c.json
├── c.xml
└── index.html
├── ch1
├── 1.js
├── 10.js
├── 11.js
├── 12.js
├── 13.js
├── 14.js
├── 15.java
├── 16.java
├── 17.js
├── 2.js
├── 3.js
├── 4.java
├── 5.js
├── 6.java
├── 7.java
├── 8.js
├── 9.java
├── context.js
├── di.js
├── factory.js
├── flux.js
├── lib1.js
├── lib2.vue
├── observer_vue.js
├── singleton_db.js
├── singleton_not.js
└── singleton_test.js
├── ch2
├── base.html
├── compress.js
├── cookie
│ └── server.js
├── image.css
└── local.html
├── ch3
├── 1.js
└── 2.cpp
├── ch4
├── create.sql
└── sample.sql
├── ch5
├── 1.cpp
├── 10.cpp
├── 2.cpp
├── 3.cpp
├── 4.cpp
├── 5.cpp
├── 6.cpp
├── 7.cpp
├── 8.cpp
├── 9.cpp
├── randomize.cpp
├── randomize.java
└── randomize.js
├── java-singleton
├── 1.java
├── 2.java
├── 3.java
├── 4.java
├── 5.java
├── 6.java
├── 7.java
├── thread.java
├── thread2.java
├── volatile.java
└── volatile2.java
└── mongodb
├── mongo_index.js
└── photos.json
/README.md:
--------------------------------------------------------------------------------
1 | # csnote
2 | 면접을 위한 전공지식 CS노트의 저장소 및 공지사항입니다.
3 | - ebook의 경우 페이지번호가 단말기마다 다릅니다. 페이지의 기준은 인쇄본 1쇄를 기준으로 말씀을 드립니다.
4 | - 현재 7쇄까지 아래의 내용이 모두 반영되어있습니다.
5 | - 추후 반영되는 사항은 [new] 키워드를 붙입니다.
6 |
7 | # 오탈자 및 추가 및 변경 사항
8 | 1쇄와는 달리 달라진 점이 있습니다. 해당 부분은 다음과 같습니다.
9 |
10 |
11 | ## 싱글톤 코드 수정
12 | ch1/2.js
13 | [링크](https://github.com/wnghdcjfe/csnote/blob/main/ch1/2.js)
14 |
15 | ## 팩토리패턴 코드 수정
16 | ch1/5.js
17 | [링크](https://github.com/wnghdcjfe/csnote/blob/main/ch1/5.js)
18 |
19 | ## 팩토리패턴 코드 수정
20 | ch1/6.java
21 | [링크](https://github.com/wnghdcjfe/csnote/blob/main/ch1/6.java)
22 |
23 |
24 | ## 143, 148, 150, 182 페이지
25 | > before
26 |
27 | SDD
28 |
29 | > after
30 |
31 | SSD
32 |
33 |
34 | ## 17 페이지
35 | > before
36 |
37 | 싱글톤패턴은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴입니다. 보통 데이터베이스 연결모듈에 많이 사용합니다.
38 |
39 | > after
40 |
41 | 싱글톤 패턴(singleton pattern)은 하나의 클래스에 오직 하나의 인스턴스만 가지는 패턴입니다. 하나의 클래스를 기반으로 여러 개의 개별적인 인스턴스를 만들 수 있지만 그렇게 하지 않고 하나의 클래스를 기반으로 단 하나의 인스턴스를 만들어 이를 기반으로 로직을 만드는데 쓰이며 보통 데이터베이스 연결모듈에 많이 사용합니다.
42 |
43 | ## 18 페이지
44 | > before
45 |
46 | 앞의 코드에서 볼 수 있듯이 obj와 obj2는 다른 인스턴스를 가집니다.
47 |
48 | > after
49 |
50 | 앞의 코드에서 볼 수 있듯이 obj와 obj2는 다른 인스턴스를 가집니다.
51 | 이 또한 new Object라는 클래스에서 나온 단 하나의 인스턴스니 어느정도 싱글톤패턴이라 볼 수 있습니다만 실제 싱글톤패턴은 보통 다음과 같은 코드로 구성됩니다.
52 |
53 | ## 20 페이지
54 | > before
55 |
56 | `public static synchronized Singleton getInstance()`
57 |
58 | > after
59 |
60 | `public static Singleton getInstance()`
61 |
62 | > before
63 |
64 | 자바로는 다음과 같이 할 수 있습니다.
65 |
66 | > after
67 |
68 | 자바로는 다음과 같이 중첩 클래스를 이용해서 만드는 방법이 가장 대중적입니다.
69 | 더 깊게 알고 싶은 분은 필자의 유투브 채널인 큰돌의 터전 - 'JAVA로 싱글톤 패턴을 구현하는 7가지 방법' 영상을 참고 하시길 바랍니다.
70 |
71 | ## 24 페이지
72 | > before
73 |
74 | 의존성 주입은 의존성 주입원칙을 지키며 만들어야 하며 원칙은 다음과 같습니다
75 | - 상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 합니다. 둘 다 추상화에 의존해야 하며, 이때 추상화는 세부 사항에 의존하지 말아야 합니다.
76 |
77 | > after
78 |
79 | 의존성 주입 원칙
80 |
81 | 의존성 주입은 "상위 모듈은 하위 모듈에서 어떠한 것도 가져오지 않아야 합니다.
82 | 또한 둘 다 추상화에 의존해야 하며, 이 때 추상화는 세부사항에 의존하지 말아야 합니다." 라는 의존성 주입원칙을 지켜주면서 만들어야 합니다.
83 |
84 | ## 27 페이지
85 | > before
86 |
87 | 또한, CoffeeFactory를 보면 static으로 createCoffee() 정적 메서드를 정의한 것을 알
88 | 수 있는데, 정적 메서드를 쓰면 클래스의 인스턴스 없이 호출이 가능하여 메모리를 절약
89 | 할 수 있고 개별 인스턴스에 묶이지 않으며 클래스 내의 함수를 정의할 수 있는 장점이 있
90 | 습니다.
91 |
92 | > after
93 |
94 | 또한, CoffeeFactory 클래스를 보면 static 키워드를 통해 createCoffee() 메서드를 정적메서드로 선언한 것을 볼 수 있는데 이렇게 정적메서드로 정의하게 되면 클래스를 기반으로 객체를 만들지 않고 호출이 가능하며 해당 메서드에 대한 메모리 할당을 한번만 할 수 있는 장점이 있습니다.
95 |
96 |
97 | ## 29 페이지
98 | > before
99 |
100 | 지금보면 if ... 매핑해서 할 수도 있습니다.
101 |
102 | > after
103 |
104 | 앞의 코드는 CoffeeFactory 밑에 Coffee 클래스를 놓고 해당 클래스를 상속하는 Latte, Espresso 클래스를 기반으로 구현한 모습입니다.
105 |
106 |
107 | > before
108 |
109 | 상수의 집합을 정의할 때 사용되는 타입이다. 상수나 메서드 등을 집어넣어서 관리하며 코드를 리팩터링할 때
110 | 해당 집합에 관한 로직 수정 시 이 부분만 수정하면 되므로 코드 리팩터링 시 강점이 생긴다.
111 |
112 | > after
113 |
114 | 상수의 집합을 정의할 때 사용되는 타입이다. 예를 들어 월, 일, 색상 등의 상수값을 담는다. 자바에서의 Enum은 다른 언어보다 더 활용되어 쓰이며 상수뿐만 아니라 메서드를 집어넣어서 관리할 수 있다. Enum을 기반으로 상수집합을 관리한다면 코드를 리팩터링할 때 상수집합에 대한 로직 수정 시 이 부분만 수정하게 된다는 장점, 본질적으로 스레드세이프(thread safe)하기 때문에 싱글톤 패턴을 만들 때 도움이 된다. 참고로 enum으로 만드는 싱글톤 패턴은 필자의 유투브 채널, 큰돌의 터전 - 'JAVA로 싱글톤 패턴을 구현하는 7가지 방법' 영상을 참고하시길 바랍니다.
115 |
116 | ## 40 페이지
117 | > before
118 |
119 | 프록시 객체의 target 동작을 가로채서 정의할 동작들이 정해져 있는 함수
120 |
121 | > after
122 |
123 | target 동작을 가로채고 어떠한 동작을 할 것인지가 설정되어 있는 함수
124 |
125 | ## 40 페이지
126 | > before
127 |
128 | new Proxy로 선언한 객체의 a와 b라는 속성에 특정 문자열을 담아서 handler에 “name이
129 | 라는 속성에 접근할 때는 a와 b라는 것을 합쳐서 문자열을 만들어라.”를 구현했습니다. 이
130 | 렇게 p라는 변수에 name이라는 속성을 선언하지 않았는데도 p.name으로 name 속성에 접근
131 | 하려고 할 때, 그 부분을 가로채 문자열을 만들어 반환하는 것을 볼 수 있습니다.
132 | 자바스크립트
133 |
134 | > after
135 |
136 | new Proxy()로 a와 b 속성을 가지고 있는 객체와 handler 함수를 매개변수로 넣고 p라는 변수를 선언했습니다. 이 후 p의 name 속성을 참조하니 a와 b라는 속성밖에 없는 객체가 handler의 “name이라는 속성에 접근할 때 a와 b를 합쳐서 문자열을 만들라” 는 로직에 따라 어떠한 문자열을 만드는 것을 볼 수 있습니다. 이렇게 name 속성 등 어떠한 속성에 접근할 때 그 부분을 가로채서 어떠한 로직을 강제할 수 있는게 프록시 객체입니다.
137 |
138 | ## 44 페이지
139 |
140 | > before
141 | 대상 객체 앞단의 인터페이스 역할을 하는 디자인패턴입니다.
142 |
143 | > after
144 | 해당 접근을 필터링하거나 수정하는 등의 역할을 하는 계층이 있는 디자인패턴입니다.
145 |
146 |
147 | ## 45 페이지
148 | > before
149 |
150 | 이를 통해 익명 사
151 | 용자의 직접적인 서버로의 접근을 차단하고 간접적으로 한 단계를 더 거침으로써 보안성
152 | 을 더욱 강화할 수 있습니다.
153 |
154 | > after
155 |
156 | 이를 통해 익명 사용자의 직접적인 서버로의 접근을 차단하고 간접적으로 한 단계를 더 거치게 만듦으로써 보안을 강화할 수 있습니다.
157 |
158 |
159 | ## 46 페이지
160 | > before
161 |
162 | CDN 말고도 CloudFlare를 통해 누릴 수 있는 이점은 많습니다. 대표적으로 DDOS 공격
163 | 방어, HTTPS 구축이 있습니다. 이 모든 것은 웹 서버 앞단에 두어 ‘프록시 서버’로 쓰기
164 | 때문에 가능한 것입니다.
165 |
166 | > after
167 |
168 | CloudFlare는 웹 서버 앞단에 프록시 서버로 두어 DDOS 공격방어, HTTPS 구축에 쓰입니다.
169 | 또한, 서비스를 배포해보면 해외에서 무언가 의심스럽고 많은 트래픽이 발생하기도 하고 이 때문에 많은 클라우드 서비스 비용이 발생할 수도 있는데 CloudFlare가 의심스러운 트래픽인지를 먼저 판단해 CAPTCHA 등을 기반으로 이를 일정부분 막아주는 역할도 수행합니다.
170 |
171 | ## 49 페이지
172 | > before
173 |
174 | 참고로 127.0.0.1이란 루프백 IP로, 본인 PC의 IP를 뜻합니다. localhost나 127.0.0.1을
175 | 입력하면 DNS를 타지 않고 바로 본인 PC로 연결됩니다.
176 |
177 |
178 | 참고로 CORS에 대한 자세한 설명은 필자가 만든 영상(https://bit.ly/3KfzrBh)을 참고하
179 | 기 바랍니다.
180 |
181 |
182 | 이터레이터 패턴(iterator pattern)은 이터레이터(iterator)를 사용하여 컬렉션(collection)의
183 | 요소들에 접근하는 디자인 패턴입니다.
184 |
185 |
186 | > after
187 |
188 | 참고로 127.0.0.1이란 루프백(loopback) IP로, 본인 PC 서버의 IP를 뜻합니다. localhost나 127.0.0.1을 주소창에 입력하면 DNS를 거치지 않고 바로 본인 PC 서버로 연결됩니다.
189 | CORS에 대한 자세한 설명은 필자의 유투브 채널, 큰돌의 터전 - 'CORS ' 영상을 참고하시길 바랍니다.
190 | 이터레이터 패턴(iterator pattern)은 이터레이터(iterator)를 사용하여 컬렉션(collection)의 요소들에 접근하는 디자인 패턴입니다. 이를 통해 순회할 수 있는 여러 가지 자료형의 구조와는 상관없이 이터레이터라는 하나의 인터페이스로 순회가 가능합니다.
191 |
192 | ## 50 페이지
193 | > before
194 |
195 | 이를 통해 순회할 수 있는 여러 가지 자료형의 구조와는 상관없이 이터레이터라는 하나의
196 | 인터페이스로 순회가 가능합니다.
197 |
198 | > after
199 |
200 | 앞의 그림은 이터레이터라는 똑같은 배로 동그라미로 이루어진 컬렉션이든 마름모로 이루어진 컬렉션이든 순회할 수 있는 것을 보여줍니다.
201 |
202 |
203 | ## 52 페이지
204 | > before
205 |
206 | a와 b는 다른 모듈에서 사용할 수 있는 변수나 함수인 privat 범위를 ...(생략)
207 |
208 | > after
209 |
210 | a와 b는 다른 모듈에서 사용할 수 없는 변수나 함수이며 private 범위를 가집니다. c와 d는 다른 모듈에서 사용할 수 있는 변수나 함수이며 public 범위를 가집니다. 참고로 위와 같은 노출모듈패턴을 기반으로 만든 자바스크립트 모듈 방식으로는 CJS(CommonJS) 모듈 방식이 있습니다.
211 |
212 | ## 54 페이지
213 | > before
214 |
215 | MVC 패턴의 예 리액트
216 | MVC 패턴을 이용한 대표적인 라이브러리로는 리액트(React.js)가 있습니다.
217 | 리액트는 유저 인터페이스를 구축하기 위한 라이브러리입니다. ‘가상 DOM’을 통해 실제
218 | DOM을 조작하는 것을 추상화해서 성능을 높였습니다.
219 | 대표적인 특성으로는 불변성(immutable)이 있습니다. 예를 들어 state는 setState를 통
220 | 해서만 수정이 가능하고, props를 기반으로 해서 만들어지는 컴포넌트인 pureComponent
221 | 가 있습니다. 단방향 바인딩이 적용되어 있고, 자유도가 높고, 메타(페이스북)가 운영하고
222 | 있으며 넷플릭스, 트위터, 드롭박스, 우버, 페이팔, 마이크로소프트 등에서 사용됩니다.
223 | 참고로 ‘가상 DOM’에 대한 자세한 설명은 필자가 만든 영상(https://bit.ly/3hDX620)을
224 | 참고하기 바랍니다.
225 |
226 | > after
227 |
228 | MVC 패턴을 이용한 대표적인 프레임워크로는 자바 진영에서 유명한 스프링(Spring) 이 있습니다.
229 |
230 | Spring의 WEB MVC는 웹서비스를 구축하는데 편리한 기능들을 많이 제공합니다. 예를 들어 @RequestParam, @RequestHeader, @PathVariable 등의 애너테이션을 기반으로 사용자의 요청값들을 쉽게 분석할 수 있으며 사용자의 어떠한 요청이 유효한 요청인지를 쉽게 거를 수 있습니다. 예를 들어 숫자를 입력해야 하는데 문자를 입력하는 사례 같은 것을 말이죠. 또한 재사용가능한 코드, 테스트, 쉽게 리디렉션할 수 있게 하는 등의 장점이 있습니다.
231 | 스프링에 대한 자세한 설명은 필자의 유투브 채널, 큰돌의 터전 - 'Spring과 MVC패턴' 영상을 참고하시길 바랍니다.
232 | [링크](https://youtu.be/6ty3GBhqTDM)
233 |
234 |
235 | ## 68 페이지
236 | > before
237 |
238 | 네트워크란 노드(node)와 링크(link)가 서로 연결되어 있거나 연결되어 있지 않은 집합체를 의미합니다.
239 |
240 | > after
241 |
242 | 네트워크란 노드(node)와 링크(link)가 서로 연결되어 있으며 리소스를 공유하는 집합을 의미합니다.
243 |
244 |
245 | ## 69 페이지
246 | > before
247 |
248 | 처리량(throughput)이란 링크를 통해 전달되는 단위 시간당 데이터양을 말합니다.
249 |
250 |
251 | 단위로는 bps(bits per second)를 씁니다. 초당 전송 또는 수신되는 비트 수라는 의미입
252 | 니다.
253 | 처리량은 사용자들이 많이 접속할 때마다 커지는 트래픽, 네트워크 장치 간의 대역폭, 네
254 | 트워크 중간에 발생하는 에러, 장치의 하드웨어 스펙에 영향을 받습니다.
255 | 네트워크란 노드(node)와 링크(link)가 서로 연결되어 있거나 연결되어 있지 않은 집합체를 의미합니다.
256 |
257 | > after
258 |
259 | 처리량(throughput)은 링크 내에서 성공적으로 전달된 데이터의 양을 말하며 보통 얼만큼의 트래픽을 처리했는지를 나타냅니다. 많은 트래픽을 처리한다 = 많은 처리량을 가진다. 라는 의미입니다.
260 | 단위로는 bps(bits per second)를 씁니다. 초당 전송 또는 수신되는 비트 수라는 의미입니다. 처리량은 사용자들이 많이 접속할 때마다 커지는 트래픽, 네트워크 장치 간의 대역폭, 네트워크 중간에 발생하는 에러, 장치의 하드웨어 스펙에 영향을 받습니다.
261 | 앞의 그림을 보면 트래픽이 있는데 트래픽은 특정시점에 링크 내의 “흐르는” 데이터의 양을 말합니다. 예를 들어 서버에 저장된 파일(문서,이미지,동영상 등)을 클라이언트(사용자)가 다운로드 시 발생되는 데이터의 누적량을 뜻합니다. 트래픽과 처리량을 헷갈릴 수 있는데 이렇게 이해하면 됩니다.
262 | - 트래픽이 많아졌다. = 흐르는 데이터가 많아졌다.
263 | - 처리량이 많아졌다. = 처리되는 트래픽이 많아졌다.
264 |
265 | ## 82 페이지
266 |
267 | > before
268 |
269 | 전송(transport) 계층은 송신자와 수신자를 연결하는 ... (생략)
270 |
271 | > after
272 |
273 | 전송(transport) 계층은 송신자와 수신자를 연결하는 통신 서비스를 제공하며 연결 지향 데이터 스트림 지원, 신뢰성, 흐름 제어를 제공할 수 있으며 애플리케이션과 인터넷 계층 사이의 데이터가 전달될 때 중계 역할을 합니다. 대표적으로 TCP와 UDP가 있습니다.
274 |
275 |
276 | ## 91 페이지
277 |
278 | > before
279 |
280 | CSMA/CA는 ... (생략)
281 |
282 | > after
283 |
284 | CSMA/CA는 반이중화 통신 중 하나로 장치에서 데이터를 보내기 전에 일련의 과정을 기반으로 사전에 가능한 한 충돌을 방지하는 방식을 말합니다.
285 | CSMA/CA로 프레임을 보낼 때 다음과 같은 과정이 일어납니다.
286 | 1. 사용중인 채널이 있다면 다른 채널을 감지하다 유후 상태인 채널을 발견합니다.
287 | 2. 프레임 간 공간 시간인 IFS(InterFrame Space)시간만큼 기다립니다. IFS는 프레임의 우선순위를 정의할 때도 사용됩니다. IFS가 낮으면 우선순위가 높습니다.
288 | 3. 프레임을 보내기전 0 ~ 2^k - 1 사이에서 결정된 랜덤상수를 기반으로 결정된 시간만큼 기다린 뒤 프레임을 보냅니다. 프레임을 보낸 뒤 제대로 송신이 되었고 ACK 세그먼트를 받았다면 마칩니다. 그러나 받지 못했다면 k = k + 1 을 하며 이 과정을 반복합니다. 반복하다 k가 정해진 Kmax 보다 더 커진다면 해당 프레임전송은 버립니다. (abort)
289 |
290 | ## 99 페이지
291 | > before
292 |
293 | 로드밸런서로는 L7 스위치뿐만 아니라.. (생략)
294 |
295 | > after
296 |
297 | 로드밸런서로는 L7 스위치뿐만 아니라 L4스위치도 있습니다. L4 스위치는 전송 계층
298 |
299 | ## 106 페이지
300 | > before
301 |
302 | IP주소를 통해 통신하는 과정을 홉바이홉... (생략)
303 |
304 | > after
305 |
306 | IP주소를 통해 통신하는 과정을 홉바이홉통신이라고 합니다.
307 | 여기서 홉(hop)이란 영어 뜻 자체로는 건너뛰는 모습을 의미합니다. 이는 통신망에서 각 패킷이 여러 개의 라우터를 건너가는 모습을 비유적으로 표현한 것입니다. 앞의 그림처럼 수많은 서브네트워크 안에 있는 라우터의 라우팅테이블의 IP를 기반으로 패킷을 전달하고 또 전달해나가며 라우팅을 수행하며 최종 목적지까지 패킷을 전달합니다.
308 |
309 | > before
310 |
311 | IPv6는 64비트를 16비트 단위로
312 |
313 | > after
314 |
315 | IPv6는 128비트를 16비트 단위로
316 |
317 | ## 109 페이지
318 | > before
319 |
320 | 클래스 기반 할당 방식(CIDR)
321 |
322 | > after
323 |
324 | 클래스 기반 할당 방식(classful network addressing)
325 |
326 | ## 117 페이지
327 | > before
328 |
329 | 하지만 Base64 문자열로 변환할 경우... (생략)
330 |
331 | > after
332 |
333 | 하지만 Base64 문자열로 변환할 경우 37% 정도 크기가 더 커지는 단점이 있습니다. 자세한 설명은 필자가 만든 영상을 참고하세요.
334 | - https://youtu.be/-bxZyTfhoH0
335 |
336 | ## 132 페이지 Q&A 1개추가
337 |
338 | www.naver.com을 주소창에 입력하면 어떻게 될까요?
339 |
340 | https://www.youtube.com/watch?v=5MM8NDzWHdE 에 영상을 올려놨습니다.
341 |
342 | ## 137 페이지
343 | > before
344 |
345 | 1은 유저모드라고 설정되며, 유저모드일 경우에는 시스템콜을 못하게 막아서 한정된 일만 가능하게 합니다.
346 |
347 | > after
348 |
349 | 1은 유저모드라고 설정됩니다.
350 |
351 | ## 143 페이지
352 |
353 | > before
354 |
355 | 보조기억장치 : HDD, SDD를 일컬으며 휘발성, 속도낮음, 기억 용량이 많습니다.
356 |
357 |
358 | > after
359 |
360 | 보조기억장치 : HDD, SDD를 일컬으며 비휘발성, 속도낮음, 기억 용량이 많습니다.
361 |
362 | ## 146 페이지
363 |
364 | > before
365 |
366 | 소프트웨어적인 대표적인 캐시로는 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세
367 | 션 스토리지가 있습니다. 이러한 것들은 보통 사용자의 커스텀한 정보나 인증 모듈 관련
368 | 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 아이덴티티나
369 | 중복 요청 방지를 위해 쓰입니다
370 |
371 |
372 | > after
373 |
374 | 소프트웨어적인 대표적인 캐시로는 웹 브라우저의 작은 저장소 쿠키, 로컬 스토리지, 세
375 | 션 스토리지가 있습니다. 보통 사용자의 커스텀한 정보나 인증 모듈 관련
376 | 사항들을 웹 브라우저에 저장해서 추후 서버에 요청할 때 자신을 나타내는 아이덴티티나
377 | 중복 요청 방지를 위해 쓰이며 오리진(origin)에 종속됩니다.
378 |
379 |
380 | ## 147 페이지
381 |
382 | > before
383 |
384 | 로컬 스토리지는 만료기한이 없는 키-값 저장소입니다. 10MB까지 저장할 수 있으며 웹
385 | 브라우저를 닫아도 유지되고 도메인 단위로 저장, 생성됩니다.
386 |
387 |
388 | > after
389 |
390 | 로컬 스토리지는 만료기한이 없는 키-값 저장소입니다. 5MB까지 저장할 수 있으며 웹
391 | 브라우저를 닫아도 유지됩니다.
392 |
393 |
394 | ## 149 페이지
395 | > before
396 |
397 | 스와핑
398 |
399 | 만약 가상 메모리에는 존재하지만 실제 메모리인... (생략)
400 |
401 | > after
402 |
403 | 스와핑
404 |
405 | 만약 가상 메모리에는 존재하지만 실제 메모리인 RAM에는 현재 없는 데이터나 코드에 접근할 경우 페이지 폴트가 발생합니다. 이 때 메모리의 당장 사용하지 않는 영역을 하드디스크로 옮기고 하드디스크의 일부분을 마치 메모리처럼 불러와쓰는 것을 스와핑(swapping)이라고 합니다. 이를 통해 마치 페이지폴트가 일어나지 않은 것처럼 만듭니다.
406 |
407 |
408 | ## 149 페이지
409 | > before
410 |
411 | 1. CPU는 물리메모리를 확인... (생략)
412 |
413 | > after
414 |
415 | 1. 어떤 명령어가 유효한 가상주소에 접근했으나 해당 페이지가 만약 없다면 트랩이 발생되어 운영체제에 알리게 됩니다.
416 | 2. 운영체제는 실제 디스크로부터 사용하지 않은 프레임을 찾습니다.
417 | 3. 해당 프레임을 실제 메모리에 가져와서 페이지교체알고리즘을 기반으로 특정페이지와 교체합니다. (이 때 스와핑이 일어납니다.)
418 | 4. 페이지테이블을 갱신시킨 후 해당 명령어를 다시 시작합니다.
419 |
420 | ## 151 페이지
421 | > before
422 |
423 | PFF(Page Fault Frequency)는 페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 만드는 방법입니다. 만약 상한선에 도달한다면 페이지를 늘리고 하한선에 도달한다면 페이지를 줄이는 것이죠.
424 |
425 | > after
426 |
427 | PFF(Page Fault Frequency)는 페이지 폴트 빈도를 조절하는 방법으로 상한선과 하한선을 만드는 방법입니다. 만약 상한선에 도달한다면 프레임을 늘리고 하한선에 도달한다면 프레임을 줄이는 것이죠.
428 |
429 |
430 | ## 153 페이지
431 | > before
432 |
433 | 페이지드 세그멘테이션(paged segmentation)은 공유나 보안을 의미 단위의 세그먼트로 나
434 | 누고, 물리적 메모리는 페이지로 나누는 것을 말합니다.
435 |
436 |
437 | > after
438 |
439 | 페이지드 세그멘테이션(paged segmentation)은 프로그램을 의미 단위인 세그먼트로 나눠 공유나 보안 측면에 강점을 두고 임의의 길이가 아닌 동일한 크기의 페이지 단위로 나누는 것을 말합니다.
440 |
441 | ## 154페이지
442 | > before
443 |
444 | recentle
445 |
446 |
447 | > after
448 |
449 | recently
450 |
451 | ## 166페이지
452 | > before
453 |
454 | 신뢰성이 높은 강점이 있습니다.
455 |
456 |
457 | > after
458 |
459 | 신뢰성이 높은 강점이 있습니다.
460 | 참고로 멀티프로세싱은 하드웨어 관점에서 봤을 때 여러 개의 프로세서로 작업을 처리하는 것을 의미하기도 합니다. 이 책에서는 멀티스레딩과 멀티프로세싱을 비교하고 있고 그 다음으로 멀티프로세스 구조를 가진 브라우저를 예시로 들고 있기 때문에 소프트웨어 관점에서 멀티프로세싱을 설명했습니다.
461 |
462 | ## 169페이지
463 | > before
464 |
465 | unamed
466 |
467 |
468 | > after
469 |
470 | unnamed
471 |
472 |
473 | ## 163페이지
474 | > before
475 |
476 | ### 스택
477 | 스택에는 지역변수, 매개변수, 함수가 저장되고 컴파일 시에 크기가 결정되며 ‘동적’인 특
478 | 징을 갖습니다.
479 | 스택 영역은 함수가 함수를 재귀적으로 호출하면서 동적으로 크기가 늘어날 수 있는데,
480 | 이때 힙과 스택의 메모리 영역이 겹치면 안 되기 때문에 힙과 스택 사이의 공간을 비워 놓
481 | 습니다.
482 |
483 |
484 | ### 힙
485 | 힙은 동적 할당할 때 사용되며 런타임 시 크기가 결정됩니다. 예를 들어 벡터 같은 동적
486 | 배열은 당연히 힙에 동적 할당됩니다. 힙은 ‘동적’인 특징을 가집니다.
487 |
488 |
489 | ### 데이터 영역
490 | 데이터 영역은 전역변수, 정적변수가 저장되고, 정적인 특징을 갖는 프로그램이 종료되면
491 | 사라지는 변수가 들어 있는 영역입니다.
492 |
493 |
494 | 데이터 영역은 BSS 영역과 Data 영역으로 나뉘고, BSS 영역은 초기화가 되지 않은 변수
495 | 가 0으로 초기화되어 저장되며 Data 영역(Data segment)은 0이 아닌 다른 값으로 할당된
496 | 변수들이 저장됩니다.
497 |
498 | ### 코드 영역
499 | 코드 영역은 프로그램에 내장되어 있는 소스 코드가 들어가는 영역입니다. 이 영역은 수
500 | 정 불가능한 기계어로 저장되어 있으며 정적인 특징을 가집니다.
501 |
502 | > after
503 |
504 | ### 스택과 힙
505 | 스택과 힙은 동적할당이 되며 동적할당은 런타임단계에서 메모리를 할당받는 것을 말합니다.
506 | 스택은 지역변수, 매개변수, 실행되는 함수에 의해 늘어들거나 줄어드는 메모리 영역입니다. 함수가 호출될 때마다 호출될 때의 환경 등 특정 정보가 스택에 계속해서 저장됩니다.
507 | 또한, 재귀함수가 호출된다고 했을 때 새로운 스택 프레임이 매번 사용되기 때문에 함수 내의 변수 집합이 해당 함수의 다른 인스턴스 변수를 방해하지 않습니다.
508 | 힙은 동적으로 할당되는 변수들을 담습니다. malloc(), free() 함수를 통해 관리할 수 있으며 동적으로 관리되는 자료구조의 경우 힙영역을 사용합니다. 예를 들어 vector는 내부적으로 힙영역을 사용합니다.
509 |
510 | ### 데이터 영역과 코드 영역
511 | 이 영역은 정적할당되는 영역입니다. 정적할당은 컴파일단계에서 메모리를 할당하는 것을 말합니다. 데이터 영역은 BSS segment와 Data segment, code / text segment 로 나뉘어서 저장됩니다.
512 | BSS segment는 전역변수 또는 static, const로 선언되어있고 0으로 초기화 또는 초기화가 어떠한 값으로도 되어 있지 않은 변수들이 이 메모리 영역에 할당되며 Data segment은 전역변수 또는 static, const 로 선언되어있고 0이 아닌 값으로 초기화된 변수가 이 메모리 영역에 할당됩니다.
513 | code segment는 프로그램의 코드가 들어갑니다.
514 |
515 |
516 | ## 164페이지
517 | > before
518 |
519 | 프로세스 스케줄링 상태 : '준비', .... (생략)
520 |
521 | > after
522 |
523 | 프로세스 스케줄링 상태 : '준비', '일시중단' 등 프로세스가 CPU에 대한 소유권을 얻은 이후의 프로세스의 상태
524 |
525 | ## 164페이지
526 | > before
527 |
528 | PCB를 교환하는 과정을 말합니다.
529 |
530 | > after
531 |
532 | PCB를 기반으로 프로세스의 상태를 저장하고 로드시키는 과정을 말합니다.
533 |
534 | ## 169페이지
535 | > before
536 |
537 | unamed
538 | > after
539 |
540 | unnamed
541 |
542 | ## 173페이지
543 |
544 | > before
545 |
546 | 공유자원에 접근할 때 순서 등의 이유로 ... (생략)
547 |
548 | > after
549 |
550 | ### 임계 영역
551 | 임계영역(critical section)은 둘 이상의 프로세스, 스레드가 공유자원에 접근할 때 순서 등의 이유로 결과가 달라지는 코드 영역을 말합니다.
552 | 임계 영역을 해결하기 위한 방법은 크게 뮤텍스, 세마포어, 모니터 세 가지가 있으며, 이 방법 모두 상호 배제, 한정 대기, 융통성이란 조건을 만족합니다.
553 | 이 방법에 토대가 되는 메커니즘은 잠금(lock)입니다. 예를 들어 임계 영역을 화장실이라고 가정하면 화장실에 A라는 사람이 들어간 다음 문을 잠급니다. 그리고 다음 사람이 이를 기다리다 A가 나오면 화장실을 쓰는 방법입니다.
554 |
555 | ## 174페이지
556 | > before
557 |
558 | 뮤텍스(mutext)는 공유 자원을 ... (생략)
559 |
560 | > after
561 |
562 | ### 뮤텍스
563 |
564 | 뮤텍스(mutex)는 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금해제하는 객체입니다. 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고 해제는 그와 반대입니다. 또한 뮤텍스는 잠금 또는 잠금해제라는 상태만을 가집니다.
565 |
566 | ## 174페이지
567 | > before
568 |
569 | 상호배제
570 |
571 | 한정 대기
572 |
573 | 융통성
574 |
575 | 한 프로세스가 다른 프로세스를 방해해서는 안된다.
576 |
577 | > after
578 |
579 | 상호 배제(mutual exclusion)
580 |
581 | 한정 대기(bounded waiting)
582 |
583 | 융통성(progress)
584 |
585 | 만약 어떠한 프로세스도 임계영역을 사용하지 않는다면 임계영역 외부의 어떠한 프로세스도 들어갈 수 있으며 이 때 프로세스끼리 서로 방해하지 않는다.
586 |
587 |
588 | ### 뮤텍스
589 |
590 | 뮤텍스(mutex)는 프로세스나 스레드가 공유 자원을 lock()을 통해 잠금 설정하고 사용한 후에는 unlock()을 통해 잠금해제하는 객체입니다. 잠금이 설정되면 다른 프로세스나 스레드는 잠긴 코드 영역에 접근할 수 없고 해제는 그와 반대입니다. 또한 뮤텍스는 잠금 또는 잠금해제라는 상태만을 가집니다.
591 |
592 |
593 |
594 | ## 175페이지
595 | > before
596 |
597 | 프로세스가 공유 자원에 접근하면... (생략)
598 |
599 | > after
600 |
601 | 프로세스나 스레드가 공유자원에 접근하면 세마포어에서 wait() 작업을 수행하고 프로세스나 스레드가 공유자원을 해제하면 세마포어에서 signal() 작업을 수행합니다. 세마포어에는 조건 변수가 없고 프로세스나 스레드가 세마포어 값을 수정할 때 다른 프로세스나 스레드는 동시에 세마포어 값을 수정할 수 없습니다.
602 |
603 | ### 바이너리 세마포어
604 | 바이너리 세마포어는 0과 1의 두가지 값만 가질 수 있는 세마포어입니다. 구현의 유사성으로 인해 뮤텍스는 바이너리 세마포어라고 할 수 있지만 엄밀히 말하면 뮤텍스는 잠금을 기반으로 상호배제가 일어나는 "잠금 메커니즘"이고, 세마포어는 신호를 기반으로 상호 배제가 일어나는 "신호 메커니즘"입니다.
605 | 여기서 신호 메커니즘은 휴대폰에서 노래를 듣다가 친구로부터 전화가 오면 노래가 중지되고 통화 처리 작업에 관한 인터페이스가 등장하는 것을 상상하면 됩니다.
606 |
607 |
608 | ## 179페이지
609 |
610 | > before
611 |
612 | 기존 SJF 스케줄링의 경우 긴 시간을 가진 프로세스가 실행되지 않는 현상이 있었습니다.
613 | 이는 오래된 작업일수록 ‘우선순위를 높이는 방법(aging)’을 통해 단점을 보완한 알고리즘
614 | 을 말합니다
615 |
616 | > after
617 |
618 | 기존 SJF 스케줄링의 경우 긴 시간을 가진 프로세스가 실행되지 않는 현상이 있었습니다. 이를 오래된 작업일수록 ‘우선순위를 높이는 방법(aging)’을 통해 해당 단점을 보완한 알고리즘을 말합니다.참고로 우선순위는 앞서 설명한 SJF와 우선순위를 말하는 것 뿐만 아니라 FCFS를 활용하여 만들기도 하며 선점형, 비선점형적인 우선순위 스케줄링 알고리즘을 말하기도 합니다.
619 |
620 |
621 |
622 | ## 180페이지
623 |
624 | > before
625 |
626 | 라운드 로빈(RR, Round Robin)은 현대 컴퓨터가 쓰는 스케줄링인 우선순위 스케줄링
627 | (priority scheduling)의 일종으로 각 프로세스는 동일한 할당 시간을 주고 그 시간 안에 끝
628 | 나지 않으면 다시 준비 큐(ready queue)의 뒤로 가는 알고리즘입니다.
629 |
630 | > after
631 |
632 | 라운드 로빈(RR, Round Robin)은 현대 컴퓨터가 쓰는 선점형 알고리즘 스케줄링 방법으로 각 프로세스는 동일한 할당 시간을 주고 그 시간 안에 끝
633 | 나지 않으면 다시 준비 큐(ready queue)의 뒤로 가는 알고리즘입니다.
634 |
635 | ## 181페이지
636 |
637 | > before
638 |
639 | RB
640 |
641 | > after
642 |
643 | RR
644 |
645 | ## 182페이지
646 | > before
647 |
648 | HDD, SDD를 일컬으며 휘발성,
649 |
650 | > after
651 |
652 | HDD, SDD를 일컬으며 비휘발성,
653 |
654 | ## 186페이지
655 | > before
656 |
657 | NoSQL 데이터베이스의 구조는... (생략)
658 |
659 | > after
660 |
661 | MongoDB 데이터베이스의 구조는 도큐먼트 - 컬렉션 - 데이터베이스로 이루어져 있습니다.
662 |
663 | ## 190페이지
664 | - 표 4 - 1 / 오른쪽 상단 : 최댓값 (부호 있음) / 최댓값 (부호 없음)
665 | - 표 4 - 1 / BIGINT : 2^63, 2^63 - 1, 2^64 - 1
666 | - 숫자 3개마다 , 찍혀야 합니다. ex) 32768 -> 32,768
667 |
668 |
669 | ## 191페이지
670 | > before
671 |
672 | 그렇기 때문에 지정된 형태에 ... (생략)
673 |
674 | > after
675 |
676 | 그렇기 때문에 CHAR의 경우 유동적이지 않은 길이를 가지 데이터의 경우 효율적이며 유동적인 길이를 가진 데이터는 VARCHAR로 저장하는 것이 좋습니다.
677 |
678 | ## 191페이지
679 | > before
680 |
681 | CHAR는 테이블을 생성할 때 선언한 길이로 고정되며 길이는 0에서 255 사이의 값을 가
682 | 집니다. 레코드를 저장할 때 무조건 선언한 길이 값으로 ‘고정’해서 저장됩니다.
683 |
684 | > after
685 |
686 | CHAR는 고정 길이 문자열이며 길이는 0에서 255 사이의 값을 가집니다. 레코드를 저장할 때 무조건 선언한 길이 값으로 ‘고정’해서 저장됩니다. 예를 들어 CHAR(100)으로 선언한 후 10글자를 저장해도 100바이트로 저장되게 됩니다.
687 |
688 |
689 | ## 211페이지
690 | > BEFORE
691 |
692 | ### REPEATABLE_READ
693 | REPEATABLE_READ는 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없
694 | 도록 막아주지만 새로운 행을 추가하는 것은 막지 않습니다. 따라서 이후에 추가된 행이
695 | 발견될 수도 있습니다.
696 |
697 |
698 | ### READ_COMMITTED
699 | READ_COMMITTED 는 가장 많이 사용되는 격리 수준이며 MySQL8.0, PostgreSQL,
700 | SQL Server, 오라클에서 기본값으로 설정되어 있습니다. READ UNCOMMITTED 와
701 | 는 달리 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없습니다. 즉, 커밋 완료된 데이
702 | 터에 대해서만 조회를 허용합니다.
703 | 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다. 예를 들어 트
704 | 랜잭션 A가 수정한 행을 트랜잭션 B가 수정할 수도 있습니다. 이 때문에 트랜잭션 A가 같
705 | 은 행을 다시 읽을 때 다른 내용이 발견될 수 있습니다.
706 |
707 | > AFTER
708 |
709 | ### REPEATABLE_READ
710 | REPEATABLE_READ는 하나의 트랜잭션이 수정한 행을 다른 트랜잭션이 수정할 수 없
711 | 도록 막아주지만 새로운 행을 추가하는 것은 막지 않습니다. 따라서 이후에 추가된 행이
712 | 발견될 수도 있습니다.이는 MySQL8.0의 innoDB 기본값이기도 합니다.
713 |
714 | ### READ_COMMITTED
715 | READ_COMMITTED 는 가장 많이 사용되는 격리 수준이며 PostgreSQL,
716 | SQL Server, 오라클에서 기본값으로 설정되어 있습니다. READ UNCOMMITTED 와
717 | 는 달리 다른 트랜잭션이 커밋하지 않은 정보는 읽을 수 없습니다. 즉, 커밋 완료된 데이
718 | 터에 대해서만 조회를 허용합니다.
719 | 하지만 어떤 트랜잭션이 접근한 행을 다른 트랜잭션이 수정할 수 있습니다. 예를 들어 트
720 | 랜잭션 A가 수정한 행을 트랜잭션 B가 수정할 수도 있습니다. 이 때문에 트랜잭션 A가 같
721 | 은 행을 다시 읽을 때 다른 내용이 발견될 수 있습니다.
722 |
723 | ## 234페이지
724 |
725 | > BEFORE
726 |
727 | 시간 복잡도란 ‘문제를 해결하는 데 걸리는 시간과 입력의 함수 관계’를 가리킵니다. 어떠
728 | 한 알고리즘의 로직이 ‘얼마나 오랜 시간’이 걸리는지를 나타내는 데 쓰이며, 보통 빅오 표
729 | 기법으로 나타냅니다
730 |
731 | > AFTER
732 |
733 | 시간복잡도란 입력크기에 대해 어떠한 알고리즘이 실행되는데 걸리는 시간이며 주요로직의 반복횟수를 중점으로 측정되며, 보통 빅오 표기법으로 나타냅니다
734 |
735 |
736 |
737 | ## 239페이지
738 |
739 | > BEFORE
740 |
741 | 여기서 설명하는 배열은 ‘정적 배열’을 기반으로 설명합니다. 탐색에 O(1)이 되어 랜덤
742 | 접근(random access)이 가능합니다. 삽입과 삭제에는 O(n)이 걸립니다. 따라서 데이터
743 | 추가와 삭제를 많이 하는 것은 연결 리스트, 탐색을 많이 하는 것은 배열로 하는 것이 좋
744 | 습니다.
745 | 배열은 인덱스에 해당하는 원소를 빠르게 접근해야 하거나 간단하게 데이터를 쌓고 싶을
746 | 때 사용합니다.
747 |
748 | > AFTER
749 |
750 | 여기서 설명하는 배열은 ‘정적 배열’을 기반으로 설명합니다. 접근(참조)에 O(1)의 시간복잡도를 가지며 랜덤
751 | 접근(random access)이 가능합니다. 삽입과 삭제에는 O(n)이 걸립니다. 따라서 데이터
752 | 추가와 삭제를 많이 하는 것은 연결 리스트, 접근(참조)을 많이 하는 것은 배열로 하는 것이 좋
753 | 습니다.
754 |
755 |
756 |
757 |
758 |
759 | ## 241페이지
760 |
761 | > BEFORE
762 |
763 | 앞의 그림에서 유추할 수 있듯이 탐색은 배열이 빠르고 연결리스트는 느리죠. 배열의 경우 그저 상자 위에 있는 요소를 탐색하면 되는 반면에, 연결 리스트는 상자를 열어야 하고 주어진 선을 기반으로 순차적으로 열어야 합니다.
764 |
765 | > AFTER
766 |
767 | 앞의 그림에서 유추할 수 있듯이 n번째 요소의 접근(참조)은 배열은 빠르고 연결리스트는 느리죠. 배열의 경우 그저 상자 위에 있는 요소를 접근하면 되기 때문에 O(1)의 시간복잡도를 가지고, 연결 리스트는 매번 상자를 열어야 하고 주어진 선을 기반으로 순차적으로 열어야 하기 때문에 접근(참조)의 경우 O(n)의 시간복잡도를 가집니다. 즉, 참조가 많이 일어나는 작업의 경우 배열이 빠르고 연결리스트는 느립니다.
768 |
769 | > BEFORE
770 |
771 | 맨 뒤나 맨 앞이 아닌
772 | (vector설명중)
773 |
774 | > AFTER
775 |
776 | 맨 뒤가 아닌
777 | (vector설명중)
778 |
779 |
780 | ## 242페이지
781 |
782 | > BEFORE
783 |
784 | 수식 중 logn
785 |
786 | > AFTER
787 |
788 | 수식 중 log2n
789 |
790 | ## 250페이지
791 |
792 | > BEFORE
793 |
794 | 루트 노드와 내부 노드 사이에 있는 노드를 뜻합니다.
795 |
796 | > AFTER
797 |
798 | 루트 노드와 리프 노드 사이에 있는 노드를 뜻합니다.
799 |
800 |
801 |
--------------------------------------------------------------------------------
/ch0/README.md:
--------------------------------------------------------------------------------
1 | .
2 |
--------------------------------------------------------------------------------
/ch0/a.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const app = express()
3 | const port = 3000
4 |
5 | app.get('/aaa', (req, res) => {
6 | const obj = {
7 | "name" : "kundol"
8 | }
9 | res.send(obj)
10 | })
11 |
12 | app.listen(port, () => {
13 | console.log(`http://127.0.0.1:${port}`)
14 | })
--------------------------------------------------------------------------------
/ch0/a.json:
--------------------------------------------------------------------------------
1 | {
2 | "name" : "kundol",
3 | "tall" : "200lkadsjhglsdjgplsjhdflghsdlkfhglksjfdhgklsadfhgklhlkjh"
4 | }
--------------------------------------------------------------------------------
/ch0/api.json:
--------------------------------------------------------------------------------
1 | {
2 | "latitude": 37.5,
3 | "longitude": 126.875,
4 | "generationtime_ms": 0.3180503845214844,
5 | "utc_offset_seconds": 0,
6 | "timezone": "GMT",
7 | "timezone_abbreviation": "GMT",
8 | "elevation": 34.0,
9 | "hourly_units": {
10 | "time": "iso8601",
11 | "temperature_2m": "°C"
12 | },
13 | "hourly": {
14 | "time": ["2022-09-18T00:00", "2022-09-18T01:00", "2022-09-18T02:00", "2022-09-18T03:00", "2022-09-18T04:00", "2022-09-18T05:00", "2022-09-18T06:00", "2022-09-18T07:00", "2022-09-18T08:00", "2022-09-18T09:00", "2022-09-18T10:00", "2022-09-18T11:00", "2022-09-18T12:00", "2022-09-18T13:00", "2022-09-18T14:00", "2022-09-18T15:00", "2022-09-18T16:00", "2022-09-18T17:00", "2022-09-18T18:00", "2022-09-18T19:00", "2022-09-18T20:00", "2022-09-18T21:00", "2022-09-18T22:00", "2022-09-18T23:00", "2022-09-19T00:00", "2022-09-19T01:00", "2022-09-19T02:00", "2022-09-19T03:00", "2022-09-19T04:00", "2022-09-19T05:00", "2022-09-19T06:00", "2022-09-19T07:00", "2022-09-19T08:00", "2022-09-19T09:00", "2022-09-19T10:00", "2022-09-19T11:00", "2022-09-19T12:00", "2022-09-19T13:00", "2022-09-19T14:00", "2022-09-19T15:00", "2022-09-19T16:00", "2022-09-19T17:00", "2022-09-19T18:00", "2022-09-19T19:00", "2022-09-19T20:00", "2022-09-19T21:00", "2022-09-19T22:00", "2022-09-19T23:00", "2022-09-20T00:00", "2022-09-20T01:00", "2022-09-20T02:00", "2022-09-20T03:00", "2022-09-20T04:00", "2022-09-20T05:00", "2022-09-20T06:00", "2022-09-20T07:00", "2022-09-20T08:00", "2022-09-20T09:00", "2022-09-20T10:00", "2022-09-20T11:00", "2022-09-20T12:00", "2022-09-20T13:00", "2022-09-20T14:00", "2022-09-20T15:00", "2022-09-20T16:00", "2022-09-20T17:00", "2022-09-20T18:00", "2022-09-20T19:00", "2022-09-20T20:00", "2022-09-20T21:00", "2022-09-20T22:00", "2022-09-20T23:00", "2022-09-21T00:00", "2022-09-21T01:00", "2022-09-21T02:00", "2022-09-21T03:00", "2022-09-21T04:00", "2022-09-21T05:00", "2022-09-21T06:00", "2022-09-21T07:00", "2022-09-21T08:00", "2022-09-21T09:00", "2022-09-21T10:00", "2022-09-21T11:00", "2022-09-21T12:00", "2022-09-21T13:00", "2022-09-21T14:00", "2022-09-21T15:00", "2022-09-21T16:00", "2022-09-21T17:00", "2022-09-21T18:00", "2022-09-21T19:00", "2022-09-21T20:00", "2022-09-21T21:00", "2022-09-21T22:00", "2022-09-21T23:00", "2022-09-22T00:00", "2022-09-22T01:00", "2022-09-22T02:00", "2022-09-22T03:00", "2022-09-22T04:00", "2022-09-22T05:00", "2022-09-22T06:00", "2022-09-22T07:00", "2022-09-22T08:00", "2022-09-22T09:00", "2022-09-22T10:00", "2022-09-22T11:00", "2022-09-22T12:00", "2022-09-22T13:00", "2022-09-22T14:00", "2022-09-22T15:00", "2022-09-22T16:00", "2022-09-22T17:00", "2022-09-22T18:00", "2022-09-22T19:00", "2022-09-22T20:00", "2022-09-22T21:00", "2022-09-22T22:00", "2022-09-22T23:00", "2022-09-23T00:00", "2022-09-23T01:00", "2022-09-23T02:00", "2022-09-23T03:00", "2022-09-23T04:00", "2022-09-23T05:00", "2022-09-23T06:00", "2022-09-23T07:00", "2022-09-23T08:00", "2022-09-23T09:00", "2022-09-23T10:00", "2022-09-23T11:00", "2022-09-23T12:00", "2022-09-23T13:00", "2022-09-23T14:00", "2022-09-23T15:00", "2022-09-23T16:00", "2022-09-23T17:00", "2022-09-23T18:00", "2022-09-23T19:00", "2022-09-23T20:00", "2022-09-23T21:00", "2022-09-23T22:00", "2022-09-23T23:00", "2022-09-24T00:00", "2022-09-24T01:00", "2022-09-24T02:00", "2022-09-24T03:00", "2022-09-24T04:00", "2022-09-24T05:00", "2022-09-24T06:00", "2022-09-24T07:00", "2022-09-24T08:00", "2022-09-24T09:00", "2022-09-24T10:00", "2022-09-24T11:00", "2022-09-24T12:00", "2022-09-24T13:00", "2022-09-24T14:00", "2022-09-24T15:00", "2022-09-24T16:00", "2022-09-24T17:00", "2022-09-24T18:00", "2022-09-24T19:00", "2022-09-24T20:00", "2022-09-24T21:00", "2022-09-24T22:00", "2022-09-24T23:00"],
15 | "temperature_2m": [25.1, 26.5, 27.6, 28.6, 29.8, 30.9, 31.5, 31.7, 31.4, 30.3, 28.7, 27.8, 26.8, 25.6, 25.2, 24.9, 24.2, 24.2, 24.2, 24.0, 23.5, 22.9, 22.6, 23.1, 24.4, 26.6, 27.6, 27.7, 27.5, 27.0, 26.3, 25.7, 24.7, 23.1, 21.5, 20.3, 19.3, 18.3, 17.7, 17.3, 17.0, 16.8, 16.5, 16.3, 15.8, 15.3, 15.3, 16.9, 18.2, 19.1, 20.0, 20.7, 21.4, 22.0, 22.2, 22.1, 21.7, 20.9, 19.5, 18.6, 17.7, 16.8, 16.0, 15.4, 15.0, 14.5, 13.8, 13.4, 12.9, 12.6, 12.4, 14.7, 16.9, 19.0, 20.7, 21.5, 22.2, 22.7, 22.9, 22.7, 22.4, 21.5, 20.5, 19.2, 17.7, 16.9, 16.4, 15.8, 15.4, 15.2, 14.9, 14.4, 13.8, 13.7, 14.8, 16.5, 18.6, 19.9, 21.1, 22.4, 23.1, 23.4, 23.6, 23.4, 22.9, 22.0, 21.1, 20.0, 18.7, 18.0, 17.5, 16.7, 16.0, 15.2, 14.6, 14.8, 15.3, 16.2, 17.1, 18.2, 19.7, 21.0, 22.3, 23.3, 23.1, 22.3, 21.2, 20.4, 19.6, 18.6, 18.1, 17.7, 17.2, 16.8, 16.6, 16.2, 15.8, 15.4, 15.1, 15.2, 15.5, 16.2, 17.2, 18.5, 20.1, 21.1, 22.1, 22.9, 23.2, 23.2, 23.0, 22.7, 22.2, 21.3, 20.4, 19.2, 17.8, 17.2, 16.7, 16.1, 15.5, 14.8, 14.1, 13.5, 12.9, 12.8, 13.6, 15.0]
16 | }
17 | }
--------------------------------------------------------------------------------
/ch0/b.js:
--------------------------------------------------------------------------------
1 | const express = require('express')
2 | const app = express()
3 | const port = 3000
4 | const fs = require('fs')
5 | app.get('/', (req, res) => {
6 | const f = JSON.parse(fs.readFileSync("a.json", {encoding:"utf-8"}))
7 | const data = {
8 | "name" : f.name
9 | }
10 | res.send(data)
11 | })
12 |
13 | app.listen(port, () => {
14 | console.log(`http://127.0.0.1:${port}`)
15 | })
16 |
17 |
--------------------------------------------------------------------------------
/ch0/c.json:
--------------------------------------------------------------------------------
1 | {
2 | "CSKnowledgeList": [{
3 | "name": "디자인패턴",
4 | "difficult": 5
5 | },
6 | {
7 | "name": "네트워크",
8 | "difficult": 4
9 | }
10 | ]
11 | }
--------------------------------------------------------------------------------
/ch0/c.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 디자인패턴5
4 |
5 |
6 | 네트워크4
7 |
8 |
--------------------------------------------------------------------------------
/ch0/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | Document
9 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
51 |
52 |
--------------------------------------------------------------------------------
/ch1/1.js:
--------------------------------------------------------------------------------
1 | const obj = {
2 | a: 27
3 | }
4 | const obj2 = {
5 | a: 27
6 | }
7 | console.log(obj === obj2)
8 | // false
9 |
--------------------------------------------------------------------------------
/ch1/10.js:
--------------------------------------------------------------------------------
1 | function createReactiveObject(target, callback) {
2 | const proxy = new Proxy(target, {
3 | set(obj, prop, value){
4 | if(value !== obj[prop]){
5 | const prev = obj[prop]
6 | obj[prop] = value
7 | callback(`${prop}가 [${prev}] >> [${value}] 로 변경되었습니다`)
8 | }
9 | return true
10 | }
11 | })
12 | return proxy
13 | }
14 | const a = {
15 | "형규" : "솔로"
16 | }
17 | const b = createReactiveObject(a, console.log)
18 | b.형규 = "솔로"
19 | b.형규 = "커플"
20 | // 형규가 [솔로] >> [커플] 로 변경되었습니다
21 |
--------------------------------------------------------------------------------
/ch1/11.js:
--------------------------------------------------------------------------------
1 | const mp = new Map()
2 | mp.set('a', 1)
3 | mp.set('b', 2)
4 | mp.set('cccc', 3)
5 | const st = new Set()
6 | st.add(1)
7 | st.add(2)
8 | st.add(3)
9 | const a = []
10 | for(let i = 0; i < 10; i++)a.push(i)
11 |
12 | for(let aa of a) console.log(aa)
13 | for(let a of mp) console.log(a)
14 | for(let a of st) console.log(a)
15 | /*
16 | a, b, c
17 | [ 'a', 1 ]
18 | [ 'b', 2 ]
19 | [ 'c', 3 ]
20 | 1
21 | 2
22 | 3
23 | */
24 |
--------------------------------------------------------------------------------
/ch1/12.js:
--------------------------------------------------------------------------------
1 | const pukuba = (() => {
2 | const a = 1
3 | const b = () => 2
4 | const public = {
5 | c : 2,
6 | d : () => 3
7 | }
8 | return public
9 | })()
10 | console.log(pukuba)
11 | console.log(pukuba.a)
12 | // { c: 2, d: [Function: d] }
13 | // undefined
14 |
--------------------------------------------------------------------------------
/ch1/13.js:
--------------------------------------------------------------------------------
1 | const list = [1, 2, 3, 4, 5, 11, 12]
2 | const ret = list.reduce((max, num) => num > max ? num : max, 0)
3 | console.log(ret) // 12
4 |
--------------------------------------------------------------------------------
/ch1/14.js:
--------------------------------------------------------------------------------
1 | const ret = [1, 2, 3, 4, 5, 11, 12]
2 | class List {
3 | constructor(list) {
4 | this.list = list
5 | this.mx = list.reduce((max, num) => num > max ? num : max, 0)
6 | }
7 | getMax() {
8 | return this.mx
9 | }
10 | }
11 | const a = new List(ret)
12 | console.log(a.getMax()) // 12
13 |
--------------------------------------------------------------------------------
/ch1/15.java:
--------------------------------------------------------------------------------
1 | class Person {
2 |
3 | public void eat(String a) {
4 | System.out.println("I eat " + a);
5 | }
6 |
7 | public void eat(String a, String b) {
8 | System.out.println("I eat " + a + " and " + b);
9 | }
10 | }
11 |
12 | public class CalculateArea {
13 |
14 | public static void main(String[] args) {
15 | Person a = new Person();
16 | a.eat("apple");
17 | a.eat("tomato", "phodo");
18 | }
19 | }
20 | /*
21 | I eat apple
22 | I eat tomato and phodo
23 | */
24 |
--------------------------------------------------------------------------------
/ch1/16.java:
--------------------------------------------------------------------------------
1 | class Animal {
2 | public void bark() {
3 | System.out.println("mumu! mumu!");
4 | }
5 | }
6 |
7 | class Dog extends Animal {
8 | @Override
9 | public void bark() {
10 | System.out.println("wal!!! wal!!!");
11 | }
12 | }
13 |
14 | public class Main {
15 | public static void main(String[] args) {
16 | Dog d = new Dog();
17 | d.bark();
18 | }
19 | }
20 | /*
21 | wal!!! wal!!!
22 | */
23 |
--------------------------------------------------------------------------------
/ch1/17.js:
--------------------------------------------------------------------------------
1 | const ret = [1, 2, 3, 4, 5, 11, 12]
2 | let a = 0
3 | for(let i = 0; i < ret.length; i++){
4 | a = Math.max(ret[i], a)
5 | }
6 | console.log(a) // 12
7 |
--------------------------------------------------------------------------------
/ch1/2.js:
--------------------------------------------------------------------------------
1 | class Singleton {
2 | constructor() {
3 | if (!Singleton.instance) {
4 | Singleton.instance = this
5 | }
6 | return Singleton.instance
7 | }
8 | getInstance() {
9 | return this
10 | }
11 | }
12 | const a = new Singleton()
13 | const b = new Singleton()
14 | console.log(a === b) // true
15 |
--------------------------------------------------------------------------------
/ch1/3.js:
--------------------------------------------------------------------------------
1 | // DB 연결을 하는 것이기 때문에 비용이 더 높은 작업
2 | const URL = 'mongodb://localhost:27017/kundolapp'
3 | const createConnection = url => ({"url" : url})
4 | class DB {
5 | constructor(url) {
6 | if (!DB.instance) {
7 | DB.instance = createConnection(url)
8 | }
9 | return DB.instance
10 | }
11 | connect() {
12 | return this.instance
13 | }
14 | }
15 | const a = new DB(URL)
16 | const b = new DB(URL)
17 | console.log(a === b) // true
18 |
--------------------------------------------------------------------------------
/ch1/4.java:
--------------------------------------------------------------------------------
1 | class Singleton {
2 | private static class singleInstanceHolder {
3 | private static final Singleton INSTANCE = new Singleton();
4 | }
5 | public static Singleton getInstance() {
6 | return singleInstanceHolder.INSTANCE;
7 | }
8 | }
9 |
10 | public class HelloWorld{
11 | public static void main(String []args){
12 | Singleton a = Singleton.getInstance();
13 | Singleton b = Singleton.getInstance();
14 | System.out.println(a.hashCode());
15 | System.out.println(b.hashCode());
16 | if (a == b){
17 | System.out.println(true);
18 | }
19 | }
20 | }
21 | /*
22 | 705927765
23 | 705927765
24 | true
25 |
26 | 1. 클래스안에 클래스(Holder), static이며 중첩된 클래스인 singleInstanceHolder를
27 | 기반으로 객체를 선언했기 때문에 한 번만 로드되므로 싱글톤 클래스의 인스턴스는 애플리케이션 당 하나만 존재하며
28 | 클래스가 두 번 로드되지 않기 때문에 두 스레드가 동일한 JVM에서 2개의 인스턴스를 생성할 수 없습니다.
29 | 그렇기 때문에 동기화, 즉 synchronized를 신경쓰지 않아도 됩니다.
30 | 2. final 키워드를 통해서 read only 즉, 다시 값이 할당되지 않도록 했습니다.
31 | 3. 중첩클래스 Holder로 만들었기 때문에 싱글톤 클래스가 로드될 때 클래스가 메모리에 로드되지 않고
32 | 어떠한 모듈에서 getInstance()메서드가 호출할 때 싱글톤 객체를 최초로 생성 및 리턴하게 됩니다.
33 | */
34 |
--------------------------------------------------------------------------------
/ch1/5.js:
--------------------------------------------------------------------------------
1 | class CoffeeFactory {
2 | static createCoffee(type) {
3 | const factory = factoryList[type]
4 | return factory.createCoffee()
5 | }
6 | }
7 | class Latte {
8 | constructor() {
9 | this.name = "latte"
10 | }
11 | }
12 | class Espresso {
13 | constructor() {
14 | this.name = "Espresso"
15 | }
16 | }
17 |
18 | class LatteFactory extends CoffeeFactory{
19 | static createCoffee() {
20 | return new Latte()
21 | }
22 | }
23 | class EspressoFactory extends CoffeeFactory{
24 | static createCoffee() {
25 | return new Espresso()
26 | }
27 | }
28 | const factoryList = { LatteFactory, EspressoFactory }
29 |
30 |
31 | const main = () => {
32 | // 라떼 커피를 주문한다.
33 | const coffee = CoffeeFactory.createCoffee("LatteFactory")
34 | // 커피 이름을 부른다.
35 | console.log(coffee.name) // latte
36 | }
37 | main()
38 |
--------------------------------------------------------------------------------
/ch1/6.java:
--------------------------------------------------------------------------------
1 | enum CoffeeType {
2 | LATTE,
3 | ESPRESSO
4 | }
5 |
6 | abstract class Coffee {
7 | protected String name;
8 |
9 | public String getName() {
10 | return name;
11 | }
12 | }
13 |
14 | class Latte extends Coffee {
15 | public Latte() {
16 | name = "latte";
17 | }
18 | }
19 |
20 | class Espresso extends Coffee {
21 | public Espresso() {
22 | name = "Espresso";
23 | }
24 | }
25 |
26 | class CoffeeFactory {
27 | public static Coffee createCoffee(CoffeeType type) {
28 | switch (type) {
29 | case LATTE:
30 | return new Latte();
31 | case ESPRESSO:
32 | return new Espresso();
33 | default:
34 | throw new IllegalArgumentException("Invalid coffee type: " + type);
35 | }
36 | }
37 | }
38 |
39 | public class Main {
40 | public static void main(String[] args) {
41 | Coffee coffee = CoffeeFactory.createCoffee(CoffeeType.LATTE);
42 | System.out.println(coffee.getName()); // latte
43 | }
44 | }
45 |
--------------------------------------------------------------------------------
/ch1/7.java:
--------------------------------------------------------------------------------
1 | import java.text.DecimalFormat;
2 | import java.util.ArrayList;
3 | import java.util.List;
4 | interface PaymentStrategy {
5 | public void pay(int amount);
6 | }
7 |
8 | class KAKAOCardStrategy implements PaymentStrategy {
9 | private String name;
10 | private String cardNumber;
11 | private String cvv;
12 | private String dateOfExpiry;
13 |
14 | public KAKAOCardStrategy(String nm, String ccNum, String cvv, String expiryDate){
15 | this.name=nm;
16 | this.cardNumber=ccNum;
17 | this.cvv=cvv;
18 | this.dateOfExpiry=expiryDate;
19 | }
20 |
21 | @Override
22 | public void pay(int amount) {
23 | System.out.println(amount +" paid using KAKAOCard.");
24 | }
25 | }
26 |
27 | class LUNACardStrategy implements PaymentStrategy {
28 | private String emailId;
29 | private String password;
30 |
31 | public LUNACardStrategy(String email, String pwd){
32 | this.emailId=email;
33 | this.password=pwd;
34 | }
35 |
36 | @Override
37 | public void pay(int amount) {
38 | System.out.println(amount + " paid using LUNACard.");
39 | }
40 | }
41 |
42 | class Item {
43 | private String name;
44 | private int price;
45 | public Item(String name, int cost){
46 | this.name=name;
47 | this.price=cost;
48 | }
49 |
50 | public String getName() {
51 | return name;
52 | }
53 |
54 | public int getPrice() {
55 | return price;
56 | }
57 | }
58 |
59 | class ShoppingCart {
60 | List items;
61 |
62 | public ShoppingCart(){
63 | this.items=new ArrayList();
64 | }
65 |
66 | public void addItem(Item item){
67 | this.items.add(item);
68 | }
69 |
70 | public void removeItem(Item item){
71 | this.items.remove(item);
72 | }
73 |
74 | public int calculateTotal(){
75 | int sum = 0;
76 | for(Item item : items){
77 | sum += item.getPrice();
78 | }
79 | return sum;
80 | }
81 |
82 | public void pay(PaymentStrategy paymentMethod){
83 | int amount = calculateTotal();
84 | paymentMethod.pay(amount);
85 | }
86 | }
87 |
88 | public class HelloWorld{
89 | public static void main(String []args){
90 | ShoppingCart cart = new ShoppingCart();
91 |
92 | Item A = new Item("kundolA",100);
93 | Item B = new Item("kundolB",300);
94 |
95 | cart.addItem(A);
96 | cart.addItem(B);
97 |
98 | // pay by LUNACard
99 | cart.pay(new LUNACardStrategy("kundol@example.com", "pukubababo"));
100 | // pay by KAKAOBank
101 | cart.pay(new KAKAOCardStrategy("Ju hongchul", "123456789", "123", "12/01"));
102 | }
103 | }
104 | /*
105 | 400 paid using LUNACard.
106 | 400 paid using KAKAOCard.
107 | */
108 |
--------------------------------------------------------------------------------
/ch1/8.js:
--------------------------------------------------------------------------------
1 | var passport = require('passport')
2 | , LocalStrategy = require('passport-local').Strategy;
3 |
4 | passport.use(new LocalStrategy(
5 | function(username, password, done) {
6 | User.findOne({ username: username }, function (err, user) {
7 | if (err) { return done(err); }
8 | if (!user) {
9 | return done(null, false, { message: 'Incorrect username.' });
10 | }
11 | if (!user.validPassword(password)) {
12 | return done(null, false, { message: 'Incorrect password.' });
13 | }
14 | return done(null, user);
15 | });
16 | }
17 | ));
18 |
--------------------------------------------------------------------------------
/ch1/9.java:
--------------------------------------------------------------------------------
1 | import java.util.ArrayList;
2 | import java.util.List;
3 |
4 | interface Subject {
5 | public void register(Observer obj);
6 | public void unregister(Observer obj);
7 | public void notifyObservers();
8 | public Object getUpdate(Observer obj);
9 | }
10 |
11 | interface Observer {
12 | public void update();
13 | }
14 |
15 | class Topic implements Subject {
16 | private List observers;
17 | private String message;
18 |
19 | public Topic() {
20 | this.observers = new ArrayList<>();
21 | this.message = "";
22 | }
23 |
24 | @Override
25 | public void register(Observer obj) {
26 | if (!observers.contains(obj)) observers.add(obj);
27 | }
28 |
29 | @Override
30 | public void unregister(Observer obj) {
31 | observers.remove(obj);
32 | }
33 |
34 | @Override
35 | public void notifyObservers() {
36 | this.observers.forEach(Observer::update);
37 | }
38 |
39 | @Override
40 | public Object getUpdate(Observer obj) {
41 | return this.message;
42 | }
43 |
44 | public void postMessage(String msg) {
45 | System.out.println("Message sended to Topic: " + msg);
46 | this.message = msg;
47 | notifyObservers();
48 | }
49 | }
50 |
51 | class TopicSubscriber implements Observer {
52 | private String name;
53 | private Subject topic;
54 |
55 | public TopicSubscriber(String name, Subject topic) {
56 | this.name = name;
57 | this.topic = topic;
58 | }
59 |
60 | @Override
61 | public void update() {
62 | String msg = (String) topic.getUpdate(this);
63 | System.out.println(name + ":: got message >> " + msg);
64 | }
65 | }
66 |
67 | public class HelloWorld {
68 | public static void main(String[] args) {
69 | Topic topic = new Topic();
70 | Observer a = new TopicSubscriber("a", topic);
71 | Observer b = new TopicSubscriber("b", topic);
72 | Observer c = new TopicSubscriber("c", topic);
73 | topic.register(a);
74 | topic.register(b);
75 | topic.register(c);
76 |
77 | topic.postMessage("amumu is op champion!!");
78 | }
79 | }
80 | /*
81 | Message sended to Topic: amumu is op champion!!
82 | a:: got message >> amumu is op champion!!
83 | b:: got message >> amumu is op champion!!
84 | c:: got message >> amumu is op champion!!
85 | */
86 |
--------------------------------------------------------------------------------
/ch1/context.js:
--------------------------------------------------------------------------------
1 | // Context lets us pass a value deep into the component tree
2 | // without explicitly threading it through every component.
3 | // Create a context for the current theme (with "light" as the default).
4 | const ThemeContext = React.createContext('light');
5 |
6 | class App extends React.Component {
7 | render() {
8 | // Use a Provider to pass the current theme to the tree below.
9 | // Any component can read it, no matter how deep it is.
10 | // In this example, we're passing "dark" as the current value.
11 | return (
12 |
13 |
14 |
15 | );
16 | }
17 | }
18 |
19 | // A component in the middle doesn't have to
20 | // pass the theme down explicitly anymore.
21 | function Toolbar() {
22 | return (
23 |