Alert
์ด ๊ธ์ Claude Code์ ๋์์ ๋ฐ์ ์์ฑ๋์์ต๋๋ค
์์๋ณผ ๋ด์ฉ
- ์น ํ์ด์ง์ 3์์ โ HTML, CSS, JavaScript
- HTML โ ๊ตฌ์กฐ์ ์ฝํ ์ธ
- CSS โ ์คํ์ผ๊ณผ ๋ ์ด์์
- JavaScript โ ๋์๊ณผ ๋ก์ง
- ์ ์ด ์ด๋ป๊ฒ ํฉ์ณ์ง๋๊ฐ
- TypeScript
- ํ๋ก ํธ์๋ ํ๋ ์์ํฌ โ React, Vue, Next.js
์น ํ์ด์ง์ 3์์
- ์น ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ๋ ์ธ์ด๋ ๋ฑ ์ธ ๊ฐ์ง : HTML, CSS, JavaScript
- ์ด๋ค ํ๋ ์์ํฌ(React, Vue, Next.js)๋ฅผ ์ฐ๋ ์ต์ข ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ๋๋ ๊ฒ์ ์ด ์ธ ๊ฐ์ง
HTML = ๋ผ๋ (๊ตฌ์กฐ) โ "์ด ํ์ด์ง์ ์ ๋ชฉ, ๋ฌธ๋จ, ๋ฒํผ, ์ด๋ฏธ์ง๊ฐ ์๋ค"
CSS = ์ท (์คํ์ผ) โ "์ ๋ชฉ์ ๋นจ๊ฐ์, ๋ฒํผ์ ๋ฅ๊ธ๊ฒ, ์ฌ๋ฐฑ์ ์ด๋งํผ"
JS = ๊ทผ์ก (๋์) โ "๋ฒํผ ํด๋ฆญํ๋ฉด ํ์
๋์, ๋ฐ์ดํฐ ๋ถ๋ฌ์์ ํ์ํด"| ์ญํ | HTML | CSS | JavaScript |
|---|---|---|---|
| ํ๋ ์ผ | ์ฝํ ์ธ ๊ตฌ์กฐ ์ ์ | ์๊ฐ์ ์คํ์ผ ์ง์ | ๋์ ๋์/๋ก์ง ์ฒ๋ฆฌ |
| ํ์ผ ํ์ฅ์ | .html | .css | .js |
| ์์ผ๋ฉด? | ํ์ด์ง ์์ฒด๊ฐ ์์ | ๋ชป์๊ธด ํ์ด์ง (๊ธฐ๋ฅ์ ๋์) | ์ ์ ํ์ด์ง (์ํธ์์ฉ ๋ถ๊ฐ) |
HTML (HyperText Markup Language) โ ๊ตฌ์กฐ์ ์ฝํ ์ธ
๊ฐ๋
- ์น ํ์ด์ง์ ๊ตฌ์กฐ์ ๋ด์ฉ์ ์ ์ํ๋ ๋งํฌ์ ์ธ์ด
- ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๊ฐ ์๋ โ ๋ก์ง์ด๋ ๋ฐ๋ณต๋ฌธ ์์ด โ์ด ํ์ด์ง์ ๋ญ๊ฐ ์๋์งโ๋ง ์์
- ํ๊ทธ(Tag) ๋ก ๊ตฌ์ฑ๋๋ฉฐ, ํ๊ทธ๊ฐ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ธ๋ ํํ
๊ธฐ๋ณธ ๊ตฌ์กฐ
<!DOCTYPE html> <!-- ์ด ๋ฌธ์๊ฐ HTML5 ์์ ์ ์ธ -->
<html lang="ko"> <!-- HTML ๋ฌธ์์ ์์, ์ธ์ด ์ง์ -->
<head> <!-- ๋ฉํ๋ฐ์ดํฐ ์์ญ (๋ธ๋ผ์ฐ์ ์ ๋ณด์ด์ง ์์) -->
<meta charset="UTF-8"> <!-- ๋ฌธ์ ์ธ์ฝ๋ฉ -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>๋ด ํ์ด์ง</title> <!-- ๋ธ๋ผ์ฐ์ ํญ์ ํ์๋๋ ์ ๋ชฉ -->
<link rel="stylesheet" href="style.css"> <!-- CSS ํ์ผ ์ฐ๊ฒฐ -->
</head>
<body> <!-- ์ค์ ํ๋ฉด์ ํ์๋๋ ์ฝํ
์ธ ์์ญ -->
<h1>์๋
ํ์ธ์</h1> <!-- ์ ๋ชฉ -->
<p>์ด๊ฒ์ ๋ฌธ๋จ์
๋๋ค.</p> <!-- ๋ฌธ๋จ -->
<button>ํด๋ฆญ</button> <!-- ๋ฒํผ -->
<script src="app.js"></script> <!-- JavaScript ํ์ผ ์ฐ๊ฒฐ -->
</body>
</html>์ฃผ์ ํ๊ทธ ์ ๋ฆฌ
๋ฌธ์ ๊ตฌ์กฐ ํ๊ทธ
| ํ๊ทธ | ์ญํ | ์ค๋ช |
|---|---|---|
<html> | ์ต์์ ์ปจํ ์ด๋ | HTML ๋ฌธ์ ์ ์ฒด๋ฅผ ๊ฐ์ |
<head> | ๋ฉํ๋ฐ์ดํฐ | ์ ๋ชฉ, CSS ์ฐ๊ฒฐ, ์ธ์ฝ๋ฉ ๋ฑ ๋ธ๋ผ์ฐ์ ์ ์ ๋ณด์ด๋ ์ ๋ณด |
<body> | ๋ณธ๋ฌธ ์ฝํ ์ธ | ์ค์ ํ๋ฉด์ ํ์๋๋ ๋ชจ๋ ๊ฒ |
์ฝํ ์ธ ํ๊ทธ
| ํ๊ทธ | ์ญํ | ์์ |
|---|---|---|
<h1> ~ <h6> | ์ ๋ชฉ (ํฌ๊ธฐ์) | <h1>๋์ ๋ชฉ</h1> <h3>์์ ๋ชฉ</h3> |
<p> | ๋ฌธ๋จ | <p>๋ณธ๋ฌธ ํ
์คํธ</p> |
<a> | ๋งํฌ (anchor) | <a href="https://...">ํด๋ฆญ</a> |
<img> | ์ด๋ฏธ์ง | <img src="photo.jpg" alt="์ค๋ช
"> |
<ul>, <ol>, <li> | ๋ชฉ๋ก | <ul><li>ํญ๋ชฉ1</li><li>ํญ๋ชฉ2</li></ul> |
<div> | ๋ฒ์ฉ ๋ธ๋ก ์ปจํ ์ด๋ | ๋ ์ด์์์ ์ก์ ๋ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ |
<span> | ๋ฒ์ฉ ์ธ๋ผ์ธ ์ปจํ ์ด๋ | ํ ์คํธ ์ผ๋ถ์ ์คํ์ผ์ ์ ์ฉํ ๋ |
ํผ(์ ๋ ฅ) ํ๊ทธ
| ํ๊ทธ | ์ญํ | ์์ |
|---|---|---|
<form> | ์ ๋ ฅ ํผ ์ปจํ ์ด๋ | <form action="/submit" method="POST"> |
<input> | ์ ๋ ฅ ํ๋ | <input type="text" placeholder="์ด๋ฆ"> |
<button> | ๋ฒํผ | <button type="submit">์ ์ก</button> |
<select> | ๋๋กญ๋ค์ด | <select><option>์ต์
1</option></select> |
<textarea> | ์ฌ๋ฌ ์ค ์ ๋ ฅ | <textarea rows="5"></textarea> |
์๋งจํฑ ํ๊ทธ (์๋ฏธ๋ฅผ ๊ฐ์ง ํ๊ทธ)
<div>๋ก ๋ค ํ ์ ์์ง๋ง, ์๋ฏธ๋ฅผ ๋ช ํํ ํ๊ธฐ ์ํด ์ฌ์ฉ- ๊ฒ์ ์์ง ์ต์ ํ(SEO)์ ์ ๊ทผ์ฑ(Accessibility)์ ์ ๋ฆฌ
| ํ๊ทธ | ์๋ฏธ | <div> ๋์ ์ฐ๋ ์ด์ |
|---|---|---|
<header> | ํ์ด์ง/์น์ ์๋จ | ๋ก๊ณ , ๋ค๋น๊ฒ์ด์ ์์ญ |
<nav> | ๋ค๋น๊ฒ์ด์ | ๋ฉ๋ด, ๋งํฌ ๋ชจ์ |
<main> | ๋ฉ์ธ ์ฝํ ์ธ | ํ์ด์ง์ ํต์ฌ ๋ด์ฉ |
<article> | ๋ ๋ฆฝ์ ์ธ ์ฝํ ์ธ | ๋ธ๋ก๊ทธ ๊ธ, ๋ด์ค ๊ธฐ์ฌ |
<section> | ์ฃผ์ ๋ณ ๊ตฌํ | ๊ด๋ จ ์ฝํ ์ธ ๊ทธ๋ฃน |
<footer> | ํ๋จ ์ ๋ณด | ์ ์๊ถ, ์ฐ๋ฝ์ฒ |
<aside> | ๋ถ๊ฐ ์ ๋ณด | ์ฌ์ด๋๋ฐ, ๊ด๋ จ ๋งํฌ |
<body>
<header>
<nav>
<a href="/">ํ</a>
<a href="/about">์๊ฐ</a>
</nav>
</header>
<main>
<article>
<h1>๊ธ ์ ๋ชฉ</h1>
<p>๊ธ ๋ด์ฉ...</p>
</article>
<aside>
<h3>๊ด๋ จ ๊ธ</h3>
<ul><li><a href="/other">๋ค๋ฅธ ๊ธ</a></li></ul>
</aside>
</main>
<footer>
<p>ยฉ 2026 My Blog</p>
</footer>
</body>ํ๊ทธ์ ์์ฑ (Attributes)
- ํ๊ทธ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ๋ถ์ฌํ๋
์ด๋ฆ="๊ฐ"์
<!-- id : ํ์ด์ง ๋ด์์ ๊ณ ์ ํ ์๋ณ์ (ํ๋๋ง ์กด์ฌ) -->
<div id="main-content">...</div>
<!-- class : ์ฌ๋ฌ ์์์ ๋์ผ ์คํ์ผ์ ์ ์ฉํ ๋ (์ฌ๋ฌ ๊ฐ ๊ฐ๋ฅ) -->
<p class="highlight bold">๊ฐ์กฐ ํ
์คํธ</p>
<!-- href : ๋งํฌ ๋์ URL -->
<a href="https://google.com" target="_blank">์ ํญ์์ ์ด๊ธฐ</a>
<!-- src : ์ธ๋ถ ๋ฆฌ์์ค ๊ฒฝ๋ก (์ด๋ฏธ์ง, ์คํฌ๋ฆฝํธ ๋ฑ) -->
<img src="photo.jpg" alt="์ฌ์ง ์ค๋ช
">
<script src="app.js"></script>
<!-- style : ์ธ๋ผ์ธ CSS (๊ฐ๊ธ์ ๋น์ถ์ฒ, CSS ํ์ผ ์ฌ์ฉ ๊ถ์ฅ) -->
<p style="color: red;">๋นจ๊ฐ ๊ธ์จ</p>CSS (Cascading Style Sheets) โ ์คํ์ผ๊ณผ ๋ ์ด์์
๊ฐ๋
- HTML ์์์ ์๊ฐ์ ํํ์ ์ ์ํ๋ ์คํ์ผ ์ธ์ด
- ์์, ํฌ๊ธฐ, ์ฌ๋ฐฑ, ์์น, ์ ๋๋ฉ์ด์ ๋ฑ ํ๋ฉด์ ๋ณด์ด๋ ๋ชจ๋ ๊ฒ์ ์ ์ด
- โCascadingโ : ์ฌ๋ฌ ์คํ์ผ ๊ท์น์ด ๊ฒน์น ๋ ์ฐ์ ์์์ ๋ฐ๋ผ ๋จ๊ณ์ ์ผ๋ก ์ ์ฉ๋๋ค๋ ์๋ฏธ
CSS ์ ์ฉ ๋ฐฉ๋ฒ 3๊ฐ์ง
<!-- 1. ์ธ๋ถ ํ์ผ (๊ฐ์ฅ ๊ถ์ฅ) -->
<head>
<link rel="stylesheet" href="style.css">
</head>
<!-- 2. <style> ํ๊ทธ (ํด๋น ํ์ด์ง์๋ง ์ ์ฉ) -->
<head>
<style>
h1 { color: blue; }
</style>
</head>
<!-- 3. ์ธ๋ผ์ธ ์คํ์ผ (๋น์ถ์ฒ โ ์ ์ง๋ณด์ ์ด๋ ค์) -->
<p style="color: red; font-size: 16px;">๋นจ๊ฐ ๊ธ์จ</p>CSS ๊ธฐ๋ณธ ๋ฌธ๋ฒ
/* ์ ํ์ { ์์ฑ: ๊ฐ; } */
h1 {
color: #333; /* ๊ธ์์ */
font-size: 24px; /* ๊ธ์ ํฌ๊ธฐ */
font-weight: bold; /* ๊ธ์ ๊ตต๊ธฐ */
margin-bottom: 16px; /* ์๋ ๋ฐ๊นฅ ์ฌ๋ฐฑ */
}
.card { /* ํด๋์ค ์ ํ์ (.์ผ๋ก ์์) */
background-color: #f5f5f5;
border: 1px solid #ddd;
border-radius: 8px; /* ๋ชจ์๋ฆฌ ๋ฅ๊ธ๊ฒ */
padding: 20px; /* ์์ชฝ ์ฌ๋ฐฑ */
}
#header { /* ID ์ ํ์ (#์ผ๋ก ์์) */
position: fixed; /* ์คํฌ๋กคํด๋ ๊ณ ์ */
top: 0;
width: 100%;
}์ ํ์ (Selector) ์ ๋ฆฌ
| ์ ํ์ | ๋ฌธ๋ฒ | ๋์ | ์์ |
|---|---|---|---|
| ํ๊ทธ | ํ๊ทธ๋ช
| ํด๋น ํ๊ทธ ์ ์ฒด | p { color: gray; } |
| ํด๋์ค | .ํด๋์ค๋ช
| class ์์ฑ์ด ์ผ์นํ๋ ์์ | .card { padding: 20px; } |
| ID | #์์ด๋๋ช
| id ์์ฑ์ด ์ผ์นํ๋ ์์ (1๊ฐ) | #header { height: 60px; } |
| ์์ | A B | A ์์ ์๋ ๋ชจ๋ B | .card p { font-size: 14px; } |
| ์ง์ ์์ | A > B | A ๋ฐ๋ก ์๋์ B | .nav > li { display: inline; } |
| ์ฌ๋ฌ ์ ํ | A, B | A์ B ๋ชจ๋ | h1, h2 { color: blue; } |
์์ฃผ ์ฐ๋ CSS ์์ฑ
ํ ์คํธ ๊ด๋ จ
| ์์ฑ | ์ค๋ช | ์์ |
|---|---|---|
color | ๊ธ์์ | color: #333; |
font-size | ๊ธ์ ํฌ๊ธฐ | font-size: 16px; |
font-weight | ๊ตต๊ธฐ | font-weight: bold; |
text-align | ์ ๋ ฌ | text-align: center; |
line-height | ์ค ๊ฐ๊ฒฉ | line-height: 1.6; |
๋ฐ์ค ๋ชจ๋ธ (Box Model) โ CSS์์ ๊ฐ์ฅ ์ค์ํ ๊ฐ๋
- ๋ชจ๋ HTML ์์๋ 4๊ฒน์ ์์๋ก ๊ตฌ์ฑ๋จ (๋ฐ๊นฅ โ ์์ชฝ ์์)
| ์ธต (๋ฐ๊นฅ โ ์์ชฝ) | ์์ฑ | ์ญํ |
|---|---|---|
| 1. margin | margin: 16px; | ๋ฐ๊นฅ ์ฌ๋ฐฑ โ ๋ค๋ฅธ ์์์์ ๊ฑฐ๋ฆฌ |
| 2. border | border: 1px solid #ccc; | ํ ๋๋ฆฌ โ ๋์ ๋ณด์ด๋ ๊ฒฝ๊ณ์ |
| 3. padding | padding: 20px; | ์์ชฝ ์ฌ๋ฐฑ โ ํ ๋๋ฆฌ์ ์ฝํ ์ธ ์ฌ์ด ๊ณต๊ฐ |
| 4. content | width: 300px; height: 200px; | ์ค์ ์ฝํ ์ธ ๊ฐ ๋ค์ด๊ฐ๋ ์์ญ |
.box {
width: 300px; /* ์ฝํ
์ธ ๋๋น */
height: 200px; /* ์ฝํ
์ธ ๋์ด */
padding: 20px; /* ์์ชฝ ์ฌ๋ฐฑ (์ํ์ข์ฐ ๋์ผ) */
padding: 10px 20px; /* ์์ชฝ ์ฌ๋ฐฑ (์ํ 10px, ์ข์ฐ 20px) */
border: 1px solid #ccc; /* ํ
๋๋ฆฌ */
margin: 16px; /* ๋ฐ๊นฅ ์ฌ๋ฐฑ */
margin: 0 auto; /* ์ํ ๊ฐ์ด๋ฐ ์ ๋ ฌ */
}๋ ์ด์์ โ Flexbox (ํ๋ CSS์ ํต์ฌ)
/* ๊ฐ๋ก ์ ๋ ฌ */
.row {
display: flex; /* ์์ ์์๋ค์ ๊ฐ๋ก๋ก ๋ฐฐ์น */
justify-content: space-between; /* ์ข์ฐ๋ก ๊ท ๋ฑ ๋ถ๋ฐฐ */
align-items: center; /* ์ธ๋ก ๊ฐ์ด๋ฐ ์ ๋ ฌ */
gap: 16px; /* ์์ ์ฌ์ด ๊ฐ๊ฒฉ */
}
/* ์ธ๋ก ์ ๋ ฌ */
.column {
display: flex;
flex-direction: column; /* ์ธ๋ก๋ก ๋ฐฐ์น */
gap: 8px;
}
/* ์ ๊ฐ์ด๋ฐ ๋ฐฐ์น (๊ฐ๋ก + ์ธ๋ก ๋ชจ๋ ๊ฐ์ด๋ฐ) */
.center {
display: flex;
justify-content: center;
align-items: center;
height: 100vh; /* ํ๋ฉด ์ ์ฒด ๋์ด */
}๋ฐ์ํ ๋์์ธ โ ํ๋ฉด ํฌ๊ธฐ์ ๋ฐ๋ผ ์คํ์ผ ๋ณ๊ฒฝ
/* ๊ธฐ๋ณธ ์คํ์ผ (๋ชจ๋ฐ์ผ) */
.container {
width: 100%;
padding: 16px;
}
/* ํ๋ธ๋ฆฟ ์ด์ (768px~) */
@media (min-width: 768px) {
.container {
width: 720px;
margin: 0 auto;
}
}
/* ๋ฐ์คํฌํฑ ์ด์ (1024px~) */
@media (min-width: 1024px) {
.container {
width: 960px;
}
}JavaScript โ ๋์๊ณผ ๋ก์ง
๊ฐ๋
- ์น ํ์ด์ง์ ๋์ ์ธ ๋์์ ๋ถ์ฌํ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด
- HTML์ด โ๋ญ๊ฐ ์๋์งโ, CSS๊ฐ โ์ด๋ป๊ฒ ๋ณด์ด๋์งโ๋ฅผ ์ ์ํ๋ค๋ฉด JavaScript๋ โ์ด๋ป๊ฒ ๋์ํ๋์งโ ๋ฅผ ์ ์
- ์๋ ๋ธ๋ผ์ฐ์ ์ ์ฉ์ด์์ผ๋, Node.js๋ก ์๋ฒ์์๋ ์คํ ๊ฐ๋ฅํด์ง
HTML์์ JavaScript๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
<!-- 1. ์ธ๋ถ ํ์ผ ์ฐ๊ฒฐ (๊ฐ์ฅ ๊ถ์ฅ) -->
<!-- body ๋งจ ์๋์ ๋๋ ๊ฒ์ด ๊ด๋ก โ HTML์ด ๋ค ๊ทธ๋ ค์ง ํ JS ์คํ -->
<body>
<h1>์๋
ํ์ธ์</h1>
<button id="myBtn">ํด๋ฆญ</button>
<script src="app.js"></script> <!-- ์ธ๋ถ JS ํ์ผ -->
</body>
<!-- 2. <script> ํ๊ทธ ์์ ์ง์ ์์ฑ -->
<script>
console.log("Hello!");
</script>
<!-- 3. defer ์์ฑ โ head์ ๋ฃ์ด๋ HTML ํ์ฑ ํ ์คํ -->
<head>
<script src="app.js" defer></script>
</head>script ํ๊ทธ์ ์์น๊ฐ ์ค์ํ ์ด์
- ๋ธ๋ผ์ฐ์ ๋ HTML์ ์์์ ์๋๋ก ์ฝ์ผ๋ฉฐ ํ๋ฉด์ ๊ทธ๋ฆผ (ํ์ฑ)
<script>๋ฅผ ๋ง๋๋ฉด ํ์ฑ์ ๋ฉ์ถ๊ณ JS๋ฅผ ๋ค์ด๋ก๋+์คํ- ๋ฐ๋ผ์
<head>์ ๋ฃ์ผ๋ฉด JS ์คํ ์ค์ ์์ง<body>๊ฐ ์์ด์ ์์๋ฅผ ์ฐพ์ ์ ์์- ํด๊ฒฐ ๋ฐฉ๋ฒ:
<body>๋งจ ์๋์<script>๋ฐฐ์น (์ ํต์ ๋ฐฉ๋ฒ)<script defer>์ฌ์ฉ (HTML ํ์ฑ ์๋ฃ ํ ์คํ)<script async>์ฌ์ฉ (๋ค์ด๋ก๋ ์๋ฃ ์ฆ์ ์คํ, ์์ ๋ณด์ฅ ์๋จ)
JavaScript ๊ธฐ๋ณธ ๋ฌธ๋ฒ
// ๋ณ์ ์ ์ธ
const name = "ํ๊ธธ๋"; // ์์ (์ฌํ ๋น ๋ถ๊ฐ) โ ๊ธฐ๋ณธ์ ์ผ๋ก const ์ฌ์ฉ
let age = 25; // ๋ณ์ (์ฌํ ๋น ๊ฐ๋ฅ)
var old = "์ฐ์ง ๋ง์ธ์"; // ์๋ ๋ฐฉ์ (์ค์ฝํ ๋ฌธ์ ์์, ์ฌ์ฉ ๋น์ถ์ฒ)
// ์๋ฃํ
const str = "๋ฌธ์์ด"; // String
const num = 42; // Number (์ ์/์ค์ ๊ตฌ๋ถ ์์)
const bool = true; // Boolean
const arr = [1, 2, 3]; // Array (Python์ list)
const obj = { name: "ํ๊ธธ๋", age: 25 }; // Object (Python์ dict)
const nothing = null; // ์๋์ ์ผ๋ก "์์"
const notDefined = undefined; // ์์ง ๊ฐ์ด ํ ๋น๋์ง ์์// ํจ์ ์ ์ธ
function greet(name) {
return `์๋
ํ์ธ์, ${name}๋!`; // ํ
ํ๋ฆฟ ๋ฆฌํฐ๋ด (Python์ f-string)
}
// ํ์ดํ ํจ์ (Arrow Function) โ ํ๋ JS์์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ
const greet = (name) => {
return `์๋
ํ์ธ์, ${name}๋!`;
};
// ํ ์ค์ด๋ฉด ์ค๊ดํธ์ return ์๋ต ๊ฐ๋ฅ
const greet = (name) => `์๋
ํ์ธ์, ${name}๋!`;
// Python๊ณผ ๋น๊ต
// def greet(name):
// return f"์๋
ํ์ธ์, {name}๋!"// ์กฐ๊ฑด๋ฌธ
if (age >= 20) {
console.log("์ฑ์ธ");
} else if (age >= 13) {
console.log("์ฒญ์๋
");
} else {
console.log("์ด๋ฆฐ์ด");
}
// ์ผํญ ์ฐ์ฐ์ (Python๊ณผ ๋์ผํ ๊ฐ๋
)
const status = age >= 20 ? "์ฑ์ธ" : "๋ฏธ์ฑ๋
";
// Python: status = "์ฑ์ธ" if age >= 20 else "๋ฏธ์ฑ๋
"
// ๋ฐ๋ณต๋ฌธ
for (let i = 0; i < 5; i++) {
console.log(i);
}
// ๋ฐฐ์ด ์ํ (Python์ for item in list)
const fruits = ["์ฌ๊ณผ", "๋ฐ๋๋", "ํฌ๋"];
for (const fruit of fruits) {
console.log(fruit);
}
// ๋ฐฐ์ด ๋ฉ์๋ (Python์ ๋ฆฌ์คํธ ์ปดํ๋ฆฌํจ์
๊ณผ ์ ์ฌ)
const doubled = [1, 2, 3].map(x => x * 2); // [2, 4, 6]
const evens = [1, 2, 3, 4].filter(x => x % 2 === 0); // [2, 4]DOM ์กฐ์ โ JavaScript๊ฐ HTML์ ๋์ ์ผ๋ก ์ ์ดํ๋ ๋ฐฉ๋ฒ
- DOM (Document Object Model) : ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ฝ๊ณ ๋ง๋๋ ํธ๋ฆฌ ๊ตฌ์กฐ์ ๊ฐ์ฒด ๋ชจ๋ธ
- JavaScript๋ DOM์ ํตํด HTML ์์๋ฅผ ์ฐพ๊ณ , ๋ณ๊ฒฝํ๊ณ , ์ถ๊ฐ/์ญ์ ํ ์ ์์
<h1 id="title">์๋ ์ ๋ชฉ</h1>
<button id="changeBtn">์ ๋ชฉ ๋ณ๊ฒฝ</button>
<ul id="list"></ul>
<script>
// ์์ ์ฐพ๊ธฐ
const title = document.getElementById("title");
const btn = document.getElementById("changeBtn");
const list = document.getElementById("list");
// ์ด๋ฒคํธ ๋ฆฌ์ค๋ โ ๋ฒํผ ํด๋ฆญ ์ ๋์ ์ ์
btn.addEventListener("click", () => {
// ํ
์คํธ ๋ณ๊ฒฝ
title.textContent = "๋ณ๊ฒฝ๋ ์ ๋ชฉ!";
// ์คํ์ผ ๋ณ๊ฒฝ
title.style.color = "blue";
// ์ ์์ ์ถ๊ฐ
const li = document.createElement("li");
li.textContent = "์ ํญ๋ชฉ ์ถ๊ฐ๋จ";
list.appendChild(li);
});
</script>๋น๋๊ธฐ ์ฒ๋ฆฌ โ JavaScript์ ํต์ฌ ํน์ง
- JavaScript๋ ์ฑ๊ธ ์ค๋ ๋ ์ธ์ด์ด์ง๋ง ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ก ์ฌ๋ฌ ์์ ์ ํจ์จ์ ์ผ๋ก ์ํ
- ์๋ฒ์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๊ฑฐ๋ ํ์ด๋จธ๋ฅผ ์ค์ ํ ๋ ์ฌ์ฉ
// 1. ์ฝ๋ฐฑ (์๋ ๋ฐฉ์)
setTimeout(() => {
console.log("2์ด ํ ์คํ");
}, 2000);
// 2. Promise
fetch("https://api.example.com/data")
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error(error));
// 3. async/await (ํ๋ ๋ฐฉ์, ๊ฐ์ฅ ๊ถ์ฅ)
// Python์ async/await์ ๊ฑฐ์ ๋์ผํ ๋ฌธ๋ฒ
async function fetchData() {
try {
const response = await fetch("https://api.example.com/data");
const data = await response.json();
console.log(data);
} catch (error) {
console.error(error);
}
}
// Python ๋น๊ต
// async def fetch_data():
// async with aiohttp.ClientSession() as session:
// async with session.get("https://api.example.com/data") as resp:
// data = await resp.json()
// print(data)Python vs JavaScript ๋ฌธ๋ฒ ๋น ๋ฅธ ๋น๊ต
| ๊ฐ๋ | Python | JavaScript |
|---|---|---|
| ์ถ๋ ฅ | print("hello") | console.log("hello") |
| ๋ฌธ์์ด ํฌ๋งท | f"์ด๋ฆ: {name}" | `์ด๋ฆ: ${name}` |
| ๋ฆฌ์คํธ/๋ฐฐ์ด | [1, 2, 3] | [1, 2, 3] |
| ๋์ ๋๋ฆฌ/๊ฐ์ฒด | {"key": "value"} | {key: "value"} |
| None/null | None | null / undefined |
| ํจ์ | def fn(x): | const fn = (x) => {} |
| ํด๋์ค | class Foo: | class Foo {} |
| ๋ชจ๋ ๊ฐ์ ธ์ค๊ธฐ | import os | import fs from 'fs' |
| ํ์ ํ์ธ | type(x) | typeof x |
| ๋น๋๊ธฐ | async def / await | async function / await |
HTML + CSS + JavaScript๊ฐ ํฉ์ณ์ง๋ ๊ตฌ์กฐ
์ ํ์ ์ธ ํ๋ก์ ํธ ํ์ผ ๊ตฌ์กฐ
my-website/
โโโ index.html # ๋ฉ์ธ ํ์ด์ง (๊ตฌ์กฐ)
โโโ about.html # ์๊ฐ ํ์ด์ง
โโโ css/
โ โโโ style.css # ์คํ์ผ
โโโ js/
โ โโโ app.js # ๋์/๋ก์ง
โโโ images/
โโโ logo.png # ์ด๋ฏธ์ง ๋ฆฌ์์คํ๋์ ์์ฑ๋ ์์
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>ํ ์ผ ๋ชฉ๋ก</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="container">
<h1>ํ ์ผ ๋ชฉ๋ก</h1>
<div class="input-area">
<input type="text" id="todoInput" placeholder="ํ ์ผ์ ์
๋ ฅํ์ธ์">
<button id="addBtn">์ถ๊ฐ</button>
</div>
<ul id="todoList"></ul>
</div>
<script src="js/app.js"></script>
</body>
</html>.container {
max-width: 500px;
margin: 40px auto;
padding: 20px;
font-family: sans-serif;
}
.input-area {
display: flex;
gap: 8px;
margin-bottom: 20px;
}
.input-area input {
flex: 1; /* ๋จ์ ๊ณต๊ฐ ์ ๋ถ ์ฐจ์ง */
padding: 8px 12px;
border: 1px solid #ccc;
border-radius: 4px;
}
.input-area button {
padding: 8px 16px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
#todoList li {
padding: 8px 0;
border-bottom: 1px solid #eee;
}const input = document.getElementById("todoInput");
const addBtn = document.getElementById("addBtn");
const todoList = document.getElementById("todoList");
addBtn.addEventListener("click", () => {
const text = input.value.trim();
if (text === "") return;
const li = document.createElement("li");
li.textContent = text;
todoList.appendChild(li);
input.value = ""; // ์
๋ ฅ์ฐฝ ๋น์ฐ๊ธฐ
input.focus(); // ์ปค์๋ฅผ ๋ค์ ์
๋ ฅ์ฐฝ์ผ๋ก
});
// Enter ํค๋ก๋ ์ถ๊ฐ ๊ฐ๋ฅ
input.addEventListener("keypress", (e) => {
if (e.key === "Enter") addBtn.click();
});TypeScript โ JavaScript์ ํ์ ์ ์ถ๊ฐํ ์ธ์ด
๊ฐ๋
- Microsoft๊ฐ ๊ฐ๋ฐํ JavaScript์ ์์ ์งํฉ(Superset)
- JavaScript ์ฝ๋์ ์ ์ ํ์ ์ ์ถ๊ฐํ์ฌ ์ปดํ์ผ ์์ ์ ์ค๋ฅ๋ฅผ ์ก์ ์ ์์
- Python์์ ํ์
ํํธ(
def fn(x: int) -> str)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ์ ์ฌํ์ง๋ง, TypeScript๋ ์ปดํ์ผ๋ฌ๊ฐ ๊ฐ์ ๋ก ๊ฒ์ฌ .tsํ์ผ์ ์์ฑํ๋ฉด ์ปดํ์ผ๋ฌ(tsc)๊ฐ.jsํ์ผ๋ก ๋ณํ โ ๋ธ๋ผ์ฐ์ ๋ JS๋ง ์ดํดํ๋ฏ๋ก
// TypeScript โ ํ์
์ด ์์
function greet(name: string): string {
return `์๋
ํ์ธ์, ${name}๋!`;
}
greet("ํ๊ธธ๋"); // โ
OK
greet(123); // โ ์ปดํ์ผ ์๋ฌ: number๋ string์ ํ ๋นํ ์ ์์
// ์ธํฐํ์ด์ค โ ๊ฐ์ฒด์ ๊ตฌ์กฐ๋ฅผ ์ ์
interface User {
name: string;
age: number;
email?: string; // ?๋ ์ ํ์ ํ๋ (์์ด๋ ๋จ)
}
const user: User = {
name: "ํ๊ธธ๋",
age: 25
};hello.ts โ tsc (TypeScript ์ปดํ์ผ๋ฌ) โ hello.js โ ๋ธ๋ผ์ฐ์ /Node.js ์คํ
(ํ์
๊ฒ์ฌ + ๋ณํ) (ํ์
์ ๋ณด ์ ๊ฑฐ๋ ์์ JS)ํ๋ก ํธ์๋ ํ๋ ์์ํฌ โ React, Vue, Next.js
์ ํ๋ ์์ํฌ๋ฅผ ์ฐ๋๊ฐ
- ์์ ์์ HTML + CSS + JS ๋ฐฉ์(Vanilla)์ ๊ฐ๋จํ ํ์ด์ง์๋ ์ถฉ๋ถ
- ํ์ง๋ง ๋ณต์กํ ์น ์ฑ(Gmail, Notion, Slack ๋ฑ)์ ์์ JS๋ก ๋ง๋ค๋ฉด
- DOM ์กฐ์ ์ฝ๋๊ฐ ๋งค์ฐ ๋ณต์กํด์ง
- ์ํ ๊ด๋ฆฌ(์ด๋ค ๋ฐ์ดํฐ๊ฐ ์ด๋์ ํ์๋๋์ง)๊ฐ ์ด๋ ค์
- ์ฝ๋ ์ฌ์ฌ์ฉ๊ณผ ์ ์ง๋ณด์๊ฐ ํ๋ฆ
- ํ๋ ์์ํฌ๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ํด๊ฒฐ
์ฃผ์ ํ๋ ์์ํฌ
| ํ๋ ์์ํฌ | ๊ฐ๋ฐ | ํน์ง | ๋น์ |
|---|---|---|---|
| React | Meta (Facebook) | UI ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ปดํฌ๋ํธ ๊ธฐ๋ฐ, JSX ๋ฌธ๋ฒ | ๊ฐ์ฅ ๋์ ์ํ๊ณ, ์ทจ์ ์์ฅ 1์ |
| Vue.js | Evan You (๊ฐ์ธ) | ์ฌ์ด ํ์ต ๊ณก์ , ํ ํ๋ฆฟ ๊ธฐ๋ฐ | React๋ณด๋ค ๋ฐฐ์ฐ๊ธฐ ์ฌ์ |
| Angular | ํ ํ๋ ์์ํฌ, TypeScript ๊ธฐ๋ณธ | ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ์ฉ | |
| Next.js | Vercel | React ๊ธฐ๋ฐ, ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) | React์ โํ์คํ ํ์ฅํโ |
| Nuxt.js | ์ปค๋ฎค๋ํฐ | Vue ๊ธฐ๋ฐ, SSR ์ง์ | Vue์ โํ์คํ ํ์ฅํโ |
React ๋ง๋ณด๊ธฐ โ ์ปดํฌ๋ํธ๋
// ์ปดํฌ๋ํธ = ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์กฐ๊ฐ
// HTML์ฒ๋ผ ๋ณด์ด์ง๋ง JavaScript ์์ ์์ฑ (JSX ๋ฌธ๋ฒ)
function TodoItem({ text, done }) {
return (
<li style={{ textDecoration: done ? "line-through" : "none" }}>
{text}
</li>
);
}
function TodoList() {
const todos = [
{ text: "์ฅ๋ณด๊ธฐ", done: false },
{ text: "์ด๋ํ๊ธฐ", done: true },
];
return (
<ul>
{todos.map((todo, i) => (
<TodoItem key={i} text={todo.text} done={todo.done} />
))}
</ul>
);
}ํ๋ ์์ํฌ์ pnpm์ ๊ด๊ณ
- ํ๋ ์์ํฌ๋ npm/pnpm์ ํตํด ์ค์นํ๋ ํจํค์ง
- ๊ฐ๋ฐ ์์๋ Node.js ํ๊ฒฝ์์ ๋น๋ํ๊ณ , ๊ฒฐ๊ณผ๋ฌผ์ ๋ธ๋ผ์ฐ์ ์์ ์คํ
npx create-next-appโ Next.js ํ๋ก์ ํธ ์์ฑ โnpm run devโ ๊ฐ๋ฐ ์๋ฒ ์คํ- ์ต์ข ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ๋๋ ๊ฒ์ ํญ์ HTML + CSS + JS
์ ์ฒด ํ๋ฆ ์์ฝ
| ๋ธ๋ผ์ฐ์ ๊ฐ ์ดํดํ๋ ๊ฒ | ๊ฐ๋ฐํ ๋ ์ฐ๋ ๊ฒ | ๋น๋/ํจํค์ง ๊ด๋ฆฌ |
|---|---|---|
| HTML | React / Vue / Angular | npm / pnpm / yarn |
| CSS | Sass / Tailwind CSS | webpack / vite |
| JavaScript | TypeScript | Node.js |
- ๊ฐ๋ฐํ ๋๋ ํ๋ ์์ํฌ(React ๋ฑ)์ TypeScript๋ก ์์ฑ
- ๋น๋ ๋๊ตฌ(webpack, vite)๊ฐ ์ด๋ฅผ ๋ณํ
- ์ต์ข ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ ์ ๋ฌ๋๋ ๊ฒ์ ํญ์ HTML + CSS + JavaScript