서론
플러터 세미나 듣다가 제대로 알지 못했던 부분이라 정리하려고 한다.
보통 setter나 getter를 쓰긴해도 변수에서 받을 때 set , get 이렇게 작성한 적이 없다보니 확실하게 정리해보자
Getter
- 값을 가져올 때 사용
- 매개 변수가 없음
- 프라이빗 변수를 가져 올 수 있음
- 자바에서는 getName() 이런 식으로 사용했으나 다트에서는 좀 다름
Class Membership {
int _id;
int get id {
return this._id;
}
}
Setter
- 값을 세팅할 때 사용
- 요즘은 불변성을 추구한다고 하여 set으로 객체의 필드값을 변경하는 것은 좋지 않음
- 파라미터가 있어 해당 필드 값을 변경
Class Membership {
int _id;
int set id(int id) {
return this._id = id ;
}
}
사용법 1
- 자바에서는 함수 호출로 getter , setter를 사용하지만 다트에서는 변수처럼 사용한다.
- 값을 할당 = set , 출력 및 조회 = get
- 즉 그냥 변수를 쓰면 자연스럽게 set , get이 적용되는 것이다. print로 id를 출력하려고 print(membership.id) 를 사용하면 자동으로 get이 호출 되는 거고 id를 변경하려고 membership.id = 4; 로 변경하면 자동으로 set이 사용되어 지는 것
Class Membership {
int _id;
int set id(int id) {
return this._id = id ;
}
int get id {
return this._id;
}
}
근데 우린 보통 get ,set 저거 지정하지 않고도 잘만 객체에서 값 꺼내 쓰거나 조회하거나 잘 해왔는데 뭐 때문일까?
Implicit Getters and Setters
다트에서는 기본적인 속성에 대한 get, set을 자동으로 생성해주는 기능이 있음
해당 기능이 적용되어 있으니까 get, set 작성하지 않아도 클래스의 속성에 직접 접근 및 값의 변경이 가능하다고 한다.
다만 프라이빗의 경우는 명시적으로 작성해야 하는 듯
class Person {
String _name;
int _age;
String get name {
return _name;
}
void set name(String value) {
_name = value;
}
}
void main() {
Person person = Person();
person._age = 30; // 에러 발생: '_age'는 클래스 외부에서 접근할 수 없음
}
사용법 2
어플에서 값이 변화하거나 조회할 때마다 자동으로 get , set이 호출되는 형식이다 보니 값으 변화 혹은 로그를 남길 때 사용할 수도 있다.
turns라는 변수의 값의 변화에 대해 로그를 남기기 위해서 print를 남겨두면 해당 turns의 값이 갱신될 때마다 set함수가 호출되고 안에 있는 print도 호출되어 로그가 남게된다.
// 빌드 함수 안에 두면 늘 초기화 되니까 빌드 밖에
double _turns = 0.0;
double get turns => _turns;
set turns(double newTurns) {
// 내가 원하는 동작 수행
print("현재 $newTurns번째 회전");
_turns = newTurns;
}
void rotateButton() {
setState(() {
turns = turns + 1.0;
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
AnimatedRotation(
duration: const Duration(milliseconds: 500),
turns: turns,
child: IconButton(
onPressed: rotateButton, icon: const Icon(Icons.refresh)),
)
],
),
),
floatingActionButton: FloatingActionButton(
onPressed: showBottomModal,
tooltip: 'Increment',
child: const Icon(Icons.add),
), // This trailing comma makes auto-formatting nicer for build methods.
);
}
참고
https://dart.dev/language/methods
'프로그래밍 > 플러터' 카테고리의 다른 글
Expand 위젯 에러 : RenderFlex children have non-zero flex but incoming height constraints are unbounded. (0) | 2024.02.19 |
---|---|
Unable to boot the Simulator (0) | 2024.02.19 |
다트 비동기 프로그래밍 (1) | 2024.02.10 |
다트 객체지향 프로그래밍 (1) | 2024.02.10 |
다트 기본 문법 [변수 , 컬랙션, 람다] (1) | 2024.02.10 |
하고 싶은 걸 하고 되고 싶은 사람이 되자!
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!