객체지향 핵심 개념/특징 정리

seungjun.dev·2025년 7월 26일
0

클래스와 객체

  • 클래스: 객체를 만들기 위한 설계도
  • 객체: 그 설계도로 만든 실제 물건
  • 인스턴스: 객체와 다르게 구현된 구체적인 실체

클래스, 객체, 인스턴스에 대해 자세히 다룬 글 보러가기

// 클래스 (설계도)
class Person {
  constructor(name) {
    this.name = name;
  }

  // 기능(메소드)
  greet() {
    console.log(`안녕하세요, ${this.name}입니다.`);
  }
}

// 객체 (실제품)
const kim = new Person("김민준");
kim.greet(); // 출력: 안녕하세요, 김민준입니다.
  • 생성자는 constructor() 메소드
  • this 키워드로 인스턴스 속성 접근

상속

  • 부모 클래스의 특성을 자식 클래스가 물려받는 것
  • 일반적인 것에서 특수한 것으로 점진적으로 구체화하는 계층적 구조
class Person {
  constructor(name) {
    this.name = name;
  }
  greet() {
    console.log(`안녕하세요, ${this.name}입니다.`);
  }
}

// Person을 상속받는 Student 클래스
class Student extends Person {
  study() {
    console.log("컴퓨터공학을 공부합니다.");
  }
}

const lee = new Student("이수빈");
lee.greet(); // 부모로부터 물려받은 기능
lee.study(); // 자신만의 기능
  • super(): 부모 클래스의 생성자를 호출
  • 자식 객체가 만들어질 때 부모의 기본 설정을 먼저 받아야 하기 때문에 사용

다형성

  • 같은 이름의 메소드가 객체에 따라 다르게 동작
  • 런타임에 객체의 실제 타입을 확인하고 해당하는 메소드를 호출 -> 다형성의 핵심 메커니즘
class Animal {
  speak() {
    console.log("동물이 소리를 냅니다.");
  }
}

class Dog extends Animal {
  speak() { // 부모의 메소드를 재정의 (오버라이딩)
    console.log("멍멍!");
  }
}

class Cat extends Animal {
  speak() { // 부모의 메소드를 재정의 (오버라이딩)
    console.log("야옹");
  }
}

const myDog = new Dog();
const myCat = new Cat();

myDog.speak(); // 출력: 멍멍!
myCat.speak(); // 출력: 야옹

캡슐화

  • 객체의 내부 데이터와 구현을 외부에서 직접 접근하지 못하도록 보호
  • 잘못된 값이 들어가는 것을 방지
class Counter {
  #count = 0; // Private 필드: 외부에서 직접 접근 불가

  increment() {
    this.#count++;
  }

  getCount() {
    return this.#count;
  }
}

const counter = new Counter();
// counter.#count = 100; // 에러 발생! 직접 수정 불가
counter.increment();
counter.increment();

console.log(counter.getCount()); // 출력: 2
  • # 기호로 시작하는 필드가 private, 클래스 외부에서 절대 접근 불가
  • 클래스 내부의 메소드로만 접근 가능

추상화

  • 복잡한 구현 세부사항을 숨기고 핵심 기능만 노출
  • 큰 시스템을 이해하기 쉬운 작은 단위로 나눈다는 장점
class CoffeeMachine {
  // 복잡한 내부 동작 (private 메소드)
  #grindBeans() { /* 원두 가는 로직 */ }
  #heatWater() { /* 물 끓이는 로직 */ }

  // 외부에 노출되는 간단한 기능 (public 메소드)
  makeCoffee() {
    this.#grindBeans();
    this.#heatWater();
    console.log("☕️ 커피 완성!");
  }
}

const machine = new CoffeeMachine();
machine.makeCoffee(); // 사용자는 이 버튼 하나만 누르면 됨
profile
Web FE Dev | Microsoft Student Ambassadors Alumni

0개의 댓글