getter & setter 가 필요한 이유

With·2021년 9월 6일
0

getter가 필요한 이유

class User {
    constructor() {}

    internalAge: number = 4;
    sayHello: string = `나는 ${this.internalAge} 살 입니다.`;
  }

  const user = new User();

  user.internalAge = 10;
  console.log(user.sayHello);

  user.internalAge = 20;
  console.log(user.sayHello);

  user.internalAge = 30;
  console.log(user.sayHello);

user.internalAge에 직접 접근해서 나이를 10으로 수정하고, user.internalAge를 활용해서 현재 나이를 알려주는 sayHello를 콘솔에 찍으면 처음 값은 10으로 업데이트 되어 표시되지만, 그 이후 20, 30은 업데이트 되지 않은 채 콘솔에 찍힌다.

class 내부의 속성을 활용하여 어떤 연산이 할때 get을 사용하지 않으면 연산에 사용되는 속성 값의 최신화를 보장할 수 없다. 그래서 이 경우에는 get을 사용해야 한다.

class User {
    constructor() {}

    internalAge: number = 4;
    get sayHello(): string {
      return `나는 ${this.internalAge} 살 입니다.`;
    }
  }
// get을 적용할 속성 앞에 get을 넣어주고, 
// 함수의 형태로 변경하여 return 할 값을 넣어준다.

  const user = new User();

// get keyword를 사용했을 때, 마치 sayHello가 함수의 형태
// 같지만 속성값을 사용하듯 user.sayHello 로 사용한다.
  user.internalAge = 10;
  console.log(user.sayHello);

  user.internalAge = 20;
  console.log(user.sayHello);

  user.internalAge = 30;
  console.log(user.sayHello);

get 키워드를 사용하면, user.internal을 변경할 때마다 정확하게 업데이트 하여 연산한다.

setter가 필요한 이유

class 내부에서 선언한 맴버변수를 private 접근제어를 설정하면, class 외부에서 바로 접근 할 수 없다. 이 경우 setter 를 통해서 우회적으로 class 내부의 값을 변경해줄 수 있다.

class User {
  private internalAge = 4;
  
  /* 
  맴버변수 internalAge가 private 이기 때문에 
  class 외부에서는 접근 조차 할 수 없기 때문에 
  get 을 이용한 age로 접근하도록 한다.
  */
  get age():number {
    return this.internalAge
  }
  
  set editAge(num: number) {
    return this.internalAge = num;
  }
}

const user = new User();
user.editAge = 20;
console.log(user.age) // 20

class내부에 internalAge를 선언했고, private로 접근제어 했기 때문에 이것을 우회적으로 접근할 수 있는 get age(), 그리고 이것을 수정할 수 있는 set editAge()를 사용했다.

추가

getter와 setter를 사용하면 우회적으로 class 내부의 맴버변수에 접근하고 수정할 수 있기 때문에 validation 이나 추가적인 연산이 가능하다.

예를 들어 user.age = 10; 와 같은 방식으로 class 외부에서 age라는 값을 수정할 수 있다면 조건을 설정하기 까다롭지만, get과 set을 이용하면 editAge(num: number) { if (){} } 등과 같이 조건문 등을 이용하여 validation을 할 수 있을 것 이다.

profile
주니어 프론트엔드 개발자 입니다.

0개의 댓글