안동민 개발노트 아이콘

안동민 개발노트

6장 : 객체지향과 웹프로그래밍

JavaScript, DOM, BOM, 이벤트

객체지향과 웹프로그래밍 학습 절입니다.

6장 2절에서는 웹의 구조와 HTML/CSS를 배웠습니다.

웹 = 클라이언트와 서버의 요청/응답
HTML = 구조와 내용
CSS = 디자인과 배치

이번 절에서는 웹페이지에 동작을 넣는 JavaScript를 배웁니다.

이번 절의 핵심은 다음과 같습니다.

JavaScript = 웹페이지를 움직이것이 하는 언어
BOM = 브라우저를 객체로 다루는 모델
DOM = HTML 문서를 객체로 다루는 모델
이벤트 = 클릭, 입력, 키보드 같은 사용자 행동
예외 처리 = 실행 중 발생한 오류를 안전하게 처리하는 방법

이번 절 내용은 웹프로그래밍 출제범위의 JavaScript 자료형과 변수, 제어문, 함수, 객체, 브라우저 객체 모델, 문서 객체 모델, 이벤트, 예외 처리에 해당합니다.


이번 절의 큰 그림

이번 절에서 배울 순서는 다음과 같습니다.

JavaScript의 역할
→ 변수와 자료형
→ 문자열
→ 연산자와 제어문
→ 함수
→ 익명함수, 콜백함수, 클로저
→ 객체
→ 내장객체
→ BOM
→ DOM
→ 이벤트
→ 예외 처리

6장 2절까지는 웹페이지를 이렇게 봤습니다.

HTML = 버튼을 만듭니다.
CSS = 버튼을 예쁘게 꾸밉니다.

6장 3절에서는 여기에 JavaScript를 붙입니다.

JavaScript = 버튼을 클릭했을 때 실제 동작하게 만듭니다.
<button onclick="alert('안녕하세요')">클릭</button>

버튼을 누르면 알림창이 뜹니다.


JavaScript 기본

JavaScript란?

JavaScript는 웹페이지에 동작을 넣기 위한 프로그래밍 언어입니다.

할 수 있는 일
버튼 클릭 처리
입력값 검사
HTML 내용 바꾸기
CSS 스타일 바꾸기
팝업창 띄우기
브라우저 정보 확인
페이지 이동
서버와 데이터 주고받기

예를 들어 로그인 화면에서 아이디를 입력하지 않고 버튼을 누르면 이런 메시지가 뜹니다.

아이디를 입력하세요.

이런 입력 검사를 JavaScript로 할 수 있습니다.

웹프로그래밍 범위에도 JavaScript의 자료형, 변수, 제어문, 함수, 객체, BOM, DOM, 이벤트, 예외 처리가 포함되어 있습니다.


HTML, CSS, JavaScript 역할 다시 비교

구분역할
HTML구조와 내용버튼, 입력칸, 문단
CSS디자인과 배치색, 크기, 위치
JavaScript동작클릭하면 메시지 출력
<button id="btn">클릭</button>

HTML은 버튼을 만듭니다.

#btn {
    color: white;
}

CSS는 버튼을 꾸밉니다.

document.getElementById("btn").onclick = function() {
    alert("클릭했습니다.");
};

JavaScript는 버튼이 클릭되었을 때 동작을 만듭니다.


JavaScript 작성 위치

JavaScript는 보통 세 가지 방식으로 작성합니다.

HTML 태그 안에 직접 작성

<button onclick="alert('클릭')">버튼</button>

간단하지만 HTML과 JavaScript가 섞여서 복잡해질 수 있습니다.


script 태그 안에 작성

<script>
    alert("안녕하세요");
</script>

HTML 문서 안에 JavaScript 코드를 넣는 방식입니다.


외부 JavaScript 파일 사용

HTML
<script src="script.js"></script>
script.js
alert("외부 파일입니다.");

실제 개발에서는 HTML, CSS, JavaScript를 분리해서 관리하는 것이 좋습니다.

HTML = 구조
CSS = 디자인
JavaScript = 동작

변수와 자료형

변수란?

변수는 값을 저장하는 이름 있는 공간입니다.

C에서 이렇게 배웠습니다.

int age = 15;

JavaScript에서는 이렇게 씁니다.

let age = 15;

또는 예전 방식으로는 var를 씁니다.

var age = 15;

상수는 const를 씁니다.

const PI = 3.14;

정리하면 다음과 같습니다.

선언의미
var오래된 변수 선언 방식
let블록 범위 변수
const값을 다시 대입할 수 없는 상수

시험 범위에는 JavaScript의 자료형과 변수 선언이 포함되어 있습니다.


var, let, const 차이

처음에는 이렇게 구분하면 됩니다.

키워드값 변경다시 선언범위
var가능가능함수 범위
let가능보통 같은 범위에서 재선언 불가블록 범위
const불가능보통 같은 범위에서 재선언 불가블록 범위
let score = 90;
score = 100;

가능합니다.

const MAX = 100;
MAX = 200;

이것은 오류입니다. const는 다시 값을 대입할 수 없습니다.


JavaScript 자료형

JavaScript의 기본 자료형은 다음과 같습니다.

자료형의미
number숫자10, 3.14
string문자열"ABC", 'ABC'
boolean참/거짓true, false
undefined값이 정해지지 않음undefined
null의도적으로 비어 있음null
object객체{ name: "Kim" }
function함수function() {}

JavaScript는 C와 다르게 변수 선언 시 자료형을 직접 쓰지 않습니다.

C
int age = 15;
JavaScript
let age = 15;

자료형은 값에 따라 결정됩니다.


typeof

값의 자료형을 확인할 때 typeof를 씁니다.

console.log(typeof 10);
console.log(typeof "ABC");
console.log(typeof true);
결과
number
string
boolean
let x = 10;
console.log(typeof x);
출력
number

console.log()는 개발자 도구 콘솔에 값을 출력할 때 많이 씁니다.


문자열

문자열은 글자들의 모음입니다.

JavaScript에서는 작은따옴표와 큰따옴표를 모두 사용할 수 있습니다.

let a = 'ABC';
let b = "ABC";

둘 다 문자열입니다.

웹프로그래밍 예시문제에서도 JavaScript 문자열 표현 문제가 나옵니다. 작은따옴표 문자열과 큰따옴표 문자열은 가능하지만, 큰따옴표로 감싼 문자열 안에서 큰따옴표를 그대로 또 쓰면 문제가 됩니다.


문자열 따옴표 주의

올바른 예
let s1 = 'ABC';
let s2 = "ABC";
let s3 = "점수는 '100점' 이다";

s3는 큰따옴표 안에 작은따옴표가 들어 있으므로 괜찮습니다.

잘못된 예
let s4 = "점수는 "100" 이다";

왜 틀릴까?

JavaScript는 이렇게 해석하려고 합니다.

"점수는 "
100점
" 입니다"

문자열이 중간에 끊겨버립니다.

올바르게 쓰려면 작은따옴표와 큰따옴표를 섞거나, 이스케이프 문자를 씁니다.

let s4 = '점수는 "100점" 이다';
또는
let s4 = "점수는 \"100점\" 이다";

템플릿 문자열

백틱 `을 사용하면 문자열 안에 변수를 쉽게 넣을 수 있습니다.

let name = "Kim";
let score = 90;

let message = `${name}의 점수는 ${score}점입니다.`;
결과
Kim의 점수는 90점입니다.

이런 문자열을 템플릿 문자열이라고 합니다.

시험 기본 범위에서는 작은따옴표와 큰따옴표 구분이 더 중요하지만, 실전에서는 템플릿 문자열도 자주 씁니다.


연산자

JavaScript 연산자는 C와 비슷합니다.

산술 연산자

+  -  *  /  %
let a = 7;
let b = 2;

console.log(a + b); // 9
console.log(a % b); // 1

비교 연산자

>  <  >=  <=  ==  !=  ===  !==

여기서 ===== 차이가 중요합니다.

"10" == 10

은 true가 될 수 있습니다. 자료형을 자동 변환해서 비교하기 때문입니다.

"10" === 10

은 false다. 값과 자료형을 모두 비교하기 때문입니다.

처음 배울 때는 이렇게 기억하자.

==  = 값만 느슨하게 비교
=== = 값과 자료형을 엄격하게 비교

실전에서는 ===를 권장하는 경우가 많습니다.


논리 연산자

&&  ||  !

C와 비슷합니다.

연산자의미
&&AND, 그리고
`
!NOT, 아님
if (age >= 13 && age <= 19) {
    console.log("청소년");
}

제어문

조건문 if

조건문은 조건에 따라 실행할 코드를 선택합니다.

let score = 85;

if (score >= 90) {
    console.log("A");
} else if (score >= 80) {
    console.log("B");
} else {
    console.log("C 이하");
}
출력
B
흐름
score >= 90 ? 거짓
score >= 80 ? 참
B 출력

웹프로그래밍 범위에도 JavaScript 제어문으로 if, switch, 삼항연산자가 포함되어 있습니다.


switch문

값에 따라 여러 경우를 나누고 싶을 때 씁니다.

let menu = 2;

switch (menu) {
    case 1:
        console.log("김밥");
        break;
    case 2:
        console.log("라면");
        break;
    case 3:
        console.log("떡볶이");
        break;
    default:
        console.log("잘못된 선택");
}
출력
라면

break를 빼면 다음 case까지 이어서 실행될 수 있습니다.

C에서 배운 switch와 거의 같은 개념입니다.


삼항 연산자

삼항 연산자는 if-else를 짧게 쓰는 방식입니다.

형식
조건 ? 참일 : 거짓일
let age = 20;
let result = age >= 19 ? "성인" : "미성년자";

console.log(result);
출력
성인

C에서 배운 조건 연산자와 같습니다.


반복문 while

조건이 참인 동안 반복합니다.

let i = 1;

while (i <= 5) {
    console.log(i);
    i++;
}
출력
1
2
3
4
5
주의
i++;

같이 조건을 언젠가 거짓으로 만드는 변화가 있어야 합니다. 없으면 무한 반복이 될 수 있습니다.


do~while

일단 한 번 실행하고 조건을 검사합니다.

let i = 10;

do {
    console.log(i);
    i++;
} while (i <= 5);
출력
10

조건은 처음부터 거짓이지만, do~while은 최소 한 번 실행됩니다.


for문

반복 횟수가 분명할 때 많이 씁니다.

for (let i = 1; i <= 5; i++) {
    console.log(i);
}
출력
1
2
3
4
5
형식
for (초기식; 조건식; 증감식) {
    반복할 코드
}

C의 for문과 거의 비슷합니다.


for in

for in은 객체의 속성을 순회할 때 많이 씁니다.

let student = {
    name: "Kim",
    score: 90,
    grade: "A"
};

for (let key in student) {
    console.log(key + ": " + student[key]);
}
출력
name: Kim
score: 90
grade: A

웹프로그래밍 범위에도 JavaScript 반복문으로 while, do~while, for, for in이 포함되어 있습니다.


함수

함수란?

함수는 특정 일을 하는 코드 묶음입니다.

C에서 배웠던 함수와 같은 개념입니다.

function add(a, b) {
    return a + b;
}

let result = add(3, 5);
console.log(result);
출력
8
함수의 장점
코드 재사용
기능별 정리
복잡한 프로그램을 작은 단위로 분리

웹프로그래밍 범위에도 JavaScript 함수로 일반함수, 익명함수, 매개변수와 리턴값, 가변 인자 함수, 콜백함수와 클로저, 기본 내장함수가 포함됩니다.


일반 함수

기본 함수 선언은 이렇게 합니다.

function hello() {
    console.log("안녕하세요");
}

hello();
출력
안녕하세요
매개변수가 있는 함수
function greet(name) {
    console.log(name + "님 안녕하세요");
}

greet("Kim");
출력
Kim님 안녕하세요

return

함수는 결과값을 돌려줄 수 있습니다.

function square(x) {
    return x * x;
}

let result = square(4);
console.log(result);
출력
16

return을 만나면 함수는 종료됩니다.

function test() {
    return 10;
    return 20;
}

결과는 10입니다. 두 번째 return 20은 실행되지 않습니다.


익명 함수

익명 함수는 이름이 없는 함수입니다.

let add = function(a, b) {
    return a + b;
};

console.log(add(2, 3));
출력
5

여기서 함수 자체를 변수 add에 저장했습니다.

JavaScript에서는 함수도 값처럼 다룰 수 있습니다.

함수를 변수에 저장할 수 있습니다.
함수를 다른 함수에 전달할 수 있습니다.
함수를 다른 함수에서 반환할 수 있습니다.

화살표 함수

화살표 함수는 함수를 짧게 쓰는 문법입니다.

let add = (a, b) => {
    return a + b;
};
더 줄이면
let add = (a, b) => a + b;
호출
console.log(add(3, 5));
출력
8

시험 기본 범위에서는 일반함수와 익명함수가 중요하지만, 화살표 함수도 현대 JavaScript에서 많이 씁니다.


가변 인자 함수

JavaScript 함수는 인수 개수가 정확히 맞지 않아도 호출할 수 있습니다.

function printAll() {
    console.log(arguments);
}

printAll(1, 2, 3);

arguments에는 전달된 인수들이 들어 있습니다.

요즘은 나머지 매개변수 문법도 씁니다.

function sum(...numbers) {
    let total = 0;

    for (let n of numbers) {
        total += n;
    }

    return total;
}

console.log(sum(1, 2, 3, 4));
출력
10
가변 인자 함수 = 인수 개수가 정해져 있지 않은 함수

콜백 함수

콜백 함수는 다른 함수에 인수로 전달되는 함수입니다.

function run(callback) {
    callback();
}

run(function() {
    console.log("콜백 실행");
});
출력
콜백 실행

왜 필요할까요?

JavaScript에서는 특정 일이 끝난 뒤 실행할 코드를 함수로 전달하는 경우가 많습니다.

button.addEventListener("click", function() {
    alert("버튼 클릭");
});

여기서 function() { ... }가 콜백 함수입니다.

버튼이 클릭되면 나중에 실행될 함수

이벤트 처리에서 콜백 함수는 매우 중요합니다.


클로저

클로저는 함수가 만들어질 때의 주변 변수를 기억하는 성질입니다.

function outer() {
    let count = 0;

    return function() {
        count++;
        console.log(count);
    };
}

let counter = outer();

counter();
counter();
counter();
출력
1
2
3

outer() 함수는 이미 끝났지만, 안쪽 함수는 count를 계속 기억합니다.

처음에는 이렇게만 이해하자.

클로저 = 함수가 자신이 만들어진 환경의 변수를 기억하는 것

웹프로그래밍 범위에도 콜백함수와 클로저가 포함되어 있습니다.


기본 내장 함수: alert, prompt

JavaScript에는 브라우저에서 사용할 수 있는 기본 함수가 있습니다.

alert

알림창을 띄웁니다.

alert("안녕하세요");

prompt

사용자에게 입력을 받습니다.

let name = prompt("이름을 입력하세요");
alert(name + "님 안녕하세요");

웹프로그래밍 범위에도 기본 내장함수로 prompt, alert 등이 포함되어 있습니다.


객체

객체란?

객체는 여러 값을 이름으로 묶은 것입니다.

6장 1절 객체지향에서 객체를 배웠습니다.

JavaScript에서도 객체가 중요합니다.

let customer = {
    name: "홍길동",
    age: 23
};

여기서는 다음과 같습니다.

속성 이름
name"홍길동"
age23

웹프로그래밍 예시문제에서도 JavaScript 객체 선언 문제의 정답은 { 이름:'홍길동', 나이: 23 }처럼 중괄호를 쓰고 속성과 값을 :로 연결하는 형태입니다.


객체 선언 문법

올바른 객체 선언
var customer = { 이름: '홍길동', 나이: 23 };
또는 영어 속성 이름으로
let customer = {
    name: "Kim",
    age: 23
};
틀린 형태
var customer = { 이름='홍길동', 나이=23 };

객체에서는 속성과 값을 =가 아니라 :로 연결합니다.

또 배열처럼 []를 쓰면 안 됩니다.

var customer = [ 이름:'홍길동', 나이:23 ]; // 잘못된 형태
정리
객체 = { 속성: 값, 속성: 값 }

객체 속성 접근

객체의 속성에 접근하는 방법은 두 가지입니다.

점 표기법

console.log(customer.name);

대괄호 표기법

console.log(customer["name"]);

둘 다 같은 값을 가져옵니다.

Kim

대괄호 표기법은 속성 이름이 변수로 들어올 때 유용합니다.

let key = "age";
console.log(customer[key]);

객체 메소드

객체 안에 함수가 들어가면 메소드라고 부릅니다.

let student = {
    name: "Kim",
    score: 90,

    print: function() {
        console.log(this.name + ": " + this.score);
    }
};

student.print();
출력
Kim: 90

여기서 this는 현재 객체를 가리킵니다.

this.name = student.name
this.score = student.score

객체 속성 추가와 제거

JavaScript 객체는 나중에 속성을 추가할 수 있습니다.

let person = {
    name: "Kim"
};

person.age = 20;

이제 객체는 다음과 같습니다.

{
    name: "Kim",
    age: 20
}

속성 제거는 delete를 사용합니다.

delete person.age;

웹프로그래밍 범위에도 객체의 속성 추가와 제거가 포함되어 있습니다.


생성자 함수

비슷한 객체를 여러 개 만들고 싶으면 생성자 함수를 사용할 수 있습니다.

function Student(name, score) {
    this.name = name;
    this.score = score;

    this.print = function() {
        console.log(this.name + ": " + this.score);
    };
}

let s1 = new Student("Kim", 90);
let s2 = new Student("Lee", 80);

s1.print();
s2.print();
출력
Kim: 90
Lee: 80

여기서 new Student()로 객체를 만듭니다.

생성자 함수 = 객체를 만들기 위한 함수

웹프로그래밍 범위에도 객체 생성과 생성자함수가 포함되어 있습니다.


기본 내장 객체

JavaScript에는 기본으로 제공되는 객체들이 있습니다.

객체역할
Math수학 계산
Date날짜와 시간
String문자열 처리
Array배열 처리
Number숫자 처리
JSONJSON 데이터 처리
console.log(Math.max(3, 5));
console.log(Math.random());
출력 예
5
0.732...
날짜
let now = new Date();
console.log(now);

BOM

BOM이란?

BOM은 Browser Object Model입니다.

뜻: 브라우저를 객체처럼 다루기 위한 모델

브라우저에는 여러 정보와 기능이 있습니다.

브라우저 창
주소
화면 크기
방문 기록
브라우저 정보

BOM은 이런 것들을 객체로 제공합니다.

대표 BOM 객체는 다음과 같습니다.

객체역할
window브라우저 창 전체
screen화면 정보
location현재 주소 정보
navigator브라우저 정보
history방문 기록

웹프로그래밍 범위에도 브라우저 객체 모델로 window, screen, location, navigator 객체가 포함되어 있습니다.


window 객체

window는 브라우저 창 전체를 나타내는 최상위 객체입니다.

대표 기능
window.alert("안녕하세요");

사실 alert()window.alert()의 줄임으로 볼 수 있습니다.

alert("안녕하세요");

둘 다 가능합니다.

다른 예
window.open("https://www.example.com");

새 창이나 새 탭을 열 수 있습니다.

window.setTimeout(function() {
    alert("3초 후 실행");
}, 3000);

3초 후에 함수를 실행합니다.


screen 객체

screen은 사용자의 화면 정보를 제공합니다.

console.log(screen.width);
console.log(screen.height);
1920
1080

주로 화면 크기 관련 정보를 확인할 때 사용합니다.


location 객체

location은 현재 페이지 주소 정보를 다룹니다.

console.log(location.href);

현재 전체 URL을 출력합니다.

페이지 이동
location.href = "https://www.example.com";

새 주소로 이동합니다.

새로고침
location.reload();
정리
location = 현재 주소 정보와 페이지 이동

navigator는 브라우저와 사용자 환경 정보를 제공합니다.

console.log(navigator.userAgent);

브라우저와 운영체제 관련 문자열을 확인할 수 있습니다.

주의할 점
navigator 정보는 브라우저나 환경에 따라 달라질 수 있습니다.

시험에서는 navigator가 브라우저 정보를 나타낸다는 정도가 중요합니다.


DOM

DOM이란?

DOM은 Document Object Model입니다.

뜻: HTML 문서를 객체 구조로 표현한 모델

브라우저는 HTML 문서를 읽고, 그것을 트리 형태의 객체 구조로 만듭니다.

<html>
<body>
    <h1>제목</h1>
    <p>문단</p>
</body>
</html>

DOM 구조는 대략 이렇게 볼 수 있습니다.

document
 └─ html
     └─ body
         ├─ h1
         └─ p

JavaScript는 DOM을 이용해 HTML 요소를 찾고, 내용을 바꾸고, 스타일을 바꿉니다.

웹프로그래밍 범위에도 문서 객체 모델로 document 객체, document 객체 내용 변경, document 객체 스타일 조작이 포함되어 있습니다.


document 객체

document는 현재 HTML 문서를 나타내는 객체입니다.

HTML 요소를 찾을 때 자주 사용합니다.

대표 메소드는 다음과 같습니다.

메소드의미
getElementById()id로 요소 찾기
querySelector()CSS 선택자로 첫 번째 요소 찾기
querySelectorAll()CSS 선택자로 모든 요소 찾기
createElement()새 요소 만들기
<h1 id="title">제목</h1>
JavaScript
let title = document.getElementById("title");
console.log(title);

id가 title인 요소를 가져옵니다.


DOM 내용 변경

HTML
<h1 id="title">기존 제목</h1>
JavaScript
let title = document.getElementById("title");
title.textContent = "새 제목";

화면의 제목이 바뀝니다.

기존 제목 → 새 제목

innerHTML을 쓰면 HTML 태그까지 넣을 수 있습니다.

title.innerHTML = "<em>강조된 제목</em>";

차이는 다음과 같습니다.

속성의미
textContent텍스트만 변경
innerHTMLHTML 태그까지 해석

DOM 스타일 변경

HTML
<p id="msg">안녕하세요</p>
JavaScript
let msg = document.getElementById("msg");

msg.style.color = "red";
msg.style.fontSize = "24px";
결과
글자색이 빨간색
글자 크기 24px

CSS 속성 이름은 JavaScript에서 약간 달라질 수 있습니다.

CSS
font-size
background-color
JavaScript
fontSize
backgroundColor

즉 하이픈을 빼고 뒤 단어 첫 글자를 대문자로 씁니다.

font-size → fontSize
background-color → backgroundColor

DOM 요소 생성

JavaScript로 HTML 요소를 새로 만들 수도 있습니다.

let p = document.createElement("p");
p.textContent = "새 문단입니다.";

document.body.appendChild(p);
동작
p 요소를 만듭니다.
텍스트를 넣습니다.
body 안에 추가합니다.

결과적으로 화면에 새 문단이 생깁니다.


이벤트

이벤트란?

이벤트는 웹페이지에서 발생하는 사건입니다.

마우스 클릭
마우스 이동
키보드 입력
폼 제출
입력값 변경
페이지 로딩

사용자가 버튼을 클릭하면 클릭 이벤트가 발생합니다.

클릭 이벤트 발생
→ JavaScript 함수 실행

웹프로그래밍 범위에도 이벤트로 고전 이벤트 모델과 표준 이벤트 모델, 마우스 이벤트, 키보드 이벤트, 입력양식 이벤트, 기타 이벤트가 포함되어 있습니다.


이벤트 처리 방법 1: HTML 속성

HTML 태그 안에 직접 이벤트를 작성할 수 있습니다.

<button onclick="alert('클릭')">버튼</button>

버튼을 클릭하면 알림창이 뜹니다.

장점
간단합니다.
단점
HTML과 JavaScript가 섞입니다.
코드가 커지면 관리하기 어렵습니다.

이벤트 처리 방법 2: 고전 이벤트 모델

JavaScript에서 요소의 이벤트 속성에 함수를 대입합니다.

HTML
<button id="btn">버튼</button>
JavaScript
let btn = document.getElementById("btn");

btn.onclick = function() {
    alert("클릭했습니다.");
};

이 방식은 이해하기 쉽습니다.

단점은 같은 이벤트에 여러 함수를 등록하기 어렵다는 점입니다.

btn.onclick = function() {
    alert("A");
};

btn.onclick = function() {
    alert("B");
};

이렇게 하면 뒤에 넣은 함수가 앞의 것을 덮어쓸 수 있습니다.


이벤트 처리 방법 3: 표준 이벤트 모델

표준 이벤트 모델은 addEventListener()를 사용합니다.

let btn = document.getElementById("btn");

btn.addEventListener("click", function() {
    alert("클릭했습니다.");
});
장점
같은 이벤트에 여러 개의 이벤트 리스너를 등록할 수 있습니다.
HTML과 JavaScript를 분리하기 좋습니다.
btn.addEventListener("click", function() {
    console.log("첫 번째");
});

btn.addEventListener("click", function() {
    console.log("두 번째");
});

버튼 클릭 시 둘 다 실행될 수 있습니다.


이벤트 객체

이벤트가 발생하면 이벤트 정보를 담은 객체가 함수에 전달됩니다.

document.addEventListener("click", function(event) {
    console.log(event.clientX);
    console.log(event.clientY);
});

여기서 event 객체에는 클릭 위치 같은 정보가 들어 있습니다.

속성의미
event.target이벤트가 발생한 요소
event.clientX브라우저 화면 기준 X 좌표
event.clientY브라우저 화면 기준 Y 좌표
event.key눌린 키
event.preventDefault()기본 동작 막기

마우스 이벤트

대표 마우스 이벤트는 다음과 같습니다.

이벤트의미
click클릭
dblclick더블클릭
mousedown마우스 버튼 누름
mouseup마우스 버튼 뗌
mousemove마우스 움직임
mouseover요소 위로 올라감
mouseout요소 밖으로 나감
let box = document.getElementById("box");

box.addEventListener("mouseover", function() {
    box.style.backgroundColor = "yellow";
});

box.addEventListener("mouseout", function() {
    box.style.backgroundColor = "white";
});

마우스를 올리면 노란색, 벗어나면 흰색이 됩니다.


키보드 이벤트

대표 키보드 이벤트는 다음과 같습니다.

이벤트의미
keydown키를 누르는 순간
keyup키를 떼는 순간
keypress문자 입력 관련, 요즘은 사용이 줄어듦
document.addEventListener("keydown", function(event) {
    console.log("누른 키:", event.key);
});
키보드에서 A를 누르면
누른 키: a

또는 브라우저와 상황에 따라 A처럼 표시될 수 있습니다.


입력 양식 이벤트

폼과 입력칸에서 자주 쓰는 이벤트가 있습니다.

이벤트의미
submit폼 제출
change값 변경 후 확정
input입력값이 바뀔 때마다
focus입력칸에 커서가 들어옴
blur입력칸에서 커서가 빠져나감
<form id="loginForm">
    <input id="userId" type="text">
    <button type="submit">로그인</button>
</form>
JavaScript
let form = document.getElementById("loginForm");

form.addEventListener("submit", function(event) {
    let userId = document.getElementById("userId").value;

    if (userId === "") {
        alert("아이디를 입력하세요.");
        event.preventDefault();
    }
});

event.preventDefault()는 기본 제출 동작을 막습니다.

입력값이 비어 있으면 서버로 보내지 않음

페이지 로드 이벤트

HTML 요소가 아직 만들어지기 전에 JavaScript가 실행되면 요소를 찾지 못할 수 있습니다.

그래서 문서가 준비된 뒤 실행해야 할 때가 있습니다.

window.addEventListener("load", function() {
    console.log("페이지 로드 완료");
});

또는 DOMContentLoaded를 씁니다.

document.addEventListener("DOMContentLoaded", function() {
    console.log("DOM 준비 완료");
});

차이는 다음과 같습니다.

이벤트의미
DOMContentLoadedHTML DOM 구성이 끝남
load이미지 등 외부 자원까지 로드 완료

이벤트 전파 맛보기

이벤트는 자식 요소에서 부모 요소로 전파될 수 있습니다.

HTML
<div id="parent">
    <button id="child">버튼</button>
</div>

버튼을 클릭하면 버튼 이벤트뿐 아니라 부모 div 쪽 이벤트도 반응할 수 있습니다.

이벤트 전파에는 두 흐름이 있습니다.

캡처링
버블링

처음에는 이렇게만 기억하자.

이벤트는 한 요소에서만 끝나지 않고 부모나 자식 방향으로 전달될 수 있습니다.
이벤트 전파를 막을 때는
event.stopPropagation();

을 쓸 수 있습니다.


예외 처리

예외란?

예외는 프로그램 실행 중 발생하는 오류 상황입니다.

존재하지 않는 변수 사용
JSON 형식 오류
잘못된 입력
네트워크 오류
함수 호출 오류

예외가 발생하면 프로그램이 중단될 수 있습니다.

그래서 예외 처리를 사용합니다.

웹프로그래밍 범위에도 JavaScript 예외 처리로 try-catch, throw 구문, exception 객체가 포함됩니다.


try-catch

예외가 발생할 수 있는 코드를 try 안에 넣고, 예외가 발생하면 catch에서 처리합니다.

try {
    let result = riskyFunction();
    console.log(result);
} catch (error) {
    console.log("오류 발생:", error.message);
}
형식
try {
    // 예외가 발생할 수 있는 코드
} catch (error) {
    // 예외 처리 코드
}

예외가 발생하지 않으면 catch는 실행되지 않습니다.


throw

직접 예외를 발생시키고 싶을 때 throw를 씁니다.

function divide(a, b) {
    if (b === 0) {
        throw new Error("0으로 나눌 수 없습니다.");
    }

    return a / b;
}

try {
    console.log(divide(10, 0));
} catch (error) {
    console.log(error.message);
}
출력
0으로 나눌 수 없습니다.
정리
throw = 예외를 던짐
catch = 예외를 받아 처리

finally

finally는 예외 발생 여부와 관계없이 실행됩니다.

try {
    console.log("작업 시작");
} catch (error) {
    console.log("오류 처리");
} finally {
    console.log("항상 실행");
}

주로 정리 작업에 사용됩니다.

파일 닫기
연결 해제
로딩 표시 제거

예제 문제

JavaScript 전체 예제

HTML
<input id="nameInput" type="text" placeholder="이름 입력">
<button id="btn">확인</button>
<p id="result"></p>
JavaScript
let btn = document.getElementById("btn");

btn.addEventListener("click", function() {
    let name = document.getElementById("nameInput").value;
    let result = document.getElementById("result");

    if (name === "") {
        result.textContent = "이름을 입력하세요.";
        result.style.color = "red";
    } else {
        result.textContent = name + "님 안녕하세요.";
        result.style.color = "blue";
    }
});

이 코드에는 이번 절에서 배운 내용이 많이 들어 있습니다.

코드개념
let변수
getElementByIdDOM 요소 찾기
addEventListener이벤트 등록
click클릭 이벤트
.value입력값
if-else조건문
textContentDOM 내용 변경
style.colorDOM 스타일 변경

시험 예시형 문제 1: 문자열

다음 중 JavaScript 문자열로 올바르지 않은 것은?

① 'ABC'
② "ABC"
③ "점수는 '100점' 입니다"
④ "점수는 "100점" 입니다"
정답은
이유
큰따옴표로 시작한 문자열 안에 큰따옴표를 그대로 다시 쓰면 문자열이 중간에 끊깁니다.
올바르게 쓰려면
'점수는 "100점" 이다'
또는
"점수는 \"100점\" 이다"

웹프로그래밍 예시문제에도 같은 취지의 문자열 문제가 나옵니다.


시험 예시형 문제 2: 객체 선언

다음 중 JavaScript 객체 선언으로 올바른 것은?

var customer = { 이름:'홍길동', 나이: 23 };

이 형태가 맞습니다.

이유
객체는 중괄호 { }를 사용합니다.
속성 이름과 값은 : 로 연결합니다.
속성들은 , 로 구분합니다.
틀린 형태
var customer = { 이름='홍길동', 나이=23 };

=를 쓰면 안 됩니다.

var customer = [ 이름:'홍길동', 나이:23 ];

객체 선언에 배열 대괄호 []를 쓰면 안 됩니다.

웹프로그래밍 예시문제에서도 객체 선언 정답은 { 이름:'홍길동', 나이: 23 } 형태입니다.


자주 혼동되는 출제 포인트

혼동 포인트 1. JavaScript 문자열 따옴표

"점수는 "100" 이다"

이것은 잘못된 문자열입니다.

큰따옴표 안에 큰따옴표를 그대로 쓰면 문자열이 끊깁니다.


혼동 포인트 2. 객체 선언은 { 속성: 값 }

var customer = { 이름:'홍길동', 나이: 23 };

객체는 중괄호와 콜론을 사용합니다.


혼동 포인트 3. 객체에서 =가 아니라 :

틀린 예
{ name = "Kim" }
맞는 예
{ name: "Kim" }

혼동 포인트 4. 배열과 객체 구분

배열
[10, 20, 30]
객체
{ name: "Kim", age: 20 }

배열은 순서 중심, 객체는 속성 이름 중심입니다.


혼동 포인트 5. DOM과 BOM 구분

DOM = HTML 문서 객체 모델
BOM = 브라우저 객체 모델

document는 DOM, window, location, screen, navigator는 BOM 쪽으로 봅니다.


혼동 포인트 6. document는 HTML 문서를 다룹니다

document.getElementById("title")

는 HTML 문서에서 id가 title인 요소를 찾습니다.


혼동 포인트 7. textContent와 innerHTML

textContent = 텍스트만
innerHTML = HTML 태그까지 해석

혼동 포인트 8. addEventListener

btn.addEventListener("click", function() {
    ...
});

표준 이벤트 모델에서 자주 사용합니다.


혼동 포인트 9. submit 이벤트에서 preventDefault

폼 제출을 막고 싶으면
event.preventDefault();

를 사용합니다.


혼동 포인트 10. try-catch

try = 예외 가능 코드
catch = 예외 처리
throw = 예외 발생

이번 절의 핵심 정리

JavaScript

웹페이지에 동작을 넣는 프로그래밍 언어

변수

var x = 10;
let y = 20;
const z = 30;

자료형

number
string
boolean
undefined
null
object
function

문자열

'ABC'
"ABC"
"점수는 '100점' 이다"

큰따옴표 안에서 큰따옴표를 그대로 쓰면 안 됩니다.

조건문

if
switch
삼항 연산자

반복문

while
do~while
for
for in

함수

function add(a, b) {
    return a + b;
}

익명 함수

let f = function() {
    console.log("hello");
};

콜백 함수

button.addEventListener("click", function() {
    alert("click");
});

객체

let customer = {
    name: "Kim",
    age: 23
};

BOM

window
screen
location
navigator
history

DOM

document 객체로 HTML 문서를 조작
대표
document.getElementById()
document.querySelector()
element.textContent
element.innerHTML
element.style.color

이벤트

click
keydown
submit
change
input
focus
blur

예외 처리

try {
    ...
} catch (error) {
    ...
} finally {
    ...
}

핵심 한 문장

이번 절의 핵심을 한 문장으로 정리하면 다음과 같습니다.

JavaScript는 웹페이지의 동작을 담당하며, 객체와 함수를 이용해 로직을 만들고, BOM으로 브라우저를 다루며, DOM으로 HTML 문서의 내용과 스타일을 바꾸고, 이벤트를 통해 사용자의 클릭·입력·키보드 동작에 반응합니다.
더 짧게
JavaScript = 동작
BOM = 브라우저 조작
DOM = HTML 문서 조작
이벤트 = 사용자 행동 처리
예외 처리 = 오류를 안전하게 처리

확인 문제

문제 1

JavaScript의 역할로 가장 알맞은 것은?

① 웹페이지의 동작을 담당합니다 ② CPU 명령어를 직접 해석합니다 ③ HTML 태그만 정의합니다 ④ 디스크 스케줄링을 수행합니다


문제 2

다음 중 JavaScript 변수 선언 키워드가 아닌 것은?

varletconstint


문제 3

다음 중 JavaScript 문자열로 올바르지 않은 것은?

'ABC'"ABC""점수는 '100점' 입니다""점수는 "100점" 입니다"


문제 4

값과 자료형까지 엄격하게 비교하는 연산자는?

======!=


문제 5

JavaScript의 조건문으로 보기 어려운 것은?

ifswitch ③ 삼항 연산자 ④ struct


문제 6

객체의 속성을 순회할 때 자주 사용하는 반복문은?

for ingotorepeat caseforeach struct


문제 7

다음 함수의 출력 결과는?

function add(a, b) {
    return a + b;
}

console.log(add(3, 5));

① 3 ② 5 ③ 8 ④ 35


문제 8

다른 함수에 인수로 전달되어 나중에 실행되는 함수는?

① 콜백 함수 ② 생성자 버스 ③ 페이지 함수 ④ 주소 함수


문제 9

함수가 자신이 만들어진 환경의 변수를 기억하는 성질은?

① 클로저 ② 세마포어 ③ 캐시 미스 ④ 교착상태


문제 10

사용자에게 알림창을 띄우는 기본 함수는?

prompt()alert()parseInt()querySelector()


문제 11

다음 중 JavaScript 객체 선언으로 알맞은 것은?

var customer = { 이름:'홍길동', 나이: 23 };var customer = { 이름='홍길동', 나이=23 };var customer = [ 이름:'홍길동', 나이: 23 ];var customer = [ 이름='홍길동', 나이=23 ];


문제 12

객체의 속성에 접근하는 표현으로 알맞은 것은?

let student = { name: "Kim", score: 90 };

student.namestudent->namestudent:namestudent#name


문제 13

BOM의 의미로 알맞은 것은?

① 브라우저 객체 모델 ② 이진 객체 메모리 ③ 블록 오버플로 모델 ④ 기본 운영체제 모듈


문제 14

현재 페이지 주소 정보를 다루는 BOM 객체는?

locationscreennavigatorMath


문제 15

DOM의 의미로 알맞은 것은?

① 문서 객체 모델 ② 디스크 운영 모델 ③ 데이터 오버플로 모델 ④ 동적 운영 메모리


문제 16

id가 title인 HTML 요소를 찾는 코드로 알맞은 것은?

document.getElementById("title")window.getId("title")screen.find("title")navigator.title("title")


문제 17

DOM 요소의 텍스트만 바꾸는 속성은?

textContentinnerStylehrefOnlyeventKey


문제 18

표준 이벤트 모델에서 이벤트 리스너를 등록할 때 사용하는 메소드는?

addEventListener()addStyle()setHTML()openEvent()


문제 19

폼 제출 이벤트에서 기본 제출 동작을 막을 때 사용하는 메소드는?

preventDefault()stopHTML()blockSubmitOnly()removeForm()


문제 20

JavaScript 예외 처리에 사용하는 구문은?

try-catchif-casefor-switchhtml-css


정답과 해설은 절별 확인문제 정답해설에서 확인합니다.

다음 7장 1절은 전체 통합 복습과 시험형 문제풀이입니다. 마지막 절에서는 8과목을 따로 보지 않고, 진법·논리·C·자료구조·컴퓨터구조·운영체제·객체지향·웹을 시험 포인트 중심으로 한 번에 묶어서 정리합니다.

목차

이번 절의 큰 그림
JavaScript 기본
JavaScript란?
HTML, CSS, JavaScript 역할 다시 비교
JavaScript 작성 위치
HTML 태그 안에 직접 작성
script 태그 안에 작성
외부 JavaScript 파일 사용
변수와 자료형
변수란?
var, let, const 차이
JavaScript 자료형
typeof
문자열
문자열 따옴표 주의
템플릿 문자열
연산자
산술 연산자
비교 연산자
논리 연산자
제어문
조건문 if
switch문
삼항 연산자
반복문 while
do~while
for문
for in
함수
함수란?
일반 함수
return
익명 함수
화살표 함수
가변 인자 함수
콜백 함수
클로저
기본 내장 함수: alert, prompt
alert
prompt
객체
객체란?
객체 선언 문법
객체 속성 접근
점 표기법
대괄호 표기법
객체 메소드
객체 속성 추가와 제거
생성자 함수
기본 내장 객체
BOM
BOM이란?
window 객체
screen 객체
location 객체
navigator 객체
DOM
DOM이란?
document 객체
DOM 내용 변경
DOM 스타일 변경
DOM 요소 생성
이벤트
이벤트란?
이벤트 처리 방법 1: HTML 속성
이벤트 처리 방법 2: 고전 이벤트 모델
이벤트 처리 방법 3: 표준 이벤트 모델
이벤트 객체
마우스 이벤트
키보드 이벤트
입력 양식 이벤트
페이지 로드 이벤트
이벤트 전파 맛보기
예외 처리
예외란?
try-catch
throw
finally
예제 문제
JavaScript 전체 예제
시험 예시형 문제 1: 문자열
시험 예시형 문제 2: 객체 선언
자주 혼동되는 출제 포인트
혼동 포인트 1. JavaScript 문자열 따옴표
혼동 포인트 2. 객체 선언은 { 속성: 값 }
혼동 포인트 3. 객체에서 =가 아니라 :
혼동 포인트 4. 배열과 객체 구분
혼동 포인트 5. DOM과 BOM 구분
혼동 포인트 6. document는 HTML 문서를 다룹니다
혼동 포인트 7. textContent와 innerHTML
혼동 포인트 8. addEventListener
혼동 포인트 9. submit 이벤트에서 preventDefault
혼동 포인트 10. try-catch
이번 절의 핵심 정리
JavaScript
변수
자료형
문자열
조건문
반복문
함수
익명 함수
콜백 함수
객체
BOM
DOM
이벤트
예외 처리
핵심 한 문장
확인 문제
문제 1
문제 2
문제 3
문제 4
문제 5
문제 6
문제 7
문제 8
문제 9
문제 10
문제 11
문제 12
문제 13
문제 14
문제 15
문제 16
문제 17
문제 18
문제 19
문제 20