get 과 set

이준교·2023년 4월 12일
0

javascript 에서 get 과 set이란

getter = 객체의 속성(property)값을 반환하는 메서드 / property를 읽을 때 동작
setter = 객체의 속성 값을 설정, 변경하는 메서드 / property에 값을 쓸 때 호출
get 과 set 은 같이 사용

왜 get 과 set을 사용하는가?

// user에 직접 접근가능
let person = {
	name : "js"
    }
   
user.name = "javascript"

-------------------------------
// get과 set을 사용
let person = {
	name : "js",
   
	getName() {
    	return person.name ;
    },

    setName(value) {
    	person.name = value;
    }
}

person.setName("javascript")
  • 안전성
    객체에 직접 접근하여 수정 가능하지만 그럴 경우 속성에 직접 접근을 하여 원치않는 값이 임의로 입력되거나 수정 될 수 있음
    get 과 set을 사용 할 경우 값에 접근하는 것을 우회시키기 때문에 (setName) 객체 내부의 변수는 내부에서만 사용
    메서드 안에서 다양한 조건 체크 및 수정등이 가능하게 하여 유지보수성을 높일 수 있음

  • 보안성
    객체 내부 속성에 직접 접근하지 않아 객체의 정보를 숨겨 보안을 강화

언제 사용하면 좋을까?

function User(name, age) {
  this.name = name;
  this.age = age;
}

let Choonsik = new User("춘식이", 3);

alert( Choonsik.age ); // 3
----------------------------------------------------
// age 보다 birthday가 정확하여 수정이 필요해 진 상태

function User(name, birthday) {
  this.name = name;
  this.birthday = birthday;
}

let Choonsik = new User("춘식이", new Date(2020, 7, 20));

위 코드처럼 수정 할 경우 age가 사용 된 부분을 모주 수정해야한다. (시간이 오래 걸리고 어디에 age가 사용된 지 다 알 수 없.......)
또 age를 User에 남겨둬도 무방한 경우 혹은 다른 방식이나 협업하는 다른 사람이 사용 할 여지가 있어 남기고 싶은 경우도 있을 수 있다.

function User(name, birthday) {
  this.name = name;
  this.birthday = birthday;

  // age는 현재 날짜와 생일을 기준으로 계산됩니다.
  Object.defineProperty(this, "age", {
    get() {
      let todayYear = new Date().getFullYear();
      return todayYear - this.birthday.getFullYear();
    }
        
  });
}

let Choonsik = new User("춘식이", new Date(2020, 7, 20));

alert( Choonsik.birthday ); // birthday를 사용
alert( Choonsik.age );      // age 역시 사용 가능

위 처럼 getter와 setter을 사용 할 경우 언제 어디서든 프로퍼티의 행동과값을 조정할 수 있다.

Object.defineProperty()는 객체의 속성을 정의하고 수정하는 메서드로 ES6가 나오기 전 ES5에서 많이 사용, 현재는 가독성이 떨어지고 디버깅이 어려울 수 있어 사용 빈도가 감소하는 추세라고 함!

getter와 setter 사용 중 Maximum call stack size 라는 문구와 함께 무한 루프에 빠질 수 있다. 이때는 _를 사용하자
`
참고_ko.javascript.info
참고_inpa.tistory

profile
어떻게든 해내는 개발자, 이준교입니다

0개의 댓글