JavaScript 2026.02.07 📖 22분 분량

JavaScript 기초: 변수, 함수, 이벤트 다루기

정적인 웹페이지에 생명을 불어넣는 마법

JavaScript가 뭐죠?

HTML이 뼈대, CSS가 디자인이라면, JavaScript는 웹페이지의 뇌입니다. 버튼을 클릭하면 무언가 일어나게 하고, 사용자의 입력에 반응하게 만듭니다.

JavaScript로 할 수 있는 것들:

  • 버튼 클릭 시 알림 표시
  • 입력값 검증 (이메일 형식 확인 등)
  • 애니메이션 실행
  • 데이터 가져오기 (API 호출)
  • 계산기, 게임, 챗봇 등 만들기

JavaScript 파일 연결하기

<!-- HTML 파일의 body 태그 끝 부분에 -->
<body>
    <h1>내 웹사이트</h1>
    <button id="myButton">클릭하세요</button>
    
    <script src="script.js"></script>  ← 여기!
</body>

왜 body 끝에 넣을까요? HTML이 먼저 로드된 후 JavaScript가 실행되어야 하기 때문입니다.

변수: 데이터를 담는 상자

변수 선언하기

// let: 값을 변경할 수 있는 변수
let name = "홍길동";
let age = 25;
let isStudent = true;

console.log(name);  // "홍길동" 출력
console.log(age);   // 25 출력

// 값 변경 가능
age = 26;
console.log(age);   // 26 출력

// const: 값을 변경할 수 없는 상수
const PI = 3.14159;
// PI = 3.14;  ← 에러 발생!

// var: 옛날 방식 (사용 비추천)
var oldStyle = "사용하지 마세요";

언제 let, 언제 const?

  • const: 기본적으로 사용 (값이 안 바뀌면)
  • let: 값이 변경될 때만 사용

데이터 타입

// 숫자 (Number)
let count = 100;
let price = 19.99;

// 문자열 (String)
let message = "안녕하세요";
let greeting = '반갑습니다';  // 작은따옴표도 가능
let template = `이름: ${name}`;  // 백틱: 변수 삽입 가능

// 불리언 (Boolean)
let isLoggedIn = true;
let hasPermission = false;

// 배열 (Array)
let fruits = ["사과", "바나나", "오렌지"];
console.log(fruits[0]);  // "사과"
console.log(fruits.length);  // 3

// 객체 (Object)
let person = {
    name: "홍길동",
    age: 25,
    job: "개발자"
};
console.log(person.name);  // "홍길동"
console.log(person.age);   // 25

함수: 코드를 재사용하는 방법

함수 선언하기

// 방법 1: 함수 선언식
function greet(name) {
    console.log("안녕하세요, " + name + "님!");
}

greet("철수");  // "안녕하세요, 철수님!"
greet("영희");  // "안녕하세요, 영희님!"

// 방법 2: 함수 표현식
const add = function(a, b) {
    return a + b;
};

let result = add(5, 3);
console.log(result);  // 8

// 방법 3: 화살표 함수 (모던한 방식)
const multiply = (a, b) => {
    return a * b;
};

// 한 줄이면 더 간단하게
const square = x => x * x;
console.log(square(5));  // 25

return 값

// return이 있는 함수
function calculateTotal(price, quantity) {
    return price * quantity;
}

let total = calculateTotal(1000, 3);
console.log(total);  // 3000

// return이 없는 함수
function sayHello() {
    console.log("Hello!");
    // return이 없으면 undefined 반환
}

DOM 조작: HTML 요소 다루기

요소 선택하기

// ID로 선택
const button = document.getElementById('myButton');

// 클래스로 선택
const cards = document.getElementsByClassName('card');

// CSS 선택자로 선택 (권장)
const title = document.querySelector('h1');
const allButtons = document.querySelectorAll('button');

// 첫 번째만 선택
const firstCard = document.querySelector('.card');

// 모두 선택 (배열 형태)
const allCards = document.querySelectorAll('.card');

내용 변경하기

// 텍스트 변경
const heading = document.querySelector('h1');
heading.textContent = "새로운 제목";

// HTML 변경
const container = document.querySelector('#container');
container.innerHTML = '<p>새로운 내용</p>';

// 스타일 변경
heading.style.color = 'red';
heading.style.fontSize = '30px';

클래스 추가/제거

const box = document.querySelector('.box');

// 클래스 추가
box.classList.add('active');

// 클래스 제거
box.classList.remove('hidden');

// 클래스 토글 (있으면 제거, 없으면 추가)
box.classList.toggle('highlighted');

이벤트: 사용자 액션에 반응하기

기본 이벤트 처리

// HTML
// <button id="myButton">클릭하세요</button>

// JavaScript
const button = document.querySelector('#myButton');

button.addEventListener('click', function() {
    alert('버튼이 클릭되었습니다!');
});

// 화살표 함수로 간결하게
button.addEventListener('click', () => {
    console.log('클릭됨!');
});

다양한 이벤트 종류

// 클릭 이벤트
button.addEventListener('click', () => {
    console.log('클릭');
});

// 마우스 오버
button.addEventListener('mouseover', () => {
    button.style.backgroundColor = 'blue';
});

// 마우스 아웃
button.addEventListener('mouseout', () => {
    button.style.backgroundColor = 'gray';
});

// 입력 이벤트
const input = document.querySelector('#nameInput');
input.addEventListener('input', (e) => {
    console.log('현재 입력값:', e.target.value);
});

실전 예제: 카운터 만들기

HTML

<div class="counter">
    <h1 id="count">0</h1>
    <button id="decrease">-</button>
    <button id="reset">초기화</button>
    <button id="increase">+</button>
</div>

JavaScript

// 1. 요소 선택
const countDisplay = document.querySelector('#count');
const decreaseBtn = document.querySelector('#decrease');
const resetBtn = document.querySelector('#reset');
const increaseBtn = document.querySelector('#increase');

// 2. 초기 값
let count = 0;

// 3. 함수 정의
function updateDisplay() {
    countDisplay.textContent = count;
    
    // 음수면 빨간색, 양수면 초록색
    if (count < 0) {
        countDisplay.style.color = 'red';
    } else if (count > 0) {
        countDisplay.style.color = 'green';
    } else {
        countDisplay.style.color = 'black';
    }
}

// 4. 이벤트 리스너
decreaseBtn.addEventListener('click', () => {
    count--;
    updateDisplay();
});

resetBtn.addEventListener('click', () => {
    count = 0;
    updateDisplay();
});

increaseBtn.addEventListener('click', () => {
    count++;
    updateDisplay();
});

조건문: 상황에 따라 다르게 동작하기

let age = 20;

if (age >= 18) {
    console.log("성인입니다");
} else {
    console.log("미성년자입니다");
}

// else if로 여러 조건
let score = 85;

if (score >= 90) {
    console.log("A학점");
} else if (score >= 80) {
    console.log("B학점");
} else if (score >= 70) {
    console.log("C학점");
} else {
    console.log("재수강");
}

// 삼항 연산자 (간단한 조건)
let result = age >= 18 ? "성인" : "미성년자";
console.log(result);

반복문: 같은 작업을 반복하기

// for 루프
for (let i = 0; i < 5; i++) {
    console.log(i);  // 0, 1, 2, 3, 4
}

// 배열 반복
const fruits = ["사과", "바나나", "오렌지"];

// 방법 1: 전통적인 for 루프
for (let i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

// 방법 2: forEach (더 간결)
fruits.forEach(fruit => {
    console.log(fruit);
});

// 방법 3: for...of (가장 모던)
for (const fruit of fruits) {
    console.log(fruit);
}

실전 예제: To-Do 리스트

<!-- HTML -->
<div class="todo-app">
    <input type="text" id="todoInput" placeholder="할 일을 입력하세요">
    <button id="addBtn">추가</button>
    <ul id="todoList"></ul>
</div>

// JavaScript
const todoInput = document.querySelector('#todoInput');
const addBtn = document.querySelector('#addBtn');
const todoList = document.querySelector('#todoList');

addBtn.addEventListener('click', () => {
    const text = todoInput.value;
    
    // 빈 값 체크
    if (text.trim() === '') {
        alert('할 일을 입력하세요!');
        return;
    }
    
    // 새 항목 생성
    const li = document.createElement('li');
    li.textContent = text;
    
    // 삭제 버튼 추가
    const deleteBtn = document.createElement('button');
    deleteBtn.textContent = '삭제';
    deleteBtn.addEventListener('click', () => {
        li.remove();
    });
    
    li.appendChild(deleteBtn);
    todoList.appendChild(li);
    
    // 입력창 초기화
    todoInput.value = '';
});

// Enter 키로도 추가 가능하게
todoInput.addEventListener('keypress', (e) => {
    if (e.key === 'Enter') {
        addBtn.click();
    }
});

디버깅 팁

console.log 활용

// 변수 확인
console.log('name:', name);

// 객체 확인
console.log('person:', person);

// 여러 값 확인
console.log('count:', count, 'total:', total);

// 에러 표시
console.error('에러 발생!');

// 경고 표시
console.warn('주의: 값이 비어있습니다');

자주 하는 실수

1. 세미콜론 빠뜨림

// 나쁜 예
let name = "홍길동"  ← 세미콜론 없음
console.log(name)

// 좋은 예
let name = "홍길동";
console.log(name);

2. == vs ===

// == : 값만 비교
"5" == 5   // true

// === : 값과 타입 모두 비교 (권장)
"5" === 5  // false

// 항상 ===를 사용하세요!

3. undefined와 null

let a;           // undefined (선언만 하고 값 안 줌)
let b = null;    // null (의도적으로 빈 값)

console.log(a);  // undefined
console.log(b);  // null

🎯 연습 과제

다음 기능을 가진 프로그램을 만들어보세요:

  • □ 계산기 (덧셈, 뺄셈, 곱셈, 나눗셈)
  • □ 비밀번호 강도 체커
  • □ 간단한 퀴즈 앱
  • □ 색상 랜덤 생성기
"JavaScript를 마스터하는 비결은 매일 조금씩 코드를 작성하는 것입니다. 완벽하지 않아도 괜찮아요. 일단 만들어보세요!"

JavaScript 기초를 익혔습니다! 다음 글에서는 에러를 찾고 해결하는 디버깅 방법을 배워보겠습니다.