Classes(클래스) - 붕어빵은 맛있다

👉🏼 KIM·2024년 11월 9일

TIL

목록 보기
30/55

오늘 공부한것 & 기억하고 싶은 내용

Class

  • 객체를 만드는 청사진, 붕어빵 틀로 비유하겠다.
  • 실제 붕어빵이 아닌 붕어빵을 만들기 위한 설계도나 형태
  • 클래스에서 사용할 수 있는 주요 메서드 종류로는 생성자, 일반 메서드, 정적 메서드, 접근자/설정자 메서드, 추상 메서드가 있다. 이 메서드들은 객체지향 프로그래밍에서 객체의 상태와 동작을 정의하고 관리하는데 중요한 역할을 한다.

인스턴스(객체)

  • 실제로 붕어빵 틀을 사용하여 만든 개별 붕어빵
  • 클래스의 정의를 바탕으로 만들어진 구체적인 객체
  • 붕어빵 틀로 만든 붕어빵이 여러개가 있을 수 있듯이, 같은 클래스에서 여러개의 인스턴스를 만들 수 있다.

생성자 (Constructor)

  • 붕어빵틀에 반죽을 넣고 붕어빵을 만들 때 사용하는 과정이나 방법
  • 붕어빵 틀에 반죽을 넣을때, 색상, 종류 크기 등을 결정하게 되면, 생성자는 이처럼 각각의 붕어빵에 고유한 속성을 부여하는 역할
  • 각각의 붕어빵이 어떤 모습인지(속성값) 결정하게 되며, 클래스의 인스턴스(붕어빵) 생성 시 필요한 설정을 수행하는 역할을 한다.
  • 생성자의 종류는 기본 생서자와 매개변수가 있는 생성자로 나뉘며, 접근 제어자에 따라 public, private, protected로 구분할 수 있다. 이러한 생성자는 객체를 생성할 때 속성을 초기화하고, 객체의 접근을 제어하는 중요한 역할을 한다.

Public

  • 공용 붕어빵, 모든 사람이 접근할 수 있는 일반적인 붕어빵이다. 거리에서 쉽게 구할 수 있으며, 누구나 마음껏 먹을 수 있다.
  • 누구에게나 공개되어 있는 붕어빵으로, 외부에서 자유롭게 접근 가능

private

  • 오직 주인만 접근할 수 있는 비밀 붕어빵, 붕어빵틀 내부에서만 사용할 수 있는 비밀 재료나 제조 비법(특정한 비밀재료로 만들어짐)
  • 이 비밀재료는 붕어빵을 만들 때만 사용되고, 붕어빵이 만들어진 후에는 외부에서 접근이 안된다. -> 붕어빵의 품질과 독창성을 유지할 수 있다.
  • 외부에서는 만들거나 먹을 수 없다.
  • 즉, 클래스 외부에서는 접근할 수 없는 속성이나 메서드를 보호한다. 이는 데이터를 안전하게 지키고, 의도하지 않은 방식으로 객체가 사용되는 것을 방지하는 역할을 한다.

Protected

  • 보호된 붕어빵, 가게의 가족이나 직원만 접근할 수 있는 특별한 붕어빵, 일반 손님에게는 공개되지 않지만 주인의 가족이나 직원은 이 붕어빵을 만들거나 먹을 수 있다.
  • 서브 클래스에서만 사용할 수 있으며, 외부에서는 접근할 수 없다.
  • 특정 그룹만 접근할 수 있는 보호된 붕어빵으로, 서브클래스에서는 사용할 수 있지만 외부에서는 접근 불가능

Abstract Class

  • 붕어빵을 만들기 위한 기본적인 틀이지만 실제로 붕어빵을 만들 수는 없다. 특정한 종류의 붕어빵을 만들기 위해서 구체적인 레시피가 필요한 상황
  • 구체적인 붕어빵은 이 틀을 상속받아 구현하는 서브 클래스에서 만들어진다.
  • 속성과 메서드를 정의하지만 이 클래스 자체로는 인스턴스를 생성할 수 없고, 반드시 이를 상속받은 서브클래스에서 구체적인 구현을 제공해야함
  • 타입스크립트 내에서는 추상 클래스 사용하면 메서드의 call signature만 가지고 있다.(타입 지정을 위해)

//javascript
// 추상 클래스 붕어빵틀
class 붕어빵틀 {
  constructor() {
    if (new.target === 붕어빵틀) {
      throw new Error("추상 클래스는 인스턴스화할 수 없습니다.");
    }
  }

  // 추상 메서드: 붕어빵을 만드는 메서드
  만들기() {
    throw new Error("이 메서드는 서브클래스에서 구현해야 합니다.");
  }
}

// 일반 클래스 붕어빵
class 붕어빵 extends 붕어빵틀 {
  constructor(속재료) {
    super(); // 부모 클래스의 생성자 호출
    this.속재료 = 속재료;
  }

  // 붕어빵 만들기 구현
  만들기() {
    console.log(`붕어빵을 만들고 있습니다! 속재료: ${this.속재료}`);
  }
}

// 일반 클래스 사용
const 붕어빵1 = new 붕어빵("팥");
붕어빵1.만들기(); // 붕어빵을 만들고 있습니다! 속재료: 팥

const 붕어빵2 = new 붕어빵("크림");
붕어빵2.만들기(); // 붕어빵을 만들고 있습니다! 속재료: 크림

// 추상 클래스의 인스턴스화 시도
try {
  const= new 붕어빵틀(); // 오류 발생
} catch (error) {
  console.error(error.message); // 추상 클래스는 인스턴스화할 수 없습니다.
}
//typescript
// 추상 클래스 붕어빵틀
abstract class 붕어빵틀 {
  constructor() {
    // 추상 클래스는 인스턴스화할 수 없도록 합니다.
    if (new.target === 붕어빵틀) {
      throw new Error("추상 클래스는 인스턴스화할 수 없습니다.");
    }
  }

  // 추상 메서드: 붕어빵을 만드는 메서드
  abstract 만들기(): void;
}

// 일반 클래스 붕어빵
class 붕어빵 extends 붕어빵틀 {
  private 속재료: string;

  constructor(속재료: string) {
    super(); // 부모 클래스의 생성자 호출
    this.속재료 = 속재료;
  }

  // 붕어빵 만들기 구현
  만들기(): void {
    console.log(`붕어빵을 만들고 있습니다! 속재료: ${this.속재료}`);
  }
}

// 일반 클래스 사용
const 붕어빵1 = new 붕어빵("팥");
붕어빵1.만들기(); // 붕어빵을 만들고 있습니다! 속재료: 팥

const 붕어빵2 = new 붕어빵("크림");
붕어빵2.만들기(); // 붕어빵을 만들고 있습니다! 속재료: 크림

// 추상 클래스의 인스턴스화 시도
try {
  const= new 붕어빵틀(); // 오류 발생
} catch (error) {
  console.error(error.message); // 추상 클래스는 인스턴스화할 수 없습니다.
}

배운점 & 느낀점

객체지향 공부할때 공부했던 클래스....
정말 이해가 가지 않지만 이 비유 하나면 개념 정리 완~

대학교때 교수님께서 알려주셨던 .... 붕어빵이 기억나서 붕어빵에 비유해서 정리해보니 훨씬 더 친근하게 다가왔고 이해가 잘됐다!!!
붕어빵은 맛도 좋은데 비유도 좋다니^^ 덕분에 클래스와 조금 더 친해졌다.
올 겨울엔 붕어빵 좀 사먹어야겠다.

profile
프론트는 순항중 ¿¿

0개의 댓글