자바스크립트
웹 브라우저에서 동적인 기능을 구현하기 위해 만들어진 인터프리터 기반의 동적 타입 프로그래밍 언어로, 현재는 브라우저뿐 아니라 서버(Node.js), 모바일, 데스크톱 등 다양한 환경에서 사용됩니다.
핵심 특징
| 항목 | 내용 |
| 개발자 | Brendan Eich (1995년, Netscape) |
| 표준 | ECMAScript (ECMA-262) |
| 타입 시스템 | 동적 타입 (런타임에 타입 결정) |
| 실행 방식 | 인터프리터 + JIT 컴파일 |
| 패러다임 | 멀티 패러다임 (객체지향, 함수형, 이벤트 기반) |
| 실행 환경 | 브라우저 (V8, SpiderMonkey), 서버 (Node.js) |
JavaScript의 위치
웹 기술 3요소:
HTML → 구조 (뼈대) "무엇을 보여줄 것인가"
CSS → 표현 (디자인) "어떻게 보여줄 것인가"
JS → 동작 (기능) "어떻게 동작할 것인가"
JavaScript 실행 환경:
┌──────────────────────────────────────┐
│ 브라우저 (Chrome, Firefox) │
│ ┌─────────────┐ ┌───────────────┐ │
│ │ JS 엔진 │ │ Web API │ │
│ │ (V8 등) │ │ (DOM, fetch, │ │
│ │ │ │ setTimeout) │ │
│ └─────────────┘ └───────────────┘ │
└──────────────────────────────────────┘
┌──────────────────────────────────────┐
│ 서버 (Node.js) │
│ ┌─────────────┐ ┌───────────────┐ │
│ │ V8 엔진 │ │ Node API │ │
│ │ │ │ (fs, http, │ │
│ │ │ │ net, crypto)│ │
│ └─────────────┘ └───────────────┘ │
└──────────────────────────────────────┘
주요 특징 상세
1. 동적 타입
let x = 10; // number
x = "hello"; // string으로 변경 가능
x = true; // boolean으로 변경 가능
x = { name: "홍길동" }; // object로 변경 가능
// 타입이 런타임에 결정 → 유연하지만 버그 가능성
console.log(1 + "2"); // "12" (암묵적 타입 변환)
console.log(true + 1); // 2
console.log(null + 1); // 1
2. 함수가 일급 객체 (First-Class Function)
// 변수에 할당
const greet = function(name) {
return `안녕 ${name}`;
};
// 함수의 인자로 전달
function execute(fn, value) {
return fn(value);
}
execute(greet, "홍길동"); // "안녕 홍길동"
// 함수가 함수를 반환
function multiplier(factor) {
return function(num) {
return num * factor;
};
}
const double = multiplier(2);
double(5); // 10
3. 프로토타입 기반 객체지향
// Java: 클래스 기반 상속
// JavaScript: 프로토타입 체인 기반 상속
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
return `${this.name} makes a sound`;
};
function Dog(name) {
Animal.call(this, name);
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.bark = function() {
return `${this.name} barks`;
};
// ES6 class 문법 (내부적으로는 여전히 프로토타입)
class Cat extends Animal {
meow() {
return `${this.name} meows`;
}
}
4. 비동기 처리
// 1. 콜백
setTimeout(function() {
console.log("1초 후 실행");
}, 1000);
// 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 (Promise의 문법적 설탕)
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);
}
}
5. 이벤트 루프 (Single Thread + Non-Blocking)
JavaScript는 싱글 스레드이지만, 이벤트 루프로 비동기 처리
┌──────────────────────────────────────┐
│ Call Stack (LIFO) │
│ 현재 실행 중인 함수 │
└──────────────┬───────────────────────┘
│
▼ 비동기 작업 발생 시
┌──────────────────────────────────────┐
│ Web API / Node API │
│ (setTimeout, fetch, I/O 등) │
│ 백그라운드에서 처리 │
└──────────────┬───────────────────────┘
│ 완료 시 콜백을 큐에 등록
▼
┌──────────────────────────────────────┐
│ Task Queue (FIFO) │
│ 실행 대기 중인 콜백 │
└──────────────┬───────────────────────┘
│
▼
┌──────────────────────────────────────┐
│ 이벤트 루프 │
│ "Call Stack이 비었으면 │
│ Task Queue에서 꺼내서 실행" │
└──────────────────────────────────────┘
console.log("1");
setTimeout(() => {
console.log("2");
}, 0);
console.log("3");
// 출력 순서: 1 → 3 → 2
// setTimeout 콜백은 Call Stack이 비어야 실행됨
Java vs JavaScript
| 항목 | Java | JavaScript |
| 타입 | 정적 타입 (컴파일 시 확인) | 동적 타입 (런타임에 결정) |
| 실행 환경 | JVM | 브라우저 / Node.js |
| 컴파일 | 바이트코드 → JVM 실행 | 인터프리터 + JIT |
| 스레딩 | 멀티 스레드 | 싱글 스레드 + 이벤트 루프 |
| 객체지향 | 클래스 기반 | 프로토타입 기반 |
| 용도 | 백엔드, 안드로이드, 엔터프라이즈 | 웹 프론트/백엔드, 풀스택 |
| Null 처리 | NullPointerException | undefined + null |
이름은 비슷하지만 완전히 다른 언어
"Java와 JavaScript의 관계는
Car와 Carpet의 관계와 같다"
마케팅 목적으로 이름을 빌려온 것
(당시 Java의 인기에 편승)
ECMAScript 주요 버전
| 버전 | 연도 | 주요 추가 기능 |
| ES5 | 2009 | strict mode, JSON, Array 메서드 |
| ES6 (ES2015) | 2015 | let/const, 화살표 함수, class, Promise, 모듈 |
| ES2017 | 2017 | async/await |
| ES2020 | 2020 | Optional Chaining (?.), Nullish Coalescing (??) |
| ES2022 | 2022 | Top-level await, private 필드 (#) |
// ES6+ 주요 문법
// let, const
const PI = 3.14; // 재할당 불가
let count = 0; // 재할당 가능 (블록 스코프)
// 화살표 함수
const add = (a, b) => a + b;
// 템플릿 리터럴
const name = "홍길동";
console.log(`안녕하세요 ${name}님`);
// 구조분해 할당
const { id, name: userName } = { id: 1, name: "홍길동" };
const [first, ...rest] = [1, 2, 3, 4];
// Optional Chaining + Nullish Coalescing
const city = user?.address?.city ?? "서울";
JavaScript 생태계
JavaScript
│
├── 프론트엔드
│ ├── React (Meta)
│ ├── Vue.js
│ ├── Angular (Google)
│ └── Svelte
│
├── 백엔드
│ ├── Node.js
│ ├── Express
│ ├── NestJS
│ └── Deno / Bun
│
├── 모바일
│ ├── React Native
│ └── Ionic
│
├── 데스크톱
│ └── Electron (VS Code, Slack)
│
└── 슈퍼셋
└── TypeScript (정적 타입 추가)