Skip to content

6. 클래스(Class)


1. readonly

  • 클래스의 속성에 readonly 키워드를 사용하면 다음과 같이 접근만 가능하다.


class Developer {
  readonly name: string;
  constructor(theName: string) {
    this.name = theName;
  }
}

let john = new Developer("John");
john.name = "John"; // error


  • 이처럼 readonly를 사용하면 constructor() 함수에 초기 값 설정 로직을 넣어줘야 하므로 다음과 같이 인자에 readonly 키워드를 추가해서 코드를 줄일 수 있다.


class Developer {
  constructor(readonly name: string) {}
}

let john = new Developer("John");

console.log(john.name);


2. Getter와 Setter

  • 타입스크립트는 객체의 특정 속성의 접근과 할당에 대해 제어할 수 있다.
  • 이를 위해선 해당 객체가 클래스로 생성한 객체여야 한다.


class Developer {
  name: string;
}

const josh = new Developer();
josh.name = "Josh Bolton";


  • 위 코드는 클래스로 생성한 객체의 name 속성에는 Josh Bolton이라는 값을 대입한 코드이다.
  • 이제 josh 객체의 name 속성은 Josh Bolton이라는 값을 가진다.


  • 여기서 만약 name 속성에 제약 사항을 추가하고 싶다면 다음과 같이 getset을 활용하면 된다.


class Developer {
  // Getter와 Setter 함수명과 같지 않게 해야 한다.
  private _name: string;

  get name(): string {
    return this._name;
  }

  set name(newValue: string) {
    if (newValue && newValue.length > 5) {
      throw new Error("이름이 너무 깁니다");
    }
    this._name = newValue;
  }
}
const josh = new Developer();
josh.name = "Josh Bolton"; // Error
josh.name = "Josh";


Note

  • get만 선언하고 set을 선언하지 않은 경우에는 자동으로 readonly로 인식된다.


3. 추상 클래스(Abstract Class)

  • 추상 클래스는 인터페이스와 비슷한 역할을 하면서도 조금 다른 특징을 갖고 있다.
  • 추상 클래스는 특정 클래스의 상속 대상이 되는 클래스이며 좀 더 상위 레벨에서 속성, 메서드의 모양을 정의한다.


abstract class Developer {
  // 'abstract'가 붙으면 상속 받은 클래스에서 무조건 구현해야 한다.
  abstract coding(): void;
  drink(): void {
    console.log("drink sth");
  }
}

class FrontEndDeveloper extends Developer {
  // Developer 클래스를 상속 받은 클래스에서 무조건 정의해야 하는 메서드
  coding(): void {
    console.log("develop web");
  }
  design(): void {
    console.log("design web");
  }
}

const dev = new Developer(); // error. 추상 클래스는 인스턴스화할 수 없다.
const josh = new FrontEndDeveloper();
josh.coding(); // develop web
josh.drink(); // drink sth
josh.design(); // design web

References