본문 바로가기

TypeScript

클래스 - 심화 - 접근 제어자

public

public 멤버는 접근 제한이 전혀 존재하지 않으며, 프로그램의 어느 곳에서나 접근 가능하다.

접근 제어자가 명시되지 않은 멤버는 모두 암시적으로 public 접근 권한을 갖는다.

아래의 두 정의는 의미상 동일하다.

    // implicit public member
    class Triangle {
      vertices: number;

      constructor() {
        this.vertices = 3;
      }
    }

    // explicit public member
    class Triangle {
      public vertices: number;

      public constructor() {
        this.vertices = 3;
      }
    }

private

private 멤버에는 해당 클래스 내부의 코드만이 접근 가능하다. 만약 클래스 바깥에서 private 멤버에 접근하려 할 시 에러가 발생한다.

    class User {
      private password: string;

      constructor (password: string) {
        this.password = password;
      }
    }

    const yoonha = new User('486');
    console.log(yoonha.password); 
    // error TS2341: Property 'password' is private and only accessible within class 'User'

private 멤버의 접근 제한은 서브클래스에도 적용된다. 기본적으로 서브클래스는 슈퍼클래스의 멤버에 접근할 수 있지만, 만약 해당 멤버가 private 멤버라면 접근할 수 없다.

    class CarOwner extends User {
      carId: string;

      constructor (password: string, carId: string) {
        super(password);
        this.carId = carId;
      }

      setPassword(newPassword: string) {
        this.password = newPassword;
        // error TS2341: Property 'password' is private and only accessible within class 'User'.
      }
     }

protected

protected 권한의 멤버는 private과 비슷하게 동작하지만, 서브클래스에서의 접근 또한 허용된다는 점이 다르다. 위의 예시에서 User의 멤버 password의 접근 제어자를 private에서 protected로 변경하면 에러가 사라진다.

    class User {
      protected password: string;

      constructor (password: string) {
        this.password = password;
      }
    }

    class CarOwner extends User {
      carId: string;

      constructor (password: string, carId: string) {
        super(password);
        this.carId = carId;
      }

      setPassword(newPassword: string) {
        this.password = newPassword;
        // Okay
      }
    }

생성자에서의 접근 제어자

멤버 선언 외에도 생성자의 매개변수 앞에 접근 제어자를 명시할 수 있다. 접근 제어자가 붙은 생성자 매개변수는 같은 이름의 속성으로 선언되고, 해당 매개변수의 인자는 암묵적으로 인스턴스에 할당된다. 즉 다음 코드는

    class User {
      constructor (public id: string, private password: string) { }
    }

아래와 동일하게 동작한다.

    class User {
      public id: string;
      private password: string;

      constructor (id: string, password: string) {
        this.id = id;
        this.password = password;
      }
    }

'TypeScript' 카테고리의 다른 글

추상 클래스  (0) 2019.10.30
클래스 - 심화 - 접근자  (0) 2019.10.30
클래스 - 심화 - 스태틱 멤버  (0) 2019.10.30
클래스 - 확장  (0) 2019.10.30
클래스 - 기초  (0) 2019.10.30