[ TypeScript ]- Access Modifiers(접근제한자), Getter & Setter

JP·2023년 3월 16일

* [ TypeScript ] *

목록 보기
10/10
post-thumbnail

Access Modifiers

access modifiers 는 클래스의 멤버들 즉, 클래스 속 멤버변수(property) 와 메소드에 적용될 수 있는 키워드 이다.
access modifiers 를 통해서 바깥 세상으로부터의 접근을 통제 할 수 있기 때문에 버그를 줄이고 코드에 안정성을 향상시킬 수 있다는 장점이 있다.

타입스크립트에서는 크게 3가지 접근제한자가 존재한다.

  • Public = 클래스의 외부 세상 어디서든 접근 가능
  • Private = 클래스 내에서만 접근가능, 외부에서는 접근 불가능 (비공개 멤버)
  • Protected = 클래스 내부, 그리고 상속받은 클래스에서 접근가능

Public 과 Private 이 가장 흔히 사용된다.

class Employee {
  fullName: string;
  age: number;
  jobTitle: string;
  hourlyRate: number;
  workingHoursPerWeek: number;

  //
	constructor(fullName:string, 
                 age:number,
                 jobTitle:string,
                 hourlyRate: number,
                 workingHoursPerWeek: number) {
      
      this.fullName = fullname;
      this.age = age;
      this.jobTitle = jobtitle;
      this.hourlyRate = hourlyRate;
      this.workingHoursPerWeek = workingHoursPerWeek;
    
    }

  //
  printEmployeeDetails = (): void => {
    console.log(
      `${this.fullName}의 직업은 ${this.jobTitle}이고 일주일의 수입은 ${
        this.hourlyRate * this.workingHoursPerWeek
      }달러이다.`
    );
  };
}

let employee1 = new Employee();
employee1.fullName = "Park";
employee1.age = 30;
employee1.jobTitle = "주니어 개발자";
employee1.hourlyRate = 40;
employee1.workingHoursPerWeek = 35;
employee1.printEmployeeDetails();

타입스크립트에서 기본적으로 클래스의 각 멤버들은 Public 이다.

public printEmployeeDetails = (): void => {    

이렇게 public 키워드를 붙여서 직접적으로 명시 해줘도 되지만 , Java 와 C# 같은 언어 들과는 다르게 퍼블릭 멤버들을 노출 시키기 위해서 public 이라는 키워드를 클래스 내에 굳이 명시할 필요는 없다.

코드에서 아무런 access modifiers 가 명시되어 있지 않으면 그냥
"public" 이라고 생각해주면 된다.

class Employee {
  private fullName: string;
  age: number;
  jobTitle: string;
  hourlyRate: number;
  workingHoursPerWeek: number;

이번에는 클래스 의 fulName 프로퍼티 앞에 private 키워드를 넣어서 클래스 외부에서 접근하지 못하도록 만들 수 있다.
이렇게 하면 에러가 메시지가 생긴다.

⚠️ Property 'fulName' is private and only accessible within class 'Employee'.

⚠️ 풀네임 프로퍼티는 프라이베잇 이기때문에 클래스 내에서만 접근 가능 하다.

초기화된 객체 fullName 프로퍼티는 클래스내 private 멤버 이기 때문에 그 값은 이전과는 달리 더이상 직접적으로 접근해서는 바꿀수 없다.

뿐만 아니라 비공개 멤버인 fullName 프로퍼티의 값은 클래스 외부에서 조차 읽을 수 조차 없다.

Getter & Setter

위 처럼 비공개로 설정된 객체 멤버 변수에 접근하여 값을 읽거나 쓰기 위해서 타입스크립트에서는 Getter & Setter 라는 컨셉을 제공하고 있다.

클래스 내에서 get 과 set 키워드를 사용해서 Getter 와 Setter 를 선언 할 수 있다.

class Employee {
 private _fullName: string;
 age: number;
 jobTitle: string;
 hourlyRate: number;
 workingHoursPerWeek: number;

우선 Private 멤버인 fullName 프로퍼티 앞에 _언더 스커어 를 넣어서 비공개 멤버 임을 나타내준다.

비공개 프로퍼티의 이름 앞에 밑줄을 긋는 것은 많은 언어에서 컨벤션으로 사용되고 있다.
즉, private 멤버라는 것을 나타내기 위해 표시 하는 암묵적으로 약속된 방법이라고 생각 해 주면 된다.

      this._fullName = fullname;
      this.age = age;
      this.jobTitle = jobtitle;
      this.hourlyRate = hourlyRate;
      this.workingHoursPerWeek = workingHoursPerWeek;
    
    }

  //
  printEmployeeDetails = (): void => {
    console.log(
      `${this._fullName}의 직업은 ${this.jobTitle}이고 일주일의 수입은 ${
        this.hourlyRate * this.workingHoursPerWeek

클래스 내에서 멤버변수를 나타내는 fullName 앞에서 _ (underscore) 를 넣어 준다.

Getter 를 사용하기 위해서 키워드 get 을 타이핑 해준다.

get fullName (){
	return this._fullName;
}

get 프로퍼티 이름 fullName 을 타이핑 해준다.

그리고 괄호와 중괄호를 순서대로 넣어준다.

중괄호 속에는 getter 가 불려질때 실행될 코드이다.

중괄호 속에 return this._fullName 을 입력해 준다.

.

set fullName (value: string){
	 this._fullName = value;
}

setter 도 getter 와 마찬가지로

set 키워드를 넣어주면 된다.

getter 와 같은 fullName 을 이름으로 타이핑 해준다.

그리고 괄호와 중괄호를 순서대로 넣어주면 된다.

setter 에서는 괄호 안에 전달될 매개변수와 그 타입을 넣어준다.

그리고 중괄호 안에는 전달된 매개변수의 값을 비공개 fullName 매개변수의 값으로 재 할당 하는 코드를 넣어준다.

get fullName (){
	return this._fullName;
}

set fullName (value: string){
	 this._fullName = value;
}

여기서 getter 와 setter 를 보면 get 과 set 키워드 뒤에 나타나는 코드 는 함수 메소드의 형태를 보여준다.
getter 와 setter 가 일반적인 클래스 메소드와 다른점은 상태를 나타낸 public 멤버 변수 들과 같은 방법으로 클래스 외부에서 getter 와 setter 에 접근이 가능하다.

Constructor 의 매개변수에 Access Modifiers 직접 적용

class Employee {
  fullName: string;
  age: number;
  jobTitle: string;
  hourlyRate: number;
  workingHoursPerWeek: number;

  //
	constructor(fullName:string, 
                 age:number,
                 jobTitle:string,
                 hourlyRate: number,
                 workingHoursPerWeek: number) {

🔽

class Employee {

	constructor(
  		private _fullName:string, 
        private _age:number,
        private _jobTitle:string,
        private _hourlyRate: number,
          public workingHoursPerWeek: number) {

이렇게 constructor 매개변수 앞에 access modifiers 를 붙여주면
access modifiers 가 사용된 constructor 매개변수는 암묵적으로 클래스의 필드 멤버 변수로 선언이 된다.

객체가 생성될때, 컨스트럭터의 매개변수로 전달된 값은, 객체의 프로퍼티 값으로 자동으로 그 값이 초기화 되고 할당된다.

profile
🐰와 🐢에 🐢

0개의 댓글