ts-for-jsdev
  • 자바스크립트 개발자를 위한 타입스크립트
  • 들어가며
  • 01 타입스크립트 소개
    • 1.0 들어가며
    • 1.1 정적 타입 분석
    • 1.2 왜 타입스크립트인가
    • 1.3 타입스크립트의 구성요소
    • 1.4 타입스크립트의 역사
  • 02 ECMAScript
    • 2.0 ECMAScript
    • 2.1 블록 수준 스코프
      • 2.1.1 let을 이용한 선언
      • 2.2.2 const를 이용한 선언
      • 2.2.3 스코프 베스트 프랙티스
    • 2.2 객체와 배열
      • 2.2.1 비구조화 할당
      • 2.2.2 나머지 연산자와 전개 연산자
      • 2.2.3 객체 리터럴 변경사항
    • 2.3 함수
      • 2.3.1 기본 매개변수
      • 2.3.2 화살표 함수
    • 2.4 템플릿 리터럴
      • 2.4.1 멀티라인 문자열
      • 2.4.2 문자열 치환
    • 2.5 원소 순회
      • 2.5.1 forEach 메소드
      • 2.5.2 for-of 문법
      • 2.5.3 이터레이터 프로토콜
      • 2.5.4 이터러블 프로토콜
    • 2.6 비동기 처리
      • 2.6.1 프로미스
      • 2.6.2 Async / Await
    • 2.7 맺으며
  • 03 타입스크립트 기초 문법
    • 3.0 타입스크립트 기초 문법
    • 3.1 기본 타입
    • 3.2 배열과 튜플
    • 3.3 객체
    • 3.4 타입 별칭
    • 3.5 함수
    • 3.6 제너릭
    • 3.7 유니온 타입
    • 3.8 인터섹션 타입
    • 3.9 열거형
  • 04 인터페이스와 클래스
    • 4.0 들어가며
    • 4.1 인터페이스 기초
    • 4.2 색인 가능 타입
    • 4.3 인터페이스 확장
    • 4.4 클래스
    • 4.5 클래스 확장
    • 4.6 클래스 심화
      • 4.6.1 스태틱 멤버
      • 4.6.2 접근 제어자
      • 4.6.3 접근자
      • 4.6.4 추상 클래스
    • 4.7 인터페이스와 클래스의 관계
    • 4.8 맺으며
  • 05 타입의 호환성
    • 5.0 들어가며
    • 5.1 기본 타입의 호환성
    • 5.2 객체 타입의 호환성
    • 5.3 함수 타입의 호환성
    • 5.4 클래스의 호환성
    • 5.5 제너릭의 호환성
    • 5.6 열거형의 호환성
    • 5.7 맺으며
  • 06 타입 시스템 심화
    • 6.0 들어가며
    • 6.1 타입 좁히기
    • 6.2 타입 추론
    • 6.3 타입 단언
    • 6.4 집합으로서의 타입
    • 6.5 서로소 유니온 타입
    • 6.6 맺으며
  • 07 고급 타입
    • 들어가며 (7월 2일 공개)
  • 08 모듈과 네임스페이스
    • 들어가며 (7월 16일 공개)
  • 09 실제 프로젝트에서 사용하기
    • 들어가며 (7월 30일 공개)
  • 10 유용한 라이브러리 소개
    • 들어가며 (8월 13일 공개)
    • 맺으며
  • 부록 II : 자바스크립트 언어 생태계
    • ECMAScript 언어 표준과 TC39
    • TC39 프로세스
    • 실제 예시 - Array.prototype.includes
    • 타입스크립트와 ECMAScript
Powered by GitBook
On this page
  • public
  • private
  • protected
  • 생성자에서의 접근 제어자
  1. 04 인터페이스와 클래스
  2. 4.6 클래스 심화

4.6.2 접근 제어자

현재까지 다룬 모든 클래스 멤버(생성자, 속성, 메소드 등)는 클래스 바깥에서 자유롭게 접근 할 수 있었다. 하지만 보안적/구조적 이유로 그러한 접근을 제한하고 싶을 수 있다. 이럴 때 사용할 수 있는 것이 접근 제어자(access modifier)다. 접근 제어자를 사용해 인스턴스의 멤버에 대한 접근 권한을 지정할 수 있다.

접근 제어자는 타입스크립트의 기능으로, ES6 클래스에는 포함되지 않는다.

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;
  }
}

생성자의 인자로 받은 값을 인스턴스에 할당하는 건 실제로 매우 빈번하게 보이는 패턴이다. 생성자에서 접근 제어자를 사용함으로써 그런 패턴의 코드를 보다 간결하게 작성할 수 있다.

Previous4.6.1 스태틱 멤버Next4.6.3 접근자

Last updated 6 years ago