Study/Actionscript 3.0

setter/getter

chacolina 2009. 2. 24. 04:01
제목 : 갑작스런 궁금증, Setter, Getter에 관해서
글쓴이: 손님(guest) 2005/08/16 09:38:21 조회수:196 줄수:26

은닉성이다 뭐다 해서 멤버 변수를 private으로 하고

Setter, Getter를 만들어 쓰는 것이 습관이 되었습니다.

자바를 막 배우는 동생이 물었습니다.

뭐 하러 이렇게 쓰냐고.

저는 은닉성이 어쩌고 저쩌고, 멤버변수에 접근 못하게 하려고 라고 말했지만,

왜, 이게 멤버변수에 접근 못하는 거야? 결국, Setter, Getter로 다 접근하잖아.

라는 말에 명확히 대답을 주지 못하겠더라구요.

생각해보면 결국은 public처럼 쓰는데, 무슨 은닉성이고 접근금지인지 모르겠네요.

Reflection을 생각하지 않은 상태에서 은닉성만을 놓고 봤을때.

Setter, Getter를 왜 쓰는지. 저는 설명하지 못하겠습니다.

왜 필요한것일까요.

그냥 public으로 선언해서 쓰면 왜 않될까요.


제목 : Re: Setter Getter
글쓴이: 서민구(guest) 2005/08/16 14:13:51 조회수:76 줄수:73

네.. 말씀하신대로 다 접근할 수 있죠.

그렇지만, setter/getter가 필요한 이유가 있습니다.

(1) 예를들어, '나이'를 변수로 선언한다고 하면

class Person
{
private int age;
public int getAge() { return age; }
public void setAge(int age) {
if (age < 0) throw RuntimeException();
this.age = age;
}
...
}

첫번째는 이와같이, 사용자의 입력값을 검증하는데 쓰일 수 있다는 것이구요.
이런의미에서 값의 갱신이 어떻게 이루어져야하는가 (여기서는 나이가 음수일수
없다는 규칙)에 대해서 외부로 부터 숨길 수 있게 됩니다.

이 경우는 간단하니까 - 나이가 음수면 안된다는 것은 너무나 상식적이므로 - 그냥
외부에서 잘 넘겨주어도 될 것 같다는 생각이 들 수 있지만, 좀더 복잡한 속성이라면
갱신시 필요한 규칙을 모두 따져주기가 힘들 수 있겠죠.

이 역할을 getter나 setter가 담당합니다.


(2) 때로 getter/setter 는 readonly/writeonly 의 구현에도 사용될 수 있습니다.
이 경우는 변수의 모든 측면에 '다 접근할 수 없는' 예가 되겠죠.

class Person
{
private int age;
public int getAge() { return age; }
private void setAge(age) { if (age<0) throw RuntimeException(); this.age = age; }
public Person(age) { setAge(age); }
}


(3) 메소드 선언은 미래의 확장을 위한 것입니다.

예를들어 Person에서 Child와 Adult가 구분된다고 해보죠.
그리고 Adult가 되는 기준을 18세라고 해보겠습니다. 그렇다면,

class Adult extends Person
{

public void setAge(int age) {
if (age < 18) throw RuntimeException();
super.setAge(age);
}
}

와 같이 구현할 수 있을 것입니다.

만약 이 경우에 Person의 age가 메소드가 아니라 단지 변수였다면
그렇다면 '나이'에 대한 규칙을 이렇게 쉽게 오버라이딩 할 수 있었을까요?

메소드로 선언하거나, 클래스로 만들거나 하는 것은 리팩토링에서도 나오듯이
미래의 확장을 위한 대비책입니다.

if (복잡한 수식) { ... }



if (checkCondition(var1,var2,...)) { ... }

로 바꾸는 것도 조건 수정이 쉽게 되게 하기 위해서죠...
getter/setter도 마찬가지입니다.


제목 : Re: 상황에 따라 적절히 사용하는 건 어떨까요?
글쓴이: 손님(guest) 2005/08/16 15:01:52 조회수:33 줄수:5

모든 변수를  private 선언하고 public 함수로 접근하는 것 보다는 

상황에 따라 public 변수 선언하고 막바로 참조하는 것도 실제 코딩에선 효률적인 듯합니다.

제목 : Re: 답변 감사드립니다.
글쓴이: 질문자(guest) 2005/08/16 22:42:13 조회수:42 줄수:15

도움이 많이 되었습니다.

서민구님께 마지막 한가지만. ^^

어떤 기능이 들어간 경우 말고.

private 멤버변수,Setter/Getter 와 public 멤버변수 는

은닉성 관점에서 차이가 없는거라 볼 수 있는건지...요?

기능의 추가등 확장성의 관점에서는 Wrapper의 성격을 부여할수 있지만.

요즘은 여러가지로 헷갈리네여 ^^;

제목 : Re: 다른분이 대답해주시면 더 좋겠지만
글쓴이: 서민구(guest) 2005/08/17 04:51:37 조회수:60 줄수:17

저도 잘 알지 못하는지라;;

말씀하신대로,
private 으로 해놓고 단순히 값대입만 하는 setter와 단순히 값을 돌려주는
getter가 있는 경우와

public으로 선언한 경우에

은닉의 관점에서 생각하면 아무런 차이가 없습니다.


앞의 손님께서 이야기하신대로,
미래에 확장이 일어나지 않을 것이 확실하다면
사실 다 public 으로 선언해도 아무런 문제가 없을 듯 싶습니다.


제목 : Re: 이른 글도 있었네요.
글쓴이: 손님(guest) 2005/08/17 10:52:00 조회수:65 줄수:1

http://www.javaservice.net/~java/bbs/read.cgi?m=resource&b=servlet&c=r_p&n=1101235984

[출처] setter,getter|작성자 말라


전에 자바를 공부하면서 대체 왜 세터와 게터를 쓰는 걸까 하고 궁금해 했는데, C++ 책을 읽으면서 알게 됐다. 클래스안의
protected한 변수에 접근하기 위해서는 멤버함수 (클래스 안에 정의 되어진 함수) 를 이용하거나 friend 키워드를
통해서 접근해야 하는데 이때에 protected한 변수를 쉽게 접근할 수 있게 미리 만들어 놓은 게터와 세터를 이용하게 되는
것이다.(게터와 세터 역시 멤버함수이다) 굉장히 간단한 사실이지만 프로그래밍 초보인 나는 이 사실을 알아내고 굉장히 신기해




했다는;; ㅎㅎ