개발자
Getter 함수와 Setter 함수가 이해가 가지 않습니다. 객체 안의 값을 조회하거나 수정할 때 굳이 Getter이나 Setter 함수를 쓰지 않아도 되는데 왜 굳이 저 두 함수를 설정해야 하는 건가요...? 두 함수의 필요성에 대해 쉽게 설명해 주시면 감사하겠습니다...ㅠ
답변 3
인기 답변
객체가 가지고 있는 값에 대한 직접적인 접근을 막아서 1. 외부로부터의 접근에 대해 2. 확장된 객체의 접근에 대해 내부 상태를 보호한다고 알고 있어요 (사실상 모두 외부로 볼 수 있죠) A. 외부로부터의 접근에 대해 값의 변경/조회에 대한 보호 - (set) 수온을 50도 이상으로 설정하면 안돼요 - (get) 주민등록번호를 모두 노출시켜서는 안돼요 B. 확장된 객체의 접근에 대해 값의 변경/조회에 대한 보호 ex) 50도 이상 설정이 불가능한 celsius 온도 보일러를 확장시켜 fahrenheit 온도를 사용할 수 있는 보일러를 만들었어요 - (get) 가지고 있는 celsius 온도를 fahrenheit 온도로 보여줘요 - (set) 입력된 fahrenheit 온도를 celsius 온도로 보여줘요 이때 set 에 대해서 F보일러는 값의 변환만 추가하고, 기존의 C보일러에서 값에 대한 직접적인 접근을 막기 때문에 온도 체크는 기능 충돌 없이 작동할 수 있어요. ```js class CTempBoiler { #temperature = 25 get temperature() { return this.#temperature } set temperature(value) { if(value >= 50) throw new Error('Too High') else this.#temperature = value } } function fTempToCTemp(fTemp){ return (ftemp * 9/5) + 32 } function cTempToFTemp(cTemp){ return (cTemp - 32) * 0.5556 } class FTempBoiler extends CTempBoiler { constructor(){ super() } get temperature() { return cTempToFTemp(super.temperature) } // get temperature() { return cTempToFTemp(super.#temperature) } ERROR set temperature(value) { super.temperature = value} } const fTempBoiler = new FTempBoiler() fTempBoiler.temperature = 30000 ``` 또한 private field + getter,setter를 통해서 클래스 확장시에 이름이 동일한 필드가 겹쳐 사라지는 일도 막을 수 있습니다. ```js class Animal { #countInPrivate = 101 publicValue = 3 get count() { return this.#countInPrivate } set count(value) { this.#countInPrivate = value} } class Dog extends Animal { #countInPrivate = 201 publicValue =4 constructor(){ super() } get count() { return this.#countInPrivate } set count(value) { this.#countInPrivate = value} get superCount() { return super.count } set superCount(value) { super.count = value } } ```
익명
작성자
2023년 02월 03일
오 내부 상태 보호를 위해서군요! 친절하고 자세한 답변 덕분에 많이 배워 갑니다. 짱이에요!
인기 답변
js 에서 게터/세터가 어찌 쓰이는지는 모르겠지만 ‘왜 필요할까?’ 에 대한 의문은 꽤 건강한 생각이라고 봅니다! 세터는 최대한 지양하고 게터 역시도 객체 간 협력에선 없는게 더 좋다고 생각합니다!!
익명
작성자
2023년 02월 03일
감사합니다😊 더 열심히 공부해 볼게요!!
삭제된 사용자
2023년 07월 31일
단순히 값을 세팅하거나, 돌려주는 용도로서의 접근자로써만 생각하신다면, 존재 이유에 대해 의문을 가지실수 밖에 없습니다 하지만, getter/setter 코드에 안전장치가 추가 된다고 생각하시면 쉽습니다. 로직이 방대해지고 복잡해지면 접근자에 안전장치 추가 필요성이 자연스레 느껴 지실 텐데요, 처음부터 getter/setter로 생성하셨다면 리팩토링도 필요 없지만 그렇게 하지 않으셨다면, 리팩토링이 쉽지 않습니다.
익명
작성자
2023년 08월 09일
감사합니다!!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
지금 가입하면 모든 질문의 답변을 볼 수 있어요!