일반 적으로 자바 C# 등등의 객체지향언어를 이용하여 개발하신 분들이라면 getter, setter는 아주 친숙한 내용일 것이다.
하지만, 자바스크립트에서는 전통적인 방법으로는 private 변수를 지원 하지 않기 때문에 _name 이런식으로 이름만 지어서 내부에서만 사용변수라는 표시만을 하여 내부 데이터이니 읽거나 쓰지 마세요 정도로 사용 하고 있다.
그렇다면 자바스크립트에는 getter, setter가 없을까?
접근자 프로퍼티(accessor property) get, set
getter, setter를 이용하는 이유 중에는 데이터를 신뢰하고, 복잡한 로직을 밖으로 노출 하고 싶지 않아서 일 것이다. 간단한 예를 들어보자.
const person = {}
person.age = -3
과연 사람 중에 -3 세인경우가 있을까? 뭐 개념적으로 2000년생의 경우 1997에 몇살이었냐고 물어본다면 가능하겟다만....
이럴 때 사용 가능 한 것이 get, set이다. 간단하게 코드를 변형 해보자.
const person = {
get age() {
return this._age
},
set age(age) {
if(age > 0) {
this._age = age
}
}
}
위 처럼 우리는 나이에 대해 정합성 체크를 하여 age속성을 사용 할 수 있게 되었다.
private 변수처럼 사용 해보기
위 처럼 특정 속성에 대해서 정합성이 필요 한경우 특정 데이터를 위한 모델일 가능성이 높다. Person이 필요 할 때마다 literal object로 매번 정의 하는 것은 꽤나 불편한 내용일 것이다. 이때는 class가 유용 하겠지만 사용하기 애매하다면 function또한 꽤 좋은 대체재라고 말하고 싶다.
function Person() {
let _age
Object.defineProperty(this, 'age', {
get() {
return _age
},
set(age) {
if (age > 0) {
_age = age
}
}
})
}
정의 방법은 그다지 어렵지 않다.
하지만 위처럼 객체 리터럴로 정의한것과 똑같이 작동을 하며, _age에 대한 값을 외부의 노출을 막는것도 확인 할 수 있다. 필요하다면 생성시에 초기값을 설정 하는 것도 가능 하니 필요한 경우에 꼭 써먹어보도록 하자.
댓글
댓글 쓰기