Skip to content

Latest commit

 

History

History
113 lines (85 loc) · 3.06 KB

클래스.md

File metadata and controls

113 lines (85 loc) · 3.06 KB

클래스

1. 타입스크립트의 클래스

class Chatgpt {
  constructor(name: string) {
    this.name = name;
  }
  sum(a: number, b: number): number {
    return a + b;
  }
}
  • 위는 타입스크립트에서 에러를 발생시킨다. "Property 'name' does not exist on type 'Chatgpt'. ts(2339)" 타입에러가 발생한다. 타입스크립트로 클래스를 작성할 떄는 생성자 메서드에서 사용될 클래스 속성들을 미리 정의해주어야 한다.
class Chatgpt {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  sum(a: number, b: number): number {
    return a + b;
  }
}
  • 클래스 이름 아래에 클래스 속성 이름과 타입을 정의하면 오류가 없어진다.

2. 클래스 접근 제어자

  • 클래스 접근 제어자를 사용하면 클래스 속성의 노출범위를 정의하고, 복잡한 기능을 구현할때 유용하다.
class Person {
  name: string;
  skill: string;

  constructor(name: string, skill: string) {
    this.name = name;
    this.skill = skill;
  }
}

let ha = new Person("현준", "코드 짜기");
ha.name = "현중";
console.log(ha.name); // 현중
  • 이렇게 직접적으로 name속성을 변경할 수 있다.
class WaterPurifier {
  waterAmount: number;

  constructor(waterAmount: number) {
    this.waterAmount = waterAmount;
  }

  wash() {
    if (this.waterAmount > 0) {
      console.log("정수기 동작 성공");
    }
  }
}

let purifier = new WaterPurifier(30);
purifier.wash();
purifier.waterAmount = 0;
purifier.wash(); // 동작 안함
  • 물의 양을 30 에서 0으로 바꿨기 때문에 마지막에 동작을 하지 않는다. 이를 해결하기 위해서는 waterAmount에 private 접근제어자를 추가해주면 해결된다. 그러나 접근제어자를 설정하여도 실행 시점(런타입)의 에러는 보장해주지 못하기 때문에 코드는 실행된다.

클래스 접근 제어자 public, private, protected

public

  • 클래스 안에 선언된 속성과 메서드를 어디서든 접근할 수 있다.

private

  • 클래스 코드 외부에서 클래스의 속성과 메서드를 접근할 수 없다. public과 반대되는 개념으로 클래스 안 로직을 외부 세상에서 단절시켜 보호할 때 주로 사용한다.

protected

  • protected로 선언된 속성이나 메서드는 클래스 코드 외부에서 사용할 수 없다. 다만 상속받은 클래스에서는 사용할 수 있다.
class WaterPurifier {
  #waterAmount: number = 0;

  constructor(waterAmount: number) {
    this.#waterAmount = waterAmount;
  }

  wash() {
    if (this.#waterAmount > 0) {
      console.log("정수기 동작 성공");
    }
  }
}

let purifier = new WaterPurifier(30);
purifier.wash();
purifier.#waterAmount = 0;
purifier.wash(); // 동작 안함
  • 위 예제에서 privte의 실행 결과까지도 클래스 접근 제어자와 일치시키고 싶다면 private 문법(#)을 적용하면 된다.
  • 이를 사용하려면 tsconfig의 target을 ES2015이상으로 해야한다.