지난 스터디에서 class와 constructor를 알아보았다.
이번 스터디에서는 Getter와 Setter라는 것에 대해 알아보려 한다.
실습을 진행하기 전에, 간단한 기능을 가지는 class를 하나 선언하여 준비한다.
void main() {
Color color = new Color(
name: 'red',
group : 'A'
);
color.sayName();
}
class Color {
String name;
String group;
//네임드 파라미터를 사용하는 생성자 하나 선언
//중괄호의 유무
Color({
String name,
String group
}) : this.name = name,
this.group = group;
void sayName(){
print('이 색은 ${this.name}입니다.');
}
}
이 색은 red입니다.
Getter와 Setter를 알기전에 먼저 Private변수에 대해 알아야 하는데, 일단 선언하는 방법은
변수명에 _언더바를 붙여주면 된다.
class Color {
String name; -> String _name;
String group; -> String _group;
}
언더바를 붙이면 Private 변수로 사용된다. 보통 JAVA에서는 Private변수의 경우 소속된 class에서만
사용이 가능하지만, Dart의 경우 같은 파일내에 존재하는 영역에서는 어디서나 가져와서 사용이 가능하다.
그럼 변경된 Private변수명에 맞게 class내부를 수정 후, 출력해보자.
void main(){
Color color = new Color(
name: 'red',
group : 'A'
);
print(color._name);
}
class Color {
String _name;
String _group;
Color({
String name,
String group
}) : this._name = name,
this._group = group;
void sayName(){
print('이 색은 ${this._name}입니다.');
}
}
red
main 함수의 print함수를 보면 color클래스의 _name을 호출하고 있다.
_name은 color클래스의 프라이빗 변수로 선언되어 있음에도 불구하고, 같은 파일내에 있기때문에
Dart의 특성상 사용할 수 있는것이다.
만약 위 소스에서 main 함수와 class가 다른 파일에 있었다면 에러가 발생했을 것이다.
그럼 다른 파일에 선언되어 있는 경우엔 어떻게 불러와서 사용할 수 있을까?
이때를 위해 바로 Getter와 Setter가 존재하는 것이다.
선언은 class안에 아래와 같이 한다.
class Color {
String _name;
String _group;
Color({
String name,
String group
}) : this._name = name,
this._group = group;
void sayName(){
print('이 색은 ${this._name}입니다.');
}
get name{
return this._name;
}
set name(String name){
this._name = name;
}
}
getter는 get 이름 형태로 선언하며, 보통 private변수명에서 언더바를 제거한 이름을 사용한다.
setter또한 set이름 형태로 선언하며, 값을 지정하는 역할을 하기 때문에 파라미터를 받게된다.(타입은 원하는 대로)
getter의 경우 호출하면 class의 private변수의 값을 리턴하도록 하고 있으며, setter의 경우 받은 파라미터를
class에 할당하는 역할을 하고 있다.
한번 호출해 보자.
void main(){
Color color = new Color(
name: 'red',
group : 'A'
);
print(color._name);
print(color.name);
color.name = 'blue';
print(color.name);
}
class Color {
String _name;
String _group;
Color({
String name,
String group
}) : this._name = name,
this._group = group;
void sayName(){
print('이 색은 ${this._name}입니다.');
}
get name{
return this._name;
}
set name(String name){
this._name = name;
}
}
red
red
blue
main 함수 내 정의된 첫번째 print의 경우, 같은 파일내 private함수가 있기 때문에 바로 호출하여
사용할수 있다는 것을 보여준 예시이고,
두번째 print는 getter를 이용하여 class안에 포함된 _name값을 리턴받아 출력하는 예시이다.
마지막 세번째는 setter를 이용하여, blue라는 값을 set후, getter를 이용하여 출력한 예시이다.
번외로 , 여기서 하나 드는 의문점.
아래와 같이 선언해서 써도 상관없는거 아닌가?
void getName(){
return this._name;
}
void setName(String name){
this._group = name;
}
상관없지만, 단순히 보면 소괄호의 사용유무 정도라고 할수 있는데, 때에 따라 get(ter) set(ter)로 간단하게
사용할 때가 있다. 언제 getter와 setter를 사용하는게 좋을지, 함수로 만들어서 사용해서 좋을지는
실제 프로그램을 만들다 보면 구분지어 쓸때가 있다.
오늘의 스터디 Getter와 Setter 끝.