ํฐ์คํ ๋ฆฌ ๋ทฐ
ํ๊ณ
https://programmers.co.kr/competitions/2165/2022-web-fe-first
2022.03.12 Dev-Matching ํ ์คํธ๋ฅผ ๋ณด์๋ค.์ฐ๋ คํ๋ ๊ฒ๋ณด๋จ ํ ์คํธ์ ๋์ด๋๊ฐ ํฌ๊ฒ ์ด๋ ต์ง ์์์ง๋ง ํ๋์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ต์ํด ์๋ ๋์๊ฒ, ์ค๋๋ง์ Vanilla JS๋ง์ผ๋ก ์ดํ๋ฆฌ์ผ์ด์ ๊ตฌํํ๋ ๊ณผ์ ์ด ์กฐ๊ธ ๋ฏ์ค์๋ค.
ํ ์คํธ๊ฐ ๋๋ ๋ค, ์ด๋ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งน๋ชฉ๋์ง ์๊ณ ๊ธฐ๋ฐ์ด ๋๋ JS๋ฅผ ๋์ ์์ด ํ์ตํด์ผ ๊ฒ ๋ค๋ ์์ง๋ฅผ ๋์๊ฒผ๋ค. ์ด์ ํ ์คํธ ๋์ค ์ค์ํ๊ฑฐ๋ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ์ ๊ฐ๋ตํ๊ฒ ํฌ์คํ ํ๊ณ ์ ํ๋ค.
HTMLCollection์ Array๊ฐ ์๋๋ค
ul ํ๊ทธ ๋ด์ ๊ฐ li ํ๊ทธ๋ค์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ๋ฐ์ธ๋ฉํด์ฃผ๊ธฐ ์ํด, querySelectorAll() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ li ํ๊ทธ์ ๋ ธ๋ ์ ๋ณด๋ค์ ํ๋์ ๊ฐ์ฒด์ ์ ์ฅํ์๋ค.
ํด๋น ๊ฐ์ฒด๋ฅผ ์ํํด์ฃผ๊ธฐ ์ํด for() ๋ฌธ์ ์ฌ์ฉํ์์ง๋ง ์๋ํ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์๋ค.์ฒ์์๋ ๋ก์ง ์์ ๋ฌธ์ ์ธ ์ค ์๊ณ ์ฝ๋๋ฅผ ๊ณ์ ์ดํด๋ณด๋ฉฐ ๊ฐ๋จํ ์์๋ก ํ ์คํธ๊น์ง ํด ๋ณด์์ง๋ง ๋ง์ฐฌ๊ฐ์ง๋ก ์๋ํ ๊ฒฐ๊ณผ๋ ๋์ค์ง ์์๋ค. ์ด์ฝ๊ณ querySelectorAll() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ ธ ์จ ๋ ธ๋ ๊ฐ์ฒด๋ HTMLCollection ์์ ๊ธฐ์ตํด ๋๋ค.
DOM ์ปฌ๋ ์ ๊ฐ์ฒด์ธ HTMLCollection์ DOM API๊ฐ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ๊ธฐ ์ํ DOM ์ปฌ๋ ์ ๊ฐ์ฒด์ด๋ค. HTMLCollection์ ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด์ด๋ฉฐ ์ดํฐ๋ฌ๋ธ์ด๋ค.
์ฆ, HTMLCollection ๊ทธ ์์ฒด๋ง์ผ๋ก ๋ฐฐ์ด์ ํ๋กํผํฐ ๋ฐ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.for() ๋ฌธ์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ฒ์๋ฅผ ์ง์ ํด์ฃผ๊ธฐ ์ํด (array).length์ ์ ์ธํด ์ค๋ค.
length๋ Array.prototype์์ ์ ๊ณตํ๋ ํ๋กํผํฐ ๊ฐ์ด๊ธฐ ๋๋ฌธ์, ๋จ์ HTMLCollection ๊ฐ์ฒด๋ง์ผ๋ก Array์ prototype์ ์์ (ํ๋กํ ํ์ ์ฒด์ด๋)๋ฐ์์ ์ฐ์ง ๋ชปํ๋ ๊ฒ์ด๋ค.
์ด์ ํด๋น HTMLCollection ๊ฐ์ฒด๋ฅผ Array.from() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด ํ์ ์ผ๋ก ๋ณํํ์ฌ for()๋ฌธ์ผ๋ก ์ํํ ์ ์์๋ค.
fetch ํจ์์ ์๋ต ๊ฐ์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์๋ค
ํ์ axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํตํด HTTP Requests๋ฅผ ์ตํ ์ฌ์ฉํ์๋ค.ํ์ง๋ง ํด๋น ํ ์คํธ์์ axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ์ ์์๊ณ ๋ด์ฅ Web API์ธ fetch ํจ์๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฒ์์ ๋ณ ์๊ฐ ์์ด axios๋ฅผ ์ธ ๋์ ๋ง์ฐฌ๊ฐ์ง๋ก async/await ๋น๋๊ธฐ ํจ์๋ด์์ API ํธ์ถ์ ํ๊ณ ํด๋น ๋ฐํ ๊ฐ์ ์ด์ฉํ์ฌ ์ด๋ ํ ์ฐ์ฐ์ ์ํํ์์ง๋ง ์ง์์ ์ธ ์ค๋ฅ๊ฐ ๋ฐ์ํ์๋ค.
์ด์ ๊ฒฐ๊ณผ ๊ฐ์ ์ฝ์๋ก ํ์ธํด ๋ณด๋, ํ๋์ ๊ธฐ์ ์ ์ฝ๋งค์ธ ๋์ ์ค์์์ ๋ฐ๋ก ํ์ธํ ์ ์์๋ค.
fetch ํจ์๋ HTTP ์๋ต์ ๋ํ๋ด๋ Response ๊ฐ์ฒด๋ฅผ ๋ํํ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. fetch ํจ์๊ฐ ๋ฐํํ ํ๋ก๋ฏธ์ค๊ฐ ๋ํํ๊ณ ์๋ MIME ํ์ ์ด application/json์ธ HTTP ์๋ต ๋ชธ์ฒด๋ฅผ ์ทจ๋ํ๋ ค๋ฉด Response.prototype.json ๋ฉ์๋๋ฅผ ์ฌ์ฉํด์ผ ํ๋ค.
์ฆ, fetch ํจ์๊ฐ ๋ฐํํ ๊ฒฐ๊ณผ๊ฐ์ ์ฐ๋ฆฌ๊ฐ ์ค์ ์ฝ๋ ์์์ ์ธ body๊ฐ์ด ์๋ Response ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ์ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
์ด์ Response ๊ฐ์ฒด์์ HTTP ์๋ต ๋ชธ์ฒด(response.body)๋ฅผ ์ทจ๋ํ์ฌ ์ญ์ง๋ ฌํํ ๋ฐํ๊ฐ์ ์ป๊ธฐ ์ํดResponse.prototype.json ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์๊ณ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์๋ค.
๋๊ณ ๋์ protoype...
์ด์ ํ๋ก์ ํธ ๋์ค ๋๋ฃ ๊ฐ๋ฐ์์๊ฒ ์ด๋ฐ ์ง๋ฌธ์ ๋ฐ์ ์ ์ด ์๋ค.
"๋ณํ๋, MDN์ ์๋ ํ๋กํ ํ์ ์ด ๋ญ๊ฐ์?"
์ด์ ๋ํด
"์์์ด์!"
๋ผ๊ณ ๊ฐ๋จํ๊ฒ ์๊ธฐํ๊ณ ๋์ด๊ฐ๋ ์ ์ด ์์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ES6 ์ดํ๋ถํฐ ํด๋์ค๋ฅผ ์ง์ํ์ง๋ง ๊ธฐ๋ณธ์ ์ผ๋ก ํ๋กํ ํ์ ์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ฒด์งํฅ์ ํ๋ก๊ทธ๋๋ฐ์ ํต์ฌ์ธ ์์์ ๊ตฌํํ์ฌ ๋ถํ์ํ ์ค๋ณต(๊ธฐ์กด์ ์ฝ๋๋ฅผ ์ ๊ทน์ ์ผ๋ก ์ฌ์ฌ์ฉ)์ ์ ๊ฑฐํ๋ค.
์ด๋ฒ ํ ์คํธ์์ ํท๊ฐ๋ ธ๋ ๋ถ๋ถ์ ๋ชจ๋ prototype ๊ฐ๋ ๊ณผ ์ง๊ฐ์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์๋ค.
์ด์ ๋ค์ ํ๋ฒ ๊ฐ๋ ์๋ฅผ ๋ดค๋ ์ด๋ฐ์ ๋ง์ ๊ฐ์ง์ผ๋ก ๋์๊ฐ prototype ๊ฐ๋ ์ ๊ดํด ๊ฐ๋ตํ๊ฒ ํฌ์คํ ํด๋ณด๊ณ ์ ํ๋ค.
์๋ฅผ ๋ค์ด Circle๊ณผ ๊ด๋ จ๋ ์์ฑ์ ํจ์๊ฐ ์๋ค๊ณ ๊ฐ์ ํด ๋ณด์.
function Circle(radius) {
this.radius = radius;
this.getArea = function() {
return Math.PI * this.radius ** 2;
}
}
const circle1 = new Circle(1);
const circle2 = new Circle(2);
Circle ์์ฑ์ ํจ์๊ฐ ์์ฑํ๋ ๋ชจ๋ ๊ฐ์ฒด(์ธ์คํด์ค)๋ radius ํ๋กํผํฐ์ getArea ๋ฉ์๋๋ฅผ ๊ฐ๋๋ค.
ํ์ง๋ง ์ ์ฝ๋์์์ circle1๊ณผ circle2 ์ธ์คํด์ค๊ฐ ๊ฐ๋ฆฌํค๋ getArea ๋ฉ์๋๋ ์ฐธ์กฐ(์ฃผ์)๊ฐ์ด ๋ค๋ฅธ ํจ์ ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ์ค๋ณต ์์ ํ๊ณ ์๋ ํํ์ด๋ค.
ํ์ง๋ง getArea ๋ฉ์๋๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋์ผํ ๋ด์ฉ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ๋จ ํ๋๋ง ์์ฑํ์ฌ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๊ณต์ ํด์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ค. ๋์ผํ ์์ฑ์ ํจ์์ ์ํด ์์ฑ๋ ๋ชจ๋ ์ธ์คํด์ค๊ฐ ๋์ผํ ๋ฉ์๋๋ฅผ ์ค๋ณต ์์ ํ๋ ๊ฒ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ถํ์ํ๊ฒ ๋ญ๋นํ๋ค.
์์ ๊ฐ์ ํผํฌ๋จผ์ค์ ์ ์ํฅ ๋ฏธ์น๋ ์ฌํญ์ ์ ๊ฑฐํ๊ธฐ ์ํด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ ์ ์๋ค.
function Circle(radius) {
this.radius = radius;
}
Circle.prototype.getArea = function() {
return Math.PI * this.radius ** 2;
}
const circle1 = new Circle(1);
const circle2 = new Circle(2);
Circle ์์ฑ์ ํจ์๊ฐ ์์ฑํ ๋ชจ๋ ์ธ์คํด์ค๋ ์์ ์ ํ๋กํ ํ์ , ์ฆ ์์(๋ถ๋ชจ) ๊ฐ์ฒด ์ญํ ์ ํ๋ Circle.prototpe์ ๋ชจ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ฅผ ์์๋ฐ๋๋ค.
getArea ๋ฉ์๋๋ ๋จ ํ๋๋ง ์์ฑ๋์ด ํ๋กํ ํ์ ์ธ Circle.prototype์ ๋ฉ์๋๋ก ํ ๋น๋์ด ์์ด, ์์ ์ ์ํ๋ฅผ ๋ํ๋ด๋ radius ํ๋กํผํฐ๋ง ๊ฐ๋ณ์ ์ผ๋ก ์์ ํ๊ณ ๋ด์ฉ์ด ๋์ผํ ๋ฉ์๋๋ ์์์ ํตํด ๊ณต์ ํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
๋ฐฐ์ด ๊ฐ์ฒด ๋ด์ ํ๋กํผํฐ length๋ฅผ HTMLCollection ๊ฐ์ฒด์์ ์ ๊ทผํ๋ ค๊ณ ํ ๋, ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ ์์ธ์ด ๋ฐ๋ก ์ฌ๊ธฐ์ ์๋ ๊ฒ์ด๋ค.
length ํ๋กํผํฐ๋ Array ์์ฑ์ ํจ์์ ์กด์ฌํ๋ ๊ฒ์ด ์๋๋ผ ์์ฒด [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ๋ฐ์ธ๋ฉ๋์ด ์๋ Array.prototype์ ์ ์ฌ๋์ด ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ด ๊ฐ์ฒด์์ length ํ๋กํผํฐ์ ์ ๊ทผํ ๊ฒฝ์ฐ, (ํด๋น ๊ฐ์ฒด์ ์ ๊ทผํ๋ ค๋ ํ๋กํผํฐ๊ฐ ์๋ค๋ฉด) [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ์ฐธ์กฐ๋ฅผ ๋ฐ๋ผ ์์ ์ ๋ถ๋ชจ ์ญํ ์ ํ๋ ํ๋กํ ํ์ ์ ํ๋กํผํฐ๋ฅผ ์์ฐจ์ ์ผ๋ก ๊ฒ์ํ๋ ํ๋กํ ํ์ ์ฒด์ธ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
HTMLCollection ์ ์ฌ ๋ฐฐ์ด ๊ฐ์ฒด๋ Array ์์ฑ์ ํจ์์ ์ํด ์๊ธด ์ธ์คํด์ค๊ฐ ์๋๊ธฐ ๋๋ฌธ์ [[Prototype]] ๋ด๋ถ ์ฌ๋กฏ์ ์ฐธ์กฐ๋ฅผ ๋ฐ๋ผ ๊ฐ๋๋ผ๋ Array.protoype ๋ด length ํ๋กํผํฐ๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒ์ด๋ค.
๋ง์น๋ฉฐ
์ด๋ฒ ํฌ์คํ ์์ ๊ฒฐ๊ตญ ํ๋กํ ํ์ ์ ๋ํด์ ๋ง์ ์ค๋ช ์ ํ๊ฒ ๋์๋ค.
ํ๋กํ ํ์ ์ด ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ง์ ์ ์ผ๋ก ์ฌ์ฉ๋๋ ์ผ์ ์์ง๊น์ง ์์๋ค. ํ์ง๋ง ๊ฒฐ๊ตญ ์ฐ๋ฆฌ๋ค์ด ์ตํ ์ฌ์ฉํ๋ ํ๋กํผํฐ์ ๋ฉ์๋๋ค์ด ํ๋กํ ํ์ ์ ๊ธฐ๋ฐํ๊ณ ์์ผ๋ฉฐ ํด๋น ๊ฐ๋ ์ ๋ํด์ ์ ํํ๊ฒ ์ธ์งํ์ง ๋ชปํ๊ณ ์๋ค๋ฉด ์ด๋ฒ ํ ์คํธ์์์ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ธ ์ค์๋ฅผ ํ๋ ์ผ์ด ๋ง์ ๊ฒ์ด๋ค.
์ด๋ฌํ ๊ธฐ์ด์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ๋์ ๋ฐฉ์์ ํญ์ ์์งํ๊ณ ์ด๋ฅผ ํตํด ์ฌ์ํ ์ค์๋ค์ ์ค์ฌ๋๊ฐ๋ ๊ฒ์ด ์ ์ ๊ฐ๋ฐ์์๊ฒ ์์ด์ ์ค์ํ ์์์ด ์๋์ง ๋ค์ ํ๋ฒ ๊นจ๋ฌ์ ์ ์์๋ ์ข์ ๊ฒฝํ์ด์๋ค.
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฌ์ฌํด์ ๋ง๋ค์ด ๋ณธ Toggle Switch๐ (0) | 2022.04.16 |
---|---|
๊ทธ๋ํ ๋ฌธ์ ๋ฅผ ํ๋ค๊ฐ ์ด์ด ์์๋ ์ค์_๋ฐฐ์ด ๊ฐ์ฒด์ ๋ํ ๊ณ ์ฐฐ (0) | 2022.04.02 |
์ฟผ๋ฆฌ ๋ฌธ์์ด ์ธ์ฝ๋ฉํ๊ธฐ(ํ๊ธ ์ฃผ์ ๊นจ์ง ํ์)_encodeURI (0) | 2021.12.24 |
์ซ์๋ฅผ ์ํ ๋ฌธ์์ด๋ก ์์ _Array.prototype.toLocaleString (0) | 2021.12.24 |
๋(null) ๋ณํฉ ์ฐ์ฐ์๋ก ๋ฆฌํฉํ ๋ง (0) | 2021.10.10 |