접근 제어자

접근 제어자는 타입스크립트에서만 제공되는 기능으로, 클래스의 특정 필드나 메서드를 접근할 수 잇는 범위를 설정하는 기능이다.

public

모든 범위에서 접근이 가능하며, 필드의 접근 제어자를 지정하지 않으면 기본적으로 public 접근 제어자를 갖게 된다.


다음과 같이 public 접근 제어자를 직접 명시하는 것도 가능하다.


private

특정 필드나 메서드의 접근 제어자를 private로 설정하면 클래스 내부에서만 이 필드에 접근할 수 있게 된다.


또한, 파생클래스 내부에서도 마찬가지로 필드에 접근할 수 없다.


protected

클래스 외부에서는 접근이 안되지만, 클래스 내부 또는 파생 클래스 내부에서만 접근이 가능하도록 설정하는 접근 제어자이다.


필드 생략하기

접근 제어자는 다음과 같이 생성자의 매개변수에도 설정할 수 있다.

class Employee {
  // 필드
  private name: string;    // ❌
  protected age: number;   // ❌
  public position: string; // ❌

  // 생성자
  constructor(
    private name: string,
    protected hp: number,
    public position: string
  ) {
    this.name = name;
    this.hp = hp;
    this.position = position;
  }

  // 메서드
  work() {
    console.log(`${this.name} 일함`);
  }
}

그러나 생성자에 접근 제어자를 설정하면 동일한 이름의 필드를 선언하지 못하게 된다. 그 이유는 생성자 매개변수에 name, age, position처럼 접근 제어자가 설정되면 자동으로 필드도 함께 선언되기 때문이다. 즉, 동일한 이름으로 필드를 중복 선언할 수 없게 된다.

따라서, 다음과 같이 중복된 필드 선언을 모두 제거해 주어야 한다.

class Employee {
  // 생성자
  constructor(
    private name: string,
    protected hp: number,
    public position: string
  ) {
    this.name = name;
    this.hp = hp;
    this.position = position;
  }

  // 메서드
  work() {
    console.log(`${this.name} 일함`);
  }
}

또 다음과 같이 접근 제어자가 설정된 매개변수들은 this.필드 = 매개변수가 자동으로 수행된다.

따라서 위 코드의 name, age, position은 모두 this 객체의 프로퍼티 값으로 자동 설정되기 때문에 다음과 같이 생성자 내부의 코드를 제거해도 된다.

class Employee {
  // 생성자
  constructor(
    private name: string,
    protected hp: number,
    public position: string
  ) {}

  // 메서드
  work() {
    console.log(`${this.name} 일함`);
  }
}

그러므로 타입스크립트에서 클래스를 사용할 때에는 보통 생성자 매개변수에 접근 제어자를 설정하여 필드 선언과 생성자 내부 코드를 생략하는것이 훨씬 간결하고 빠르게 코드를 작성할 수 있어 좋다.

profile
해내는 사람

0개의 댓글