자바스크립트 함수 기초 - JavaScript 시리즈 #4

자바스크립트 함수 기초

앞선 글에서 변수와 데이터 타입, 조건문과 반복문을 배웠다면, 이번엔 코드를 더 구조화하고 재사용할 수 있게 해주는 함수를 배워볼 거다. 함수는 자바스크립트에서 가장 중요한 개념 중 하나로, 코드를 묶어서 특정 작업을 수행하게 하고 필요할 때마다 호출할 수 있게 해준다. 이걸 잘 익히면 앞으로 복잡한 프로그램도 훨씬 쉽게 짤 수 있다.

내가 처음 코딩을 배울 때 함수를 몰라서 같은 코드를 반복해서 쓰곤 했는데, 함수를 배우고 나니 코드가 간결해지고 유지보수도 쉬워졌다. 이번 글에선 함수의 정의와 선언 방법, 매개변수와 반환값, 스코프와 클로저의 기본적인 개념을 다룰 거다. 천천히 따라오면서 직접 콘솔이나 HTML 파일에서 실행해보면 함수의 힘을 느낄 수 있을 거다. 함수는 단순히 코드를 줄이는 도구를 넘어, 프로그램의 논리를 체계적으로 정리하는 데 핵심적인 역할을 한다.

함수를 배우면 이전에 다뤘던 조건문과 반복문을 더 유연하게 사용할 수 있다. 예를 들어, 특정 조건에 따라 반복 작업을 해야 할 때 함수로 묶어서 호출하면 코드가 훨씬 깔끔해진다. 이번 포스팅에서 함수의 기본부터 실습까지 상세히 다룰 테니, 자바스크립트의 기본기를 한 단계 더 끌어올릴 준비를 하자.

함수란 무엇인가?

함수는 특정 작업을 수행하는 코드 블록을 이름으로 묶어서 필요할 때마다 호출할 수 있게 한 거다. 자바스크립트에서 함수는 코드를 재사용하고, 프로그램을 모듈화하며, 가독성을 높이는 데 필수적이다. 함수 없이 코드를 짜면 같은 작업을 반복해서 작성해야 하고, 나중에 수정할 때도 일일이 찾아 바꿔야 한다. 하지만 함수를 쓰면 한 번 정의해놓고 여러 번 호출할 수 있어서 효율적이다.

예를 들어, 숫자를 더하는 작업을 여러 번 해야 한다고 해보자. 함수 없이 매번 더하기 코드를 쓰는 대신, 함수로 만들어 놓으면 필요할 때마다 호출해서 쓸 수 있다. 이런 방식은 코드를 줄이는 것뿐만 아니라, 실수를 줄이고 유지보수를 쉽게 해준다. 내가 처음 함수를 배울 때 단순히 "코드를 묶는 거구나" 정도로 생각했는데, 쓰다 보니 프로그램의 전체 구조를 잡는 데도 큰 도움이 됐다.

자바스크립트에서 함수는 객체로 취급돼서 변수에 할당하거나, 다른 함수에 전달하거나, 함수에서 반환할 수도 있다. 이런 유연함 때문에 함수는 자바스크립트의 핵심적인 특징 중 하나로 꼽힌다. 이제 함수를 어떻게 정의하고 사용하는지 하나씩 알아보자.

함수 선언 방법

자바스크립트에서 함수를 선언하는 방법은 크게 세 가지가 있다: 함수 선언문, 함수 표현식, 화살표 함수다. 각각의 특징과 사용법을 예제와 함께 살펴보자.

1. 함수 선언문(Function Declaration)

가장 기본적인 함수 선언 방식으로, function 키워드를 사용한다. 구조는 간단하다:

function sayHello() {
    console.log("안녕하세요!");
}
sayHello(); // "안녕하세요!"

위 코드는 sayHello라는 함수를 정의하고 호출한다. 함수 선언문은 코드 어디서든 호출할 수 있는데, 이는 자바스크립트의 호이스팅(Hoisting) 덕분이다. 호이스팅 때문에 함수 선언문은 파일 맨 위로 끌어올려진 것처럼 동작한다:

sayHello(); // "안녕하세요!"
function sayHello() {
    console.log("안녕하세요!");
}

내가 처음 이걸 보고 신기했는데, 함수 선언문은 어디서 호출하든 문제없어서 편리하다. 하지만 나중에 변수 스코프와 관련된 문제를 피하려면 코드 순서를 잘 정리하는 게 좋다.

2. 함수 표현식(Function Expression)

함수를 변수에 할당하는 방식이다. 함수 자체는 이름이 없고(익명 함수), 변수로 호출한다:

const greet = function() {
    console.log("반갑습니다!");
};
greet(); // "반갑습니다!"

함수 표현식은 선언 후에만 호출할 수 있다. 호이스팅이 안 돼서 함수 선언문과 다르게 순서가 중요하다:

greet(); // 에러: greet is not defined
const greet = function() {
    console.log("반갑습니다!");
};

내가 이 방식을 좋아하는 이유는 변수처럼 함수를 관리할 수 있어서 코드가 깔끔해진다는 점이다. 특히 변수 스코프를 명확히 하고 싶을 때 유용하다.

3. 화살표 함수(Arrow Function)

ES6에서 추가된 간결한 선언 방식이다. =>를 사용해서 정의한다:

const sayHi = () => {
    console.log("안녕!");
};
sayHi(); // "안녕!"

화살표 함수는 더 짧고 간단해서 한 줄일 땐 중괄호와 return도 생략할 수 있다:

const double = x => x * 2;
console.log(double(5)); // 10

내가 화살표 함수를 처음 썼을 때 코드가 너무 간결해져서 놀랐다. 특히 짧은 콜백 함수에서 빛을 발한다. 하지만 this 바인딩이 다르게 동작해서 주의해야 한다(나중에 설명).

매개변수와 반환값

함수는 입력(매개변수)을 받아서 작업을 수행하고, 결과를 돌려줄(반환값) 수 있다. 이게 함수의 진짜 힘이다.

매개변수(Parameter)

함수를 호출할 때 전달하는 값을 매개변수로 받는다:

function add(a, b) {
    console.log(a + b);
}
add(3, 5); // 8

매개변수는 여러 개 쓸 수 있고, 기본값도 설정할 수 있다(ES6부터):

function greet(name = "익명") {
    console.log("안녕, " + name + "!");
}
greet("홍길동"); // "안녕, 홍길동!"
greet(); // "안녕, 익명!"

내가 처음 매개변수 배울 때 값을 안 넣으면 에러 나는 줄 알았는데, 기본값 덕분에 유연하게 쓸 수 있다.

반환값(Return Value)

return으로 결과를 돌려준다:

function multiply(a, b) {
    return a * b;
}
let result = multiply(4, 5);
console.log(result); // 20

return을 만나면 함수가 종료되고 값을 반환한다. 내가 처음엔 console.log만 썼는데, return을 쓰니까 함수 결과를 변수에 저장해서 재활용할 수 있었다.

함수 스코프와 변수

함수 안에서 선언한 변수는 함수 스코프를 가진다. 함수 밖에서 접근할 수 없다:

function test() {
    let localVar = "안녕";
    console.log(localVar); // "안녕"
}
test();
console.log(localVar); // 에러: localVar is not defined

하지만 함수 밖 변수는 함수 안에서 접근 가능하다:

let globalVar = "전역";
function test() {
    console.log(globalVar); // "전역"
}
test();

내가 처음 스코프 때문에 변수가 안 보일 때 당황했는데, 이걸 이해하니까 코드가 꼬이는 걸 막을 수 있었다.

클로저의 기본 개념

클로저는 함수가 외부 변수를 기억하는 현상이다. 간단한 예제를 보자:

function outer() {
    let count = 0;
    function inner() {
        count++;
        console.log(count);
    }
    return inner;
}
let counter = outer();
counter(); // 1
counter(); // 2

inner 함수가 count를 기억해서 계속 증가시킨다. 내가 처음 클로저 배울 때 신기했는데, 상태를 유지할 때 유용하다.

실습 예제

함수를 활용한 실습을 해보자:

function calculateGrade(score) {
    if (score >= 90) {
        return "A";
    } else if (score >= 80) {
        return "B";
    } else {
        return "C";
    }
}
console.log(calculateGrade(95)); // "A"
console.log(calculateGrade(85)); // "B"

function printNumbers(n) {
    for (let i = 1; i <= n; i++) {
        console.log(i);
    }
}
printNumbers(3); // 1, 2, 3

이렇게 조건문과 반복문을 함수로 묶으면 재사용성이 높아진다.

주의할 점

함수 안 변수는 외부에서 접근 못 하니 스코프 잘 확인하자. 화살표 함수에서 this가 다르게 동작하니 주의해야 한다. 매개변수 기본값을 설정할 때 순서도 중요하다.

결론

이번 포스팅에서 자바스크립트 함수의 기초를 다뤘다. 함수 선언, 매개변수, 반환값, 스코프, 클로저까지 배웠으니 이제 코드를 더 구조화할 수 있다. 다음 글에선 함수를 더 깊이 파고들어 고급 개념을 알아보자.

자바스크립트 조건문과 반복문 기초 - JavaScript 시리즈 #3

자바스크립트 조건문과 반복문 기초

자바스크립트 100개 포스팅 시리즈의 세 번째 글에 온 걸 환영한다! 앞선 두 번째 글에서 변수와 데이터 타입을 배웠다면, 이번엔 프로그램의 흐름을 제어하는 조건문과 반복문을 배워볼 거다. 코딩에서 조건문은 어떤 조건에 따라 코드를 실행하거나 건너뛰게 하고, 반복문은 코드를 여러 번 실행하게 해준다. 이 두 가지는 프로그래밍의 핵심이라 꼭 익혀두면 좋다.

내가 처음 코딩 배울 때 조건문과 반복문이 제일 헷갈렸던 부분이었는데, 막상 이해하고 나니 코드를 짜는 게 훨씬 재밌어졌다. 이번 글에선 조건문(if, switch)과 반복문(for, while, do-while)의 기본적인 사용법과 실제 예제를 다뤄볼 거다. 천천히 따라오면서 직접 콘솔이나 간단한 HTML 파일에서 쳐보면 감이 올 거다.

조건문이란 무엇인가?

조건문은 프로그램이 특정 조건을 확인해서 그 결과에 따라 다른 코드를 실행하게 하는 거다. 자바스크립트에선 주로 if 문과 switch 문을 쓴다. 조건이 참인지 거짓인지 판단해서 코드를 선택적으로 실행하는 방식인데, 이게 있으면 프로그램이 단순히 위에서 아래로 흐르는 걸 넘어서 상황에 맞게 동작할 수 있다.

예를 들어, 내가 어떤 숫자가 10보다 큰지 확인하고 싶다면 조건문으로 그걸 판단해서 메시지를 띄울 수 있다. 이런 식으로 조건을 걸어서 프로그램의 흐름을 제어하는 게 조건문의 기본 역할이다.

if 문 사용법

if 문은 가장 기본적인 조건문이다. 조건이 참이면 특정 코드를 실행하고, 거짓이면 건너뛴다. 기본 구조는 간단하다:

if (조건) {
    // 조건이 참일 때 실행할 코드
}

조건은 보통 비교 연산자(>, <, ===, !== 등)를 써서 만든다. 예를 들어, 숫자가 10보다 큰지 확인해보자:

let num = 15;
if (num > 10) {
    console.log("숫자가 10보다 크네요!");
}

이 코드를 실행하면 콘솔에 "숫자가 10보다 크네요!"가 출력된다. num이 15니까 조건 num > 10이 참이 돼서 안쪽 코드가 실행된 거다.

조건이 거짓일 때도 뭔가를 하고 싶다면 else를 붙이면 된다:

let num = 5;
if (num > 10) {
    console.log("숫자가 10보다 크네요!");
} else {
    console.log("숫자가 10보다 작거나 같아요.");
}

여기선 num이 5라 조건이 거짓이니까 "숫자가 10보다 작거나 같아요."가 출력된다. 내가 처음 이걸 배울 때 else 없이 쓰다가 조건이 안 맞으면 아무 반응 없어서 당황했는데, else를 쓰니까 훨씬 명확해졌다.

조건이 여러 개라면 else if를 추가할 수 있다:

let num = 7;
if (num > 10) {
    console.log("숫자가 10보다 크네요!");
} else if (num > 5) {
    console.log("숫자가 5보다 크고 10 이하예요.");
} else {
    console.log("숫자가 5 이하예요.");
}

이 경우 num이 7이라 첫 번째 조건(num > 10)은 거짓, 두 번째 조건(num > 5)은 참이니까 "숫자가 5보다 크고 10 이하예요."가 출력된다. else if는 조건을 더 세밀하게 나눌 때 유용하다.

내가 처음 이걸 쓸 때 조건 순서가 중요하다는 걸 몰랐다가 잘못된 결과 나온 적이 있다. 예를 들어, 위 코드에서 num > 5를 먼저 쓰고 num > 10을 나중에 쓰면 11 같은 숫자가 첫 번째 조건에서 걸려서 잘못된 메시지가 나올 수 있다. 조건은 큰 범위에서 작은 범위로 가는 게 안전하다.

switch 문 사용법

switch 문은 if와 비슷하지만, 하나의 값을 여러 경우와 비교할 때 더 깔끔하다. 조건이 아니라 값을 기준으로 분기한다. 기본 구조는 이렇다:

switch (값) {
    case 값1:
        // 값1일 때 실행할 코드
        break;
    case 값2:
        // 값2일 때 실행할 코드
        break;
    default:
        // 아무 값에도 안 맞을 때 실행할 코드
}

예를 들어, 요일을 숫자로 받아서 이름을 출력해보자:

let day = 3;
switch (day) {
    case 1:
        console.log("월요일");
        break;
    case 2:
        console.log("화요일");
        break;
    case 3:
        console.log("수요일");
        break;
    default:
        console.log("알 수 없는 요일");
}

day가 3이라 "수요일"이 출력된다. 여기서 break가 중요한데, 이걸 빼면 조건에 맞은 후에도 다음 case까지 계속 실행된다. 내가 처음 switch 쓸 때 break 안 넣어서 결과가 뒤죽박죽 나왔던 기억이 있다.

default는 모든 case에 안 맞을 때 실행된다. 위 예에서 day가 0이나 8 같은 값이면 "알 수 없는 요일"이 출력된다. ifelse 같은 역할이다.

switch는 값이 명확히 나뉠 때 유용하다. 내가 어떤 프로젝트에서 메뉴 선택 처리할 때 if로 길게 쓰다가 switch로 바꾸니까 코드가 훨씬 간결해졌다.

반복문이란 무엇인가?

반복문은 코드를 여러 번 실행하게 해준다. 같은 작업을 반복할 때마다 매번 쓰지 않고, 조건이나 횟수를 정해서 자동으로 돌리는 거다. 자바스크립트에선 for, while, do-while을 주로 쓴다.

내가 처음 반복문 배울 때 숫자를 1부터 10까지 출력하려면 한 줄씩 써야 하나 고민했는데, 반복문을 알게 되니까 코딩이 훨씬 효율적이 됐다. 반복문이 있으면 시간도 아끼고 코드도 깔끔해진다.

for 문 사용법

for 문은 정해진 횟수만큼 반복할 때 가장 많이 쓴다. 구조는 이렇다:

for (초기값; 조건; 증감식) {
    // 반복할 코드
}

1부터 5까지 숫자를 출력해보자:

for (let i = 1; i <= 5; i++) {
    console.log(i);
}

이 코드는 1, 2, 3, 4, 5를 순서대로 출력한다. 여기서: - let i = 1: 반복 시작 전 초기값 설정. - i <= 5: 조건이 참일 때까지 반복. - i++: 반복마다 i를 1씩 증가.

내가 처음 for 쓸 때 조건을 잘못 설정해서 무한 반복에 빠진 적이 있다. 예를 들어, i <= 5 대신 i >= 0을 쓰고 증감식을 빼면 끝없이 돈다. 조심해야 한다.

for 문은 배열 다룰 때도 유용하다:

let fruits = ["사과", "바나나", "오렌지"];
for (let i = 0; i < fruits.length; i++) {
    console.log(fruits[i]);
}

이건 "사과", "바나나", "오렌지"를 순서대로 출력한다. fruits.length가 3이라 i가 0, 1, 2까지 돈다.

while 문 사용법

while 문은 조건이 참일 때까지 반복한다. 횟수가 정해지지 않았을 때 쓰기 좋다. 구조는 간단하다:

while (조건) {
    // 반복할 코드
}

숫자를 5까지 출력해보자:

let i = 1;
while (i <= 5) {
    console.log(i);
    i++;
}

for 문과 비슷한 결과지만, 초기값과 증감식이 밖에 있다. 내가 while 쓸 때 조건 안에서 변수를 바꾸는 걸 깜빡하면 무한 루프에 걸려서 브라우저가 멈춘 적 있다. 반드시 조건이 언젠가 거짓이 되게 해야 한다.

do-while 문 사용법

do-while 문은 while과 비슷하지만, 코드를 먼저 한 번 실행한 뒤 조건을 확인한다:

do {
    // 반복할 코드
} while (조건);

예를 들어:

let i = 1;
do {
    console.log(i);
    i++;
} while (i <= 5);

이건 while과 똑같이 1부터 5까지 출력한다. 차이점은 조건이 거짓이어도 최소 한 번은 실행된다는 거다:

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

여기선 i가 10이라 조건이 처음부터 거짓인데도 10이 한 번 출력된다. 내가 처음 이걸 쓸 때 조건 확인 시점이 달라서 혼란스러웠는데, 특정 상황에서 유용하다.

반복문 제어: break와 continue

반복문을 중간에 멈추거나 건너뛰고 싶을 때 breakcontinue를 쓴다.

break: 반복문을 완전히 종료한다:

for (let i = 1; i <= 10; i++) {
    if (i === 6) {
        break;
    }
    console.log(i);
}

이건 1부터 5까지만 출력하고 6에서 멈춘다. 내가 반복문 테스트할 때 조건 맞으면 멈추게 하고 싶을 때 자주 썼다.

continue: 현재 반복을 건너뛰고 다음으로 간다:

for (let i = 1; i <= 5; i++) {
    if (i === 3) {
        continue;
    }
    console.log(i);
}

이건 1, 2, 4, 5가 출력된다. 3에서 continue가 실행돼서 그 반복만 건너뛴다.

실습 예제

간단한 실습으로 조건문과 반복문을 합쳐보자:

let score = 85;
if (score >= 90) {
    console.log("A 등급");
} else if (score >= 80) {
    console.log("B 등급");
} else {
    console.log("C 등급 이하");
}

for (let i = 1; i <= 10; i++) {
    if (i % 2 === 0) {
        console.log(i + "는 짝수");
    }
}

위 코드는 점수를 등급으로 나누고, 1부터 10까지 짝수만 출력한다. 실행하면 "B 등급"과 짝수(2, 4, 6, 8, 10)가 나온다.

주의할 점

무한 반복에 빠지지 않게 조건을 잘 확인하자. breakcontinue를 잘못 쓰면 흐름이 꼬일 수 있다.

결론

이번 포스팅에서 조건문과 반복문의 기초를 다뤘다. ifswitch로 조건을 제어하고, for, while, do-while로 반복을 다뤘다. 다음엔 함수를 배워서 코드를 더 구조화해보자.

자바스크립트 변수와 데이터 타입 기초 - JavaScript 시리즈 #2

자바스크립트 변수와 데이터 타입 기초

JavaScript Logo

자바스크립트 100개 포스팅 시리즈의 두 번째 글에 온 걸 환영한다! 첫 번째 글에서 자바스크립트가 뭔지, 어디에 쓰이는지, 왜 중요한지 알아봤다면, 이번엔 실질적인 첫걸음을 내딛는다. 자바스크립트에서 변수를 선언하고 사용하는 방법, 그리고 데이터 타입의 기초를 다룰 거다. 코딩의 기본 중 기본이라 이걸 이해하면 앞으로 훨�ın 수월해진다.

변수는 데이터를 담는 상자 같은 거고, 데이터 타입은 그 상자에 담길 내용물의 종류다. 초보자든 좀 해본 사람이든, 이 기본기를 잘 다져놓으면 자바스크립트를 자유롭게 다룰 수 있다. 천천히 따라오면서 코드도 직접 쳐보면 좋다. 브라우저 콘솔이나 간단한 HTML 파일에서 테스트해보면서 배우자!

변수란 무엇인가?

Variable Declaration Example

변수는 데이터를 저장하고 나중에 꺼내 쓸 수 있게 이름을 붙인 거다. 자바스크립트에선 변수를 선언할 때 var, let, const라는 세 가지 키워드를 쓴다. 각각 쓰임새가 다르니까 하나씩 알아보자.

변수 선언 방법

var: 옛날부터 쓰이던 변수 선언 방식이다. 범위(scope)가 함수 단위로 적용되고, 같은 이름으로 여러 번 선언해도 에러 안 난다. 근데 이게 문제가 될 때가 많아서 요즘은 잘 안 쓴다. 예를 들면:

var name = "홍길동";
console.log(name); // "홍길동"
var name = "이순신"; // 다시 선언해도 문제없음
console.log(name); // "이순신"

내가 처음 var 썼을 땐 편했는데, 나중에 코드 꼬이는 걸 보고 놀랐다.

let: ES6에서 나온 현대적인 변수 선언법이다. 블록 범위(block scope)를 따르고, 같은 이름으로 재선언은 안 된다. 값은 바꿀 수 있다.

let age = 25;
console.log(age); // 25
age = 30; // 값 변경 가능
console.log(age); // 30
// let age = 35; // 이건 에러남 (재선언 불가)

요즘 내가 변수 쓸 때 주로 let을 쓴다. 범위 명확해서 안전하다.

const: 상수를 선언할 때 쓴다. 블록 범위고, 선언 후 값 변경도 재선언도 안 된다. 근데 객체 내부는 수정 가능하다(이건 나중에 설명).

const pi = 3.14;
console.log(pi); // 3.14
// pi = 3.14159; // 에러남 (값 변경 불가)

상수 이름은 보통 대문자(예: PI)로 짓는 관습도 있다.

변수 이름 짓는 규칙도 있다: 영문, 숫자, _, $만 쓴다(숫자로 시작하면 안 됨). CamelCase(예: myName)로 쓰는 게 일반적이다. 의미 있는 이름을 붙인다(x 대신 userName).

변수 스코프

Scope Diagram

변수 스코프는 변수가 어디까지 유효한지를 말한다. 자바스크립트엔 두 가지 스코프가 있다.

함수 스코프(Function Scope): var로 선언한 변수는 함수 안에서만 유효하다.

function test() {
    var x = 10;
    console.log(x); // 10
}
test();
console.log(x); // 에러남 (x is not defined)

블록 스코프(Block Scope): letconst는 블록(if, for 등) 안에서만 유효하다.

if (true) {
    let y = 20;
    console.log(y); // 20
}
console.log(y); // 에러남 (y is not defined)

내가 처음 스코프 배울 때 헷갈렸는데, 블록 스코프가 더 직관적이다.

데이터 타입이란?

Data Types Table

자바스크립트엔 여러 데이터 타입이 있다. 변수에 담을 수 있는 값의 종류를 말한다. 크게 원시 타입(Primitive)과 객체 타입(Object)으로 나뉜다. 먼저 원시 타입부터 보자.

원시 데이터 타입과 비원시 데이터 타입

Primitive vs Non-Primitive

숫자(Number): 정수든 소수든 숫자는 다 Number 타입이다. 계산하거나 크기 비교할 때 쓴다.

let height = 175.5;
let count = 10;
console.log(height + count); // 185.5

특이한 값으로 NaN(Not a Number), Infinity, -Infinity도 있다.

Number Types

문자열(String): 텍스트 데이터다. 따옴표('")로 감싼다.

let greeting = "안녕하세요";
let name = '홍길동';
console.log(greeting + ", " + name); // "안녕하세요, 홍길동"

불리언(Boolean): 참(true) 또는 거짓(false)만 있다.

let isAdult = true;
console.log(isAdult); // true

undefined: 변수 선언했는데 값이 없는 상태다.

let something;
console.log(something); // undefined

null: 의도적으로 "없음"을 나타낸다.

let empty = null;
console.log(empty); // null
Null Undefined

심볼(Symbol): ES6에서 추가된 타입으로, 고유한 식별자를 만든다.

let sym1 = Symbol("id");
let sym2 = Symbol("id");
console.log(sym1 === sym2); // false

객체(Object): 여러 데이터를 하나로 묶는다.

let person = {
    name: "홍길동",
    age: 25
};
console.log(person.name); // "홍길동"

배열과 함수도 객체 타입에 속한다.

타입 확인하기

데이터 타입을 확인하려면 typeof 연산자를 쓴다:

console.log(typeof 42); // "number"
console.log(typeof "hello"); // "string"
console.log(typeof true); // "boolean"
console.log(typeof undefined); // "undefined"
console.log(typeof null); // "object" (버그지만 남아있음)

타입 변환

Type Conversion

자바스크립트는 암묵적으로 타입을 바꾼다:

console.log("5" + 3); // "53"
console.log("5" - 3); // 2

명시적 변환도 가능하다:

let num = Number("123");
console.log(num); // 123

실습

Console Log

간단한 실습으로 해보자:

let name = "홍길동";
const age = 25;
let hobbies = ["축구", "게임"];
console.log(name, age, hobbies);

주의할 점

변수 선언 안 하면 전역 변수로 간다. 타입 변환 주의하자.

결론

JavaScript Ecosystem

이번 포스팅에서 자바스크립트 변수와 데이터 타입을 다뤘다. 다음엔 조건문과 반복문을 배워보자.

 

JavaScript 소개: 그것이 무엇이며 왜 중요한가

자바스크립트 100개 포스팅 시리즈의 첫 번째 글에 온 걸 환영한다! 이 글에선 자바스크립트가 무엇인지, 그 역사, 어디에 사용되는지, 브라우저에서 어떻게 작동하는지, 왜 배워야 하는지, 그리고 추가로 공부할 수 있는 자원들을 소개하려고 한다.

자바스크립트는 웹 개발의 핵심이고, 단순히 웹을 넘어선 다양한 분야에서도 활용된다. 이 글을 통해 자바스크립트의 전반적인 모습을 파악하고, 앞으로의 포스팅에서 더 깊이 들어갈 준비를 하자. 자바스크립트는 프로그래밍을 처음 접하는 사람에게도 친근한 언어로, 배우기 시작하면 그 가능성에 놀라게 될 거다.

자바스크립트란 무엇인가?

자바스크립트는 고급 해석형 프로그래밍 언어로, 주로 웹에서 클라이언트 측 스크립팅에 사용된다. 웹 페이지에서 버튼을 누르면 색상이 바뀌거나, 양식을 제출하기 전에 입력값을 확인하거나, 애니메이션을 추가하는 등의 동적인 기능을 구현한다. 하지만 그 역할은 웹을 훨씬 넘어섰다. Node.js를 통해 서버 측 프로그래밍이 가능하고, React Native로 모바일 앱을, Electron으로 데스크톱 앱을 만들 수 있다.

이 언어는 고급 언어다. 즉, 메모리 관리나 포인터 같은 저수준 세부 사항을 신경 쓰지 않아도 된다. 컴파일 과정 없이 브라우저나 Node.js 같은 환경에서 바로 실행되기 때문에 빠르게 테스트하고 수정할 수 있다. 또 자바스크립트는 프로토타입 기반 언어인데, 클래스 기반 상속 대신 프로토타입을 통해 객체를 생성한다. 이 방식 덕분에 더 유연하고 동적인 코드를 짤 수 있다.

문법적으로는 C 언어 계열(예: C, Java, C++)과 비슷한 느낌이 있지만, 자바스크립트만의 독특한 특징이 있다. 예를 들어, 변수 선언에 var, let, const를 사용하고, 함수는 function 키워드로 정의하거나 화살표 함수(=>)로 간결하게 쓴다. 이런 점들이 처음엔 낯설 수 있지만, 익숙해지면 꽤 편리하다. 다른 언어와 비교하면, Python처럼 간결함을 지향하면서도 Java처럼 구조적인 면을 어느 정도 유지한다.

자바스크립트의 역사

자바스크립트는 1995년 브렌던 아이크(Brendan Eich)가 넷스케이프 커뮤니케이션스에서 만들었다. 처음 이름은 "LiveScript"였는데, 당시 Java가 시장에서 큰 인기를 끌자 마케팅 전략으로 "JavaScript"로 이름을 바꾼다. 사실 Java와는 아무런 관련이 없다. 이 이름 때문에 오해도 많았지만, 결국 웹 개발의 필수 언어로 자리 잡았다.

1997년, 자바스크립트는 ECMA International에 의해 ECMAScript라는 이름으로 표준화된다. 이후 ECMAScript는 자바스크립트의 공식 명세가 되었고, 버전이 올라가며 계속 발전한다. 주요 마일스톤을 보면:

- ES3 (1999): 기본적인 문법과 기능 강화.

- ES5 (2009): JSON 지원, 엄격 모드(strict mode) 추가로 안정성 높아진다.

- ES6 (2015, aka ES2015): 클래스, 화살표 함수, 프로미스, 모듈 등 현대적인 기능 대거 도입.

- 이후 매년 업데이트(ES2016, ES2017 등): async/await, 스프레드 연산자 등 추가.

ES6는 특히 큰 전환점이었다. 내가 처음 자바스크립트를 접했을 때 ES5만 썼는데, ES6의 화살표 함수와 let/const를 쓰니까 코드가 훨씬 깔끔해졌다. 또 2009년 Node.js가 나오면서 자바스크립트는 서버 측에서도 쓰이기 시작한다. 요즘은 React, Angular, Vue.js 같은 프레임워크 덕에 프론트엔드 개발의 중심이 됐다. 역사적으로 보면, 자바스크립트는 웹의 성장과 함께 계속 진화해온 언어라고 할 수 있다.

자바스크립트는 어디에 사용되나?

자바스크립트는 다재다능한 언어로, 여러 분야에서 활용된다. 내가 아는 주요 사용 사례를 정리해보면:

1. 웹 개발:

자바스크립트는 웹 페이지의 동적인 부분을 책임진다. 예를 들어, 소셜 미디어에서 "좋아요" 버튼을 누르면 즉시 숫자가 올라가는 건 자바스크립트가 처리한다. 양식 제출 전 입력값 확인, 스크롤 시 애니메이션 효과, 실시간 채팅 같은 기능도 다 자바스크립트 덕이다. 내가 처음 만든 웹 페이지에서 버튼 클릭으로 텍스트 색을 바꿨을 때 그 간단함에 놀랐다.

2. 서버 측 프로그래밍:

Node.js 덕분에 자바스크립트는 서버에서도 동작한다. LinkedIn, Uber, Netflix 같은 대기업이 백엔드를 Node.js로 돌린다. 예전에 간단한 API 서버를 만들어 봤는데, 웹 개발과 같은 언어를 쓰니까 배우기 쉬웠다.

3. 모바일 앱 개발:

React Native를 사용하면 자바스크립트로 iOS와 안드로이드용 네이티브 앱을 만들 수 있다. Facebook, Instagram, Airbnb 같은 앱이 React Native로 개발됐다. 모바일 개발은 아직 손대지 않았지만, 나중에 취미로 해볼 계획이다.

4. 데스크톱 앱 개발:

Electron이라는 프레임워크로 자바스크립트, HTML, CSS를 활용해 데스크톱 앱을 제작한다. Visual Studio Code, Slack, Discord가 대표적이다. 내가 쓰는 코드 편집기도 자바스크립트 기반이라니 신기하다.

5. 기타 사용 사례:

- 게임 개발: Phaser나 Pixi.js로 브라우저 기반 게임을 만든다. 간단한 2D 게임 정도는 금방 배울 수 있다.

- 데이터 시각화: D3.js나 Highcharts로 인터랙티브 차트를 구현한다. 회사에서 데이터 보여줄 때 써보고 싶다.

- IoT: 자바스크립트로 스마트 기기를 제어한다. 예를 들어, Raspberry Pi에서 실행 가능하다.

이 정도로 보면 자바스크립트는 거의 어디든 쓰인다. 웹에서 시작했지만 이제는 풀스택 개발, 모바일, 데스크톱, 심지어 사물인터넷까지 커버한다.

브라우저에서 자바스크립트는 어떻게 작동하나?

자바스크립트가 브라우저에서 어떻게 돌아가는지 이해하면 웹 개발이 훨씬 쉬워진다. 기본적인 작동 과정을 단계별로 풀어보면:

1. HTML 파싱 및 DOM 구축:

웹 페이지를 열면 브라우저는 먼저 HTML을 다운로드하고 파싱해서 DOM(Document Object Model)을 만든다. DOM은 웹 페이지의 구조를 트리 형태로 표현한 거다.

2. 자바스크립트 로드 및 실행:

<script> 태그를 만나면 브라우저는 자바스크립트 파일을 가져와서 실행한다. V8(Chrome), SpiderMonkey(Firefox) 같은 자바스크립트 엔진이 코드를 해석하고 실행한다.

3. DOM 조작:

자바스크립트는 DOM을 수정해서 페이지 콘텐츠를 동적으로 바꾼다. 예를 들어, 버튼 클릭 시 텍스트를 추가하거나 스타일을 변경한다.

4. 이벤트 루프와 비동기 처리:

자바스크립트는 단일 스레드지만, 이벤트 루프를 통해 비동기 작업(타이머, 서버 요청 등)을 관리한다. setTimeout이나 fetch 같은 함수가 대표적이다.

간단한 예제를 보자. 브라우저 개발자 도구(F12)를 열고 콘솔에서 아래 코드를 실행하면:

<!DOCTYPE html>
<html>
<head>
    <title>My First JavaScript</title>
</head>
<body>
    <h1>Hello, JavaScript!</h1>
    <script>
        console.log("자바스크립트 시작!");
    </script>
</body>
</html>

3초 후 메시지가 출력된다. 이런 식으로 자바스크립트는 브라우저에서 실시간으로 동작한다.

자바스크립트를 왜 배워야 하나?

자바스크립트를 배우는 이유는 많다. 내가 생각하는 주요 이유를 정리하면:

1. 높은 수요:

Stack Overflow Developer Survey 2020에 따르면 자바스크립트는 가장 많이 사용되는 프로그래밍 언어다. 웹 개발자, 풀스택 개발자 등 직업 기회가 많다.

2. 다재다능함:

프론트엔드와 백엔드를 모두 커버한다. Node.js로 서버를, React로 UI를 만들 수 있어서 경력 확장에 좋다. 내가 풀스택을 꿈꾸게 된 것도 이 때문이다.

3. 큰 커뮤니티:

자바스크립트 커뮤니티는 어마어마하다. 온라인 튜토리얼, 포럼, 오픈소스 프로젝트가 넘친다. 질문 있으면 Stack Overflow에서 금방 답을 찾는다.

4. 지속적인 발전:

ECMAScript 표준 덕에 매년 새로운 기능이 추가된다. ES6 이후로 개발이 훨씬 편해졌다. 언어가 계속 현대적으로 유지된다.

5. 재미와 창의성:

애니메이션, 게임, 복잡한 웹 앱을 만들면서 창의력을 발휘할 수 있다. 내가 처음 버튼 클릭으로 색 바꾼 뒤 코딩 재미에 푹 빠졌다.

이 외에도, 자바스크립트는 진입 장벽이 낮다. 브라우저만 있으면 바로 시작할 수 있어서 초보자에게도 추천한다.

추가 학습 자원

자바스크립트를 더 공부하려면 이런 자원을 참고하면 된다:

- MDN Web Docs: 자바스크립트 공식 문서로, 상세하고 정확하다. 내가 모를 때마다 여기서 찾는다.

- W3Schools: 간단한 튜토리얼과 예제가 많다. 입문용으로 좋다.

- FreeCodeCamp: 무료 코딩 챌린지와 프로젝트를 제공한다. 실습하기 딱이다.

- Udemy: 다양한 강의가 있다. 나도 여기서 몇 개 들어봤다.

- Stack Overflow: 질문과 답변이 빠르다. 실무 문제 해결에 유용하다.

시작하기

자바스크립트를 시작하려면 간단한 환경만 준비하면 된다. 브라우저(Chrome, Firefox 등)와 텍스트 편집기(VS Code 추천)가 있으면 충분하다. 첫 코드를 짜보려면 HTML 파일에 아래를 넣고 실행해본다:

<!DOCTYPE html>
<html>
<head>
    <title>My First JavaScript</title>
</head>
<body>
    <h1>Hello, JavaScript!</h1>
    <script>
        console.log("자바스크립트 시작!");
    </script>
</body>
</html>

파일을 브라우저로 열면 콘솔에 메시지가 찍힌다. 여기서부터 시작이다.

오해와 진실

자바스크립트에 대한 오해도 있다.

- "Java와 관련 있다": 이름만 비슷할 뿐, 완전히 다르다.

- "느리다": 초기엔 그랬지만, V8 엔진 같은 최적화로 이제 빠르다.

- "웹만 된다": Node.js로 서버, 앱 개발도 가능하다.

내가 처음엔 "자바스크립트가 쉬운 언어"라고 오해했는데, 깊이 파다 보니 꽤 복잡한 면도 있다.

미래 전망

자바스크립트는 앞으로도 중요하다. 웹어셈블리(WebAssembly)와 통합되며 성능이 더 좋아지고, AI/ML 라이브러리(TensorFlow.js)로 머신러닝까지 확장된다. 내가 볼 때 자바스크립트는 계속 성장할 거다.

최선의 관행

코드를 잘 쓰려면:

- 변수 이름은 의미 있게 짓는다(x 대신 userName).

- 주석으로 코드 설명한다.

- 들여쓰기와 공백으로 가독성 높인다.

개발 도구

추천 도구는:

- VS Code: 확장 기능 많고 가볍다.

- Chrome DevTools: 디버깅에 최고다.

- Node.js: 서버 개발 시작할 때 필수다.

프레임워크와 라이브러리 맛보기

자바스크립트 생태계는 방대하다.

- React: UI 개발에 강력하다.

- Vue.js: 간단하고 직관적이다.

- Angular: 엔터프라이즈 앱에 좋다.

- jQuery: DOM 조작 쉽게 한다(요즘은 덜 쓰인다).

결론

이 포스팅에서 자바스크립트의 기본 개념, 역사, 사용 사례, 브라우저 작동 방식, 학습 이유, 추가 자원을 다뤘다. 앞으로 99개의 글이 더 남았는데, 변수부터 비동기, 프레임워크까지 깊이 파볼 계획이다. 자바스크립트는 단순히 도구가 아니라 창의력을 발휘할 수 있는 언어다.

그럼 두 번째 글 작성하러 가보자.

JavaScript에 대한 100개 포스팅 범주

JavaScript에 대한 100개 포스팅 범주

JavaScript에 대한 100개 포스팅 범주

  • 기초 및 기본 개념: 변수, 데이터 타입, 연산자 등 10개 주제.
  • 문법 및 핵심 개념: 호이스팅, 스코프, 클래스 등 15개 주제.
  • 함수 및 스코프: 클로저, 커링, 메모이제이션 등 10개 주제.
  • 객체 및 프로토타입: 객체 생성, 상속, 프록시 등 10개 주제.
  • 배열 및 컬렉션: 배열 메서드, 타입드 배열 등 5개 주제.
  • 제어 구조: 조건문, 루프, 스위치 문 등 5개 주제.
  • 에러 처리: try-catch, 커스텀 에러, 디버깅 등 5개 주제.
  • 비동기 프로그래밍: 콜백, 프로미스, async/await 등 10개 주제.
  • DOM 및 브라우저 API: DOM 조작, 이벤트 처리, 웹소켓 등 10개 주제.
  • 라이브러리 및 프레임워크: jQuery, React, Node.js 등 5개 주제.
  • 테스트 및 디버깅: 유닛 테스트, DevTools 사용법 등 5개 주제.
  • 성능 최적화: 코드 최적화, 캐싱, 지연 로딩 등 5개 주제.
  • 보안: XSS, CSRF, HTTPS 등 5개 주제.
  • 최선의 관행: 코딩 표준, 모듈화, 버전 관리 등 5개 주제.
  • 고급 주제: 함수형 프로그래밍, 웹어셈블리, 리액티브 프로그래밍 등 10개 주제.

주제별 설명

기초 및 기본 개념: JavaScript의 기본 문법과 도구 설정. 예를 들어, 변수 선언, 데이터 타입, 연산자, 루프, 함수 등이 포함.

문법 및 핵심 개념: 호이스팅, 스코프, 클래스, 모듈 등 JavaScript의 고유한 동작 방식

함수 및 스코프: 클로저, 커링, 메모이제이션 등 함수 관련 고급 주제.

객체 및 프로토타입: 객체 생성, 프로토타입 상속, 프록시 등 객체 지향 프로그래밍 개념

배열 및 컬렉션: 배열 메서드, Set, Map, 타입드 배열 등 컬렉션 관련 주제

제어 구조: 조건문, 루프, 스위치 문 등 프로그램 흐름 제어 방법

에러 처리: 예외 처리, 커스텀 에러, 디버깅 기법 등

비동기 프로그래밍: 콜백, 프로미스, async/await, 이벤트 루프 등 비동기 처리 방법

DOM 및 브라우저 API: DOM 조작, 이벤트 처리, 브라우저 스토리지, 웹소켓 등 클라이언트 측 기능

라이브러리 및 프레임워크: jQuery, React, Angular, Node.js 등 인기 있는 도구와 프레임워크

테스트 및 디버깅: 유닛 테스트, DevTools 사용, TDD 등 품질 보증 방법

성능 최적화: 코드 최적화, 캐싱, 지연 로딩 등 성능 개선 기법

보안: XSS, CSRF, HTTPS 등 웹 보안 문제

최선의 관행: 코딩 표준, 모듈화, 버전 관리 등 개발 프로세스 최적화

고급 주제: 함수형 프로그래밍, 웹어셈블리, 리액티브 프로그래밍 등 최신 기술

범주 예시 주제 개수
기초 및 기본 개념 변수와 데이터 타입 10
문법 및 핵심 개념 호이스팅, 스코프 15
함수 및 스코프 클로저, 커링 10
객체 및 프로토타입 객체 생성, 상속 10
배열 및 컬렉션 배열 메서드, Set 5
제어 구조 조건문, 루프 5
에러 처리 try-catch, 디버깅 5
비동기 프로그래밍 프로미스, async/await 10
DOM 및 브라우저 API DOM 조작, 웹소켓 10
라이브러리 및 프레임워크 jQuery, React 5
테스트 및 디버깅 유닛 테스트, DevTools 5
성능 최적화 캐싱, 지연 로딩 5
보안 XSS, HTTPS 5
최선의 관행 코딩 표준, 모듈화 5
고급 주제 웹어셈블리, 리액티브 프로그래밍 10

오랜만에 하는 블로그 포스팅.

꾸준히 해보는걸로...!

+ Recent posts