자바스크립트에서 클래스의 Public, Private, Protected 접근제어자는 클래스 멤버의 접근 범위를 제어하는 데 사용
Public은 별도 키워드를 붙이지 않았을 때 기본 적용되는 접근제어자로, 클래스 외부에서도 자유롭게 접근 가능
ex - this.name = 'John' 처럼 선언된 멤버는 Public으로 간주
이는 클래스 외부에서 객체를 통해 직접 접근 가능
Private은 멤버 앞에 # 키워드를 붙여 적용하는 접근제어자
클래스 내부에서만 접근 가능하게 됨
ex - this.#secret = 'hidden' 처럼 선언된 멤버는 Private로 간주
Private멤버는 객체를 통한 외부 접근이 불가능
상속받은 클래스에서도 사용할 수 없게 됨
Protected는 자바스크립트 언어 차원에서 지원하지 않지만, 관습적으로 _를 접두어로 사용해 개발자 간 약속으로 처리
ex - this._secret = 'hidden' 과 같은 방식으로 선언하여 Protected임을 나타냄
이는 상속받은 클래스에서 접근하는 것은 허용하지만 클래스 외부에서는 사용하지 말라는 의미
즉, 클래스 외부에서 객체를 통한 접근은 하지 않을 것을 개발자들 간에 약속하는 것
이는 언어 차원의 강제성은 없음
접근제어자를 활용하면 코드의 캡슐화를 통해 데이터 보호와 유지보수를 향상시킬 수 있음
첫째, 타입스크립트에선 JS에서 지원하지 않는 접근제어자 키워드들을 제공하기 때문에 더욱 명시적인 방식으로 접근제어자를 선언할 수 있음
public 키워드를 이용하여 public 멤버임을 선언할 수 있음
아무 키워드를 붙이지 않을 때와 동작은 동일하지만 그 의미를 명시적으로 나타낼 수 있게 해줌
# 키워드 대신 private 키워드를 이용하여 private 멤버임을 선언할 수 있음
_ 키워드 컨벤션 대신 protected키워드를 이용하여 Protected 멤버임을 선언할 수 있음
class Foo {
public a: string; // 상속 클래스 접근 o / 외부 접근 o
private b: number; // 상속 클래스 접근 x / 외부 접근 x
protected c:boolean; // 상속 클래스 접근 o / 외부 접근 x
constructor(a: string, b: number, c: boolean){
this.a = a;
this.b = b;
this.c = c;
}
}
둘째, TS에선 파라미터 프로퍼티 기능을 제공
이는 생성자 매개변수에 접근제어자를 붙이면 해당 변수를 멤버로 자동 선언하고 초기화되는 기능. 덕분에 간결하게 코드 작성 가능
class Foo {
constructor(public a:string, private b: number, protected c: boolean){
// 이 부분 채우지 않아도 자동으로 멤버 선언 및 초기화
}
}