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
  • 읽기 접근을 위한 게터
  • 쓰기 접근을 위한 세터
  1. 04 인터페이스와 클래스
  2. 4.6 클래스 심화

4.6.3 접근자

접근자는 타입스크립트 컴파일 타겟이 ES3 이하인 경우 사용할 수 없다.

지금까지 다룬 클래스들의 모든 속성은 외부에 직접적으로 노출되었다. 많은 경우엔 이러한 접근 방식으로도 충분하지만, 속성을 읽거나 쓸 때마다 매번 특정한 로직을 실행하고 싶은 경우엔 어떻게 할까?

한 가지 방법은 접근 제어자를 사용해 직접적인 접근을 막고 읽기, 쓰기를 위한 메소드를 노출하는 것이다.

class Shape {
  private _vertices: number = 3;
  
  getVertices() {
    console.log('Vertices getter called.');
    return this._vertices;
  }
  
  setVertices(value) {
    console.log('Vertices setter called.');
    this._vertices = value;
  }
}

이런 메소드를 이용한 접근법은 잘 동작하고, 논리상으로는 전혀 문제가 없다. 하지만 평소처럼 속성에 직접 접근해도(instance.prop) 내부적으로는 관련 로직이 실행되도록 정의할 수 있다면 보다 간결하고 직관적인 코드 작성이 가능할 것이다.

타입스크립트는 이를 위해 접근자(accessor)를 제공한다. 접근자는 이름 그대로 클래스 속성에 대해 접근할 때 실행될 로직을 정의하는 함수다. 멤버 접근은 크게 두 가지로 나뉘고, 대응하는 접근자 역시 두 가지가 존재한다.

  • 읽기 접근(const value = instance.prop): 게터(getter)

  • 쓰기 접근(instance.prop = value): 세터(setter)

읽기 접근을 위한 게터

속성 이름의 메소드 정의 앞에 get 키워드를 붙여 게터(getter), 즉 속성의 값을 읽어올 때 실행할 함수를 정의할 수 있다. 게터는 인자를 받을 수 없으며, 게터의 반환값은 외부에 해당 속성의 값으로 노출된다.

class Shape {
  constructor (public vertices: number) { }
  get vertices(): number {
    console.log('Vertices getter called.');
    return 3;
  }
}
const triangle: Shape = new Shape(3);
const vertices = triangle.vertices; // Vertices getter called.
console.log(vertices); // 3

쓰기 접근을 위한 세터

속성 이름의 메소드 정의 앞에 set 키워드를 붙여 세터(setter), 즉 속성의 값을 쓸 때 실행될 함수를 정의할 수 있다. 세터는 새로 할당되는 값을 인자로 받는다.

class Shape {
  private _vertices: number = 3;
  get vertices() {
    console.log('Vertices getter called.');
    return this._vertices;
  }
  set vertices(value) {
    console.log('Vertices setter called.');
    this._vertices = value;
  }
}
const square = new Shape();
square.vertices = 4; // Vertices setter called.
const vertices = square.vertices; // Vertices getter called.
console.log(vertices); // 4

위 Shape 클래스는 내부적으로만 접근 가능한 private 속성(_vertices)을 유지하며, 외부에서는 vertices 게터와 세터를 통한 접근만을 허용한다. 지금으로서는 로그를 찍는 것 외엔 별다른 의미가 없지만, 추후 유효성 검사 등의, 읽기/쓰기 시 실행될 여러 로직을 추가할 수 있을 것이다.

만약 게터만 존재하고 세터가 존재하지 않는 멤버의 경우, 읽기만 가능할 뿐 쓸 수단이 없다. 따라서 타입스크립트는 해당 멤버를 readonly 로 인식한다.

Previous4.6.2 접근 제어자Next4.6.4 추상 클래스

Last updated 7 years ago