클래스, 객체, 인스턴스에 대해 자세히 다룬 글 보러가기
// 클래스 (설계도)
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(); // 사용자는 이 버튼 하나만 누르면 됨