leebaek

[JS] JavaScript 특징에 대해 알아보자! 본문

웹/JavaScript

[JS] JavaScript 특징에 대해 알아보자!

leebaek 2025. 3. 13. 15:34

■ JavaScript

: 가볍고 유연한 인터프리터 또는 JIT(Just-In-Time) 컴파일 방식의 동적 프로그래밍 언어이다.

 

인터프리터란 ?

더보기
더보기

프로그래밍 언어의 코드를 한 줄씩 읽고 바로 실행하는 방식

소스 코드를 기계어로 변환하면서 즉시 실행하는 프로그램

 

- 코드를 실행할 때, 전체를 컴파일하지 않고 한 줄씩 번역하며 실행함

- 실행이 빠르게 시작 되지만, 매번 실행할 때마다 번역해야하므로 속도가 느릴 수 있음

- 인터프리터 언어는 특정 운영체제(OS)에 종속되지 않으며, 다양한 환경에서 실행 가능

 

-> 즉시 실행 가능, 디버깅이 쉬움, 컴파일 과정이 필요없음, 이식성이 좋음


■ JavaScript의 주요 특징

□ 프로토타입 기반 (Prototype-based)

  • 클래스 기반 언어와 달리, 객체가 다른 객체를 상속하는 방식으로 동작한다.
  • Object.create() prototype을 활용객체를 확장할 수 있다.
  • 프로토타입 체인 : 객체에서 속성이나 메서드를 찾을 때 자신에게 없으면 부모(프로토타입) 객체를 따라 올라가며 찾는 구조이다.
프로토타입 기반 객체 지향 프로그래밍(Prototype-based OOP):  클래스 없이 객체를 직접 복제(상속)하여 새로운 객체를 생성하는 방식

□ 일급 함수 (First-class Functions)

  • 함수가 변수에 할당될 수 있고, 다른 함수의 인자로 전달되거나 반환될 수 있다.
  • 고차 함수(Higher-Order Functions)콜백 함수 사용이 가능하다.
const sayHello = function() {
    console.log("Hello!");
};

sayHello(); // Hello!
function execute(func) {
    func(); // 전달받은 함수를 실행
}

function greet() {
    console.log("Hi there!");
}

execute(greet); // Hi there!
function createMultiplier(multiplier) {
    return function(number) {
        return number * multiplier;
    };
}

const double = createMultiplier(2);
console.log(double(5)); // 10
const operations = {
    add: (a, b) => a + b,
    multiply: (a, b) => a * b
};

console.log(operations.add(3, 5));     // 8
console.log(operations.multiply(3, 5)); // 15

다중 패러다임 지원 (Multi-paradigm)

  • 객체지향 프로그래밍(OOP): 객체와 메서드를 활용하여 상태를 관리한다.
  • 명령형 프로그래밍(Imperative Programming): 명령어를 순차적으로 실행한다.
  • 함수형 프로그래밍(Functional Programming): 순수 함수와 불변성을 강조한다.
class Calculator {
    constructor() {
        this.result = 0;
    }

    add(value) {
        this.result += value;
        return this; // 메서드 체이닝 지원
    }

    subtract(value) {
        this.result -= value;
        return this;
    }

    getResult() {
        return this.result;
    }
}

// 명령형 스타일 사용
const calc = new Calculator();
calc.add(10).subtract(3);
console.log(calc.getResult()); // 7

// 함수형 스타일 적용
const numbers = [1, 2, 3, 4, 5];
const total = numbers.map(n => n * 2).reduce((acc, num) => acc + num, 0);
console.log(total); // 30

동적 타입 (Dynamically Typed)

  • 변수의 타입을 명시적으로 선언할 필요가 없으며, 런타임에 결정된다.
  • var, let, const로 변수를 선언할 수 있으며, typeof 연산자를 사용해 타입을 확인할 수 있다. ( var는 권장  X )
let message = "Hello"; // 문자열(string)
message = 42;          // 숫자(number)
message = true;        // 불리언(boolean)
console.log(message);  // true

단일 스레드, 비동기 처리 (Single-threaded, Asynchronous)

  • 이벤트 루프(Event Loop)를 기반으로 한 비동기 프로그래밍을 지원한다.
  • setTimeout, setInterval, Promise, async/await를 통해 비동기 작업을 처리한다.

 

자동 메모리 관리 (Garbage Collection)

  • 불필요한 메모리를 자동으로 정리하는 가비지 컬렉션(GC) 기능을 제공한다.
더보기
더보기

1) 참조 카운팅(Reference Counting)

  • 변수가 참조되고 있으면 메모리를 유지, 참조가 없으면 해제

2) 마크 앤 스위프(Mark-and-Sweep)

  • 주기적으로 도달할 수 없는(사용되지 않는) 객체를 찾아 정리

3) 순환 참조 해결

 

장점 :
개발자가 직접 메모리 해제를 할 필요 없음 → 편리함
메모리 누수 방지 가능 (하지만 100% 방지는 아님)

 

단점 :
언제 실행될지 예측 불가 → 성능 저하 가능
메모리 누수가 발생할 수 있음 (특히 전역 변수 남발 시)

 

ECMAScript 표준 기반

  • ECMAScript(ES) 는 JavaScript의 공식 표준
  • ECMAScript(ES6, ES7, …) 표준을 따라 발전하고 있으며, 새로운 기능이 지속적으로 추가된다.