클래스 내 private 한 멤버변수 _water 에 값을 새로 할당하고 싶을 때
set water(value: number): void {
this._water += value
}
이거랑 그냥 일반 메소드로 해서
pourWater(value: number): void {
this._water += value
}
이거랑 차이가 뭐가 다른가요?
둘 다 스코프안에서 value 에 이상한 값 들어오면 에러처리 할 수도 있고..
왜 굳이 세터를 사용하는거죠?!
자바만 봐도 이름만 setWater 인 세터개념의 "메소드" 잖아용..
타스에선 set 이라는 빌트인이 있는걸로 봐서 분명 쓸모가 다를거 같은데 아무리 생각해도 모르겠네요.. ㅠㅠ
전자는 instance.pourWater(30) 이렇게 사용하지만
후자는 instance.water = 30 이렇게 사용하는 차이밖에 모르겠어용
bottle.pourWater(2000) vs bottle.water = 2000
결국 private 멤버변수를 public 처럼 쓰려고(그치만 핸들링은 하기 위해서) setter를 사용하는 건가요?
엄밀히 말하면 필드의 관리 전략/권한 관리 때문입니다. 모든 필드를 public으로 선언하게 되면 그 필드의 변경이 제한없이 아무대서나 가능한건데 오입력 등으로 인한 에러 추적이 힘들어집니다. 예를들어 Human Class 에 float으로 pos라는 위치를 나타내는 변수가 있고 -1~1 사이의 값을 갖는다고 할 때 setter 메소드 내에 value 범위 체크를 수행하게 하여 오입력을 방지할 수 있는데 public이면 언놈이 무지성으로 100 때려박으면 100이 들어가서 문제가 되니까요.
친절한 답변 감사합니다. 프라이빗한 필드를 세터대신 메소드로 재설정하는 방법도 세터처럼 오입력을 방지할 수 있는데 그부분에 관해서는 어떤 차이가 있는지요? setter pos() 설정 후 humanInstance.pos = 1 이 아닌 setPos(1) 이런 식으로요
본질은 다르지 않음. 호출자의 입장에서 객체의 속성에 접근할때 메서드의 형태로 호출하느냐(Java의 getter/setter) 아니면 멤버 변수를 참조하듯이 하느냐(c#, js). 후자가 더 직관적으로 보이기때문에 가독성이 좋다고 생각함. - dc App
감사합니다. 결국 동작은 같지만 세터로 인하여 프로퍼티가 private임에도 불구하고 손쉽게(다른 코드들과 스타일이 같게) 접근할 수 있기에 세터를 사용하는 거라고 이해했습니다. 혹시 세터와 메소드의 차이가 표기법 말고도 더 있을까요? 스코프 내의 코드가 같다면 대입연산자와 함수 호출의 차이일거 같은데 어떤 점이 있는지 설명해주시면 정말 감사하겠습니다.. 찾아봐도 쉽게 나오지가 않네요
기능상의 차이는 없구 하려는 동작에 따라 다르겠지. 예시로 들어준 코드에서 pourWater의 경우 물을 붓는 행위니까 water가 누적되는게 맞는데, set water는 호출자 입장에서 대입하듯이 쓰는데 실제로 누적이 된다면 이상하다 생각해 - dc App
난 타스는 모르지만 자바 기준으로 설명하면 메소드가 세터랑 똑같이 만들었으면 당연히 똑같이 동작하고 차이가 없겠지. 굳이 차이점을 찾자면 1. IDE에서 자동생성이 가능하고 2. 이름이 정해져 있어서 다른 사람이 세터라는걸 바로 알 수 있다? 정도... 네이밍도 꽤 중요해.
JS/TS에서의 게터/세터 호출은 프로퍼티 접근과 문법이 동일함
타스 사양이 아니라 자스 사양임. setWater보다 obj.water = some 이렇게 하는게 더 직관적이라 그럼. 그리고 이게 프록시 패턴이랑도 연결되는데, 대입연산시 후킹을 하고 싶을 때 사용됨. 개인적으로도 setWater 같은 방식보다는 세터, 게터 쓰는게 더 낫다고 봄
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Proxy