티스토리 뷰

00. TL;DR

항목 Java (클래스 기반 상속) JavaScript (프로토타입 기반 상속)
상속 방식 클래스(Class) → 인스턴스 객체(Object) → 객체
상속 키워드 extends, super __proto__, Object.create, extends (ES6 이후)
실행 시점 컴파일 타임에 상속 구조 결정 런타임에 동적으로 상속 구조 설정 가능
클래스 수정 여부 불가능 (정적 구조) 가능 (동적 구조)
메서드 참조 방식 클래스 메서드 테이블을 참조 프로토타입 체인을 따라 탐색

01. 상속 모델의 기본 구조

01.01. 자바: 클래스 기반(Class-based)

class Animal {
  void speak() {
    System.out.println("Animal speaks");
  }
}

class Dog extends Animal {
  void bark() {
    System.out.println("멍멍!");
  }
}
  • DogAnimal 클래스를 정적으로 상속
  • 컴파일 시점에 상속 구조가 고정
  • 메서드는 클래스 메모리(Method Area)에 저장되고,
    인스턴스는 이를 참조함 (복사 아님)

01.02. 자바스크립트: 프로토타입 기반(Prototype-based)

const animal = {
  speak() {
    console.log('Animal speaks');
  }
};

const dog = Object.create(animal);
dog.bark = () => console.log('멍멍!');
  • doganimal런타임에 상속
  • __proto__ 또는 Object.create()로 연결
  • dog.speak() 호출 시 animal에서 메서드 탐색

02. 메서드 상속과 참조 구조

02.01. 자바

  • 메서드는 Method Area한 번만 존재
  • 모든 인스턴스는 이 메서드를 공유해서 참조
  • 런타임에 메서드를 바꾸는 것은 불가능

02.02. 자바스크립트

  • 메서드는 prototype 객체에 정의
  • 모든 인스턴스는 __proto__를 통해 이를 공유
  • 런타임에 메서드 수정 가능 → 모든 인스턴스에 영향
Dog.prototype.bark = function () {
  console.log('왈왈!');
};

03. 실행 시점 비교

항목 Java JavaScript
상속 구조 결정 시점 컴파일 타임 런타임
메서드 바디 수정 불가능 가능
동적 상속 변경 불가능 가능 (Object.setPrototypeOf)

04. 문법적 차이

04.01. 자바의 클래스 상속

class Parent { ... }
class Child extends Parent { ... }
  • 상속 구조 고정
  • super()로 부모 생성자 호출
  • 접근 제한자 (private, protected 등) 존재

04.02. 자바스크립트의 클래스 문법 (ES6 이후)

class Parent {
  constructor(name) {
    this.name = name;
  }
}

class Child extends Parent {
  constructor(name, age) {
    super(name);
    this.age = age;
  }
}
  • class문법적 설탕(syntactic sugar)
  • 내부적으로는 여전히 prototype 기반 상속

05. 오버라이딩과 다형성

05.01. 자바

  • 오버라이딩은 명확히 정의되고 컴파일러가 검증
  • @Override 어노테이션 존재
  • 메서드 호출 시 동적 디스패치(dynamic dispatch) 사용
class Animal {
  void speak() {
    System.out.println("...");
  }
}

class Dog extends Animal {
  @Override
  void speak() {
    System.out.println("멍멍!");
  }
}

05.02. 자바스크립트

  • 오버라이딩은 동적 구조상 그냥 덮어쓰기
  • 컴파일러가 존재하지 않으므로 실수해도 잡아주지 않음
class Animal {
  speak() {
    console.log('...');
  }
}

class Dog extends Animal {
  speak() {
    console.log('멍멍!');
  }
}

06. 정리 표

항목 Java (클래스 기반) JavaScript (프로토타입 기반)
상속 키워드 extends, super Object.create, extends
상속 구조 결정 시점 컴파일 타임 런타임
클래스/객체 구조 수정 가능 여부 불가능 가능
메서드 저장 위치 클래스의 메서드 테이블(Method Area) prototype 객체
오버라이딩 검증 컴파일러가 검증 (@Override) 없음 (동적 덮어쓰기)
다형성 구현 방식 동적 디스패치 프로토타입 체인 탐색

07. 결론

  • 자바는 컴파일 기반, 정적 타입, 클래스 중심의 객체지향 언어로 고정된 상속 구조와 안정성을 추구하며 명확한 계층 구조를 갖습니다.
  • 반면, 자바스크립트는 런타임 기반, 동적 타입, 객체 중심의 유연한 언어로
  • 객체 간의 연결을 통해 동적으로 상속 관계를 구성하고,
  • 메서드와 속성을 공유 또는 수정할 수 있도록 설계되었습니다.
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/04   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30
글 보관함