[모던 자바스크립트 Deep Dive] - 1장 정리

2026. 3. 11. 23:03Book Review

반응형

1. 프로그래밍과 문제 해결 능력

프로그래밍에서 가장 중요한 능력 중 하나는 문제 해결 능력이다.
일부 사람들은 문제 해결 능력을 단순히 알고리즘 능력과 동일하게 생각하지만, 실제로는 그보다 더 넓은 개념이다.

알고리즘은 문제 해결을 위한 절차나 방법을 의미하지만, 문제 해결 능력은 다음과 같은 과정을 포함한다.

  1. 문제를 정확하게 이해한다.
  2. 해결 방법을 설계한다.
  3. 이를 컴퓨터가 이해할 수 있도록 표현한다.

즉, 문제를 분석하고 해결 방안을 설계하는 능력 전체가 문제 해결 능력이다.


2. 프로그래밍이란 무엇인가

프로그래밍은 결국 다음 과정을 수행하는 것이다.

  1. 사람이 이해하는 요구사항
  2. 컴퓨터가 이해할 수 있는 형태로 변환하는 과정

컴퓨터는 사람의 언어를 이해하지 못하기 때문에, 개발자는 요구사항을 프로그래밍 언어로 표현해야 한다.

예를 들어 다음과 같은 요구사항이 있다고 가정하자.

요구사항

두 숫자를 더해서 결과를 출력한다

이를 자바스크립트 코드로 표현하면 다음과 같다.

const a = 10;
const b = 20;

const result = a + b;

console.log(result);

여기서 개발자가 한 일은 다음과 같다.

  1. 문제를 이해했다. (두 숫자를 더한다)
  2. 해결 방법을 설계했다. (덧셈 연산)
  3. 이를 자바스크립트 코드로 표현했다.

3. 컴퓨터가 코드를 이해하는 과정

개발자가 작성한 코드는 그대로 컴퓨터가 이해할 수 있는 것은 아니다.
중간에 번역 과정이 필요하다.

이때 사용하는 것이 다음과 같은 프로그램이다.

  • 컴파일러
  • 인터프리터

컴파일러

컴파일러는 전체 코드를 한 번에 번역해서 실행 가능한 코드로 변환한다.

대표적인 언어

  • C
  • C++

작동 과정

소스 코드 → 컴파일 → 실행 파일 → 실행

인터프리터

인터프리터는 코드를 한 줄씩 읽어가며 바로 실행한다.

대표적인 언어

  • JavaScript
  • Python

작동 과정

소스 코드 → 인터프리터 → 한 줄씩 실행

자바스크립트는 기본적으로 인터프리터 방식으로 동작하는 언어다.
(실제로는 현대 엔진에서 JIT 컴파일도 사용하지만 개념적으로는 인터프리터 언어로 분류된다.)

 

JIT(Just-In-Time) 컴파일

  • 프로그램 실행 시점(Runtime)에 코드를 기계어로 컴파일하는 기술
  • 인터프리터 언어의 느린 실행 속도를 개선하기 위해 사용됨
  • 자주 실행되는 코드를 실행 중에 기계어로 컴파일하여 이후 실행 속도를 높임
  • node.js에서도 사용됨 

4. 문법적으로는 맞지만 의미적으로 틀린 코드

자바스크립트는 동적 타입 언어이다.
따라서 변수에 어떤 타입의 값이든 할당할 수 있다.

예를 들어 다음 코드를 보자.

let number = "10";

이 코드는 문법적으로는 전혀 문제가 없다.

하지만 의미적으로는 적절하지 않을 수 있다.

왜냐하면 변수 이름이 number인데 실제 값은 문자열이기 때문이다.

즉,

변수 이름 → number
실제 값 → 문자열

이 경우 코드를 읽는 사람에게 혼란을 줄 수 있다.

더 올바른 코드는 다음과 같다.

let number = 10;

또는 문자열이라면 변수 이름을 명확하게 바꿔야 한다.

let numberString = "10";

5. 왜 이런 문제가 생기는가 

Q1. 왜 자바스크립트에서는 이런 코드가 허용될까?

그 이유는 자바스크립트가 동적 타입 언어이기 때문이다.

동적 타입 언어에서는 변수의 타입이 선언 시점이 아니라 실행 시점에 결정된다.

예시

let value = 10;       // number
value = "hello";      // string
value = true;         // boolean

하나의 변수에 여러 타입의 값이 들어갈 수 있다.

이것이 가능한 이유는 변수에 타입이 있는 것이 아니라 값에 타입이 있기 때문이다.

정적 타입 언어
변수 → 타입을 가짐

동적 타입 언어
값 → 타입을 가짐

Q2. 그렇다면 이런 자유로움이 항상 좋은가?

장점

  • 유연한 코드 작성 가능
  • 빠른 개발 가능

단점

  • 타입 실수 발생 가능
  • 런타임 오류 증가

예시

let number = "10";
let result = number + 5;

console.log(result);

결과

105

왜냐하면 자바스크립트는 문자열과 숫자를 더하면 문자열 결합을 수행하기 때문이다.


Q3. 왜 문자열 결합이 발생할까?

자바스크립트의 + 연산자는 두 가지 역할을 한다.

  1. 숫자 덧셈
  2. 문자열 결합

연산 과정에서 문자열이 하나라도 포함되면 문자열 결합이 된다.

예시

10 + 5        // 15
"10" + 5      // "105"
"10" + "5"    // "105"

즉 내부적으로 다음과 같은 일이 발생한다.

"10" + 5
→ 5를 문자열로 변환
→ "10" + "5"
→ "105"

이 과정을 암묵적 타입 변환 (Implicit Coercion) 이라고 한다.

 


6. 프로그래밍의 본질

결국 프로그래밍은 다음 과정을 의미한다.

  1. 요구사항을 분석한다.
  2. 이를 해결할 자료구조와 함수를 설계한다.
  3. 프로그램의 흐름을 제어한다.

정리하면 다음과 같다.

요구사항 분석
↓
자료구조 설계
↓
함수 설계
↓
프로그램 흐름 제어
↓
코드 구현

 

 

요구사항

사용자의 나이를 입력받아 성인인지 판별한다

코드

function isAdult(age) {
  if (age >= 19) {
    return true;
  }
  return false;
}

console.log(isAdult(20)); // true

이 코드에는 다음 요소들이 포함되어 있다.

 

자료구조

age (숫자 데이터)

함수

isAdult()

흐름 제어

if 조건문

 

 

참고 자료

반응형