static GetIt get instance => _instance;
이 코드가 이해가 안가서 작성하는 글
static
과 =>
연산자의 의미
static
: 클래스의 인스턴스를 만들지 않고도, 해당 변수나 메서드에 접근할 수 있게 해주는 키워드=>
: 화살표(=>
)는 Dart에서 간결한 함수 표현식으로,return
을 사용하는 대신 값을 간단하게 반환할 때 사용한다.
문법 분석하기
이 부분을 보자:
static GetIt get instance => _instance;
static
:instance
라는 게터가 클래스의 인스턴스 없이도 바로 접근할 수 있음을 의미GetIt
: 이건 반환 타입. (겟잇 라이브러리는 일단 배제하자)instance
를 호출하면GetIt
타입의 값을 반환한다는 뜻.get
: Dart에서get
키워드는 게터를 정의할 때 사용됨.instance
는 메서드처럼 보이지만, 사실은 변수처럼 접근할 수 있는 속성=> _instance
: 이 부분은instance
를 호출할 때_instance
라는 변수를 반환한다는 뜻
즉
이 문법은 instance
라는 이름의 게터를 만든 거고, 이 게터는 _instance
라는 값을 반환한다. 여기서 중요한 건, 이 instance
는 클래스의 인스턴스를 만들지 않고도 접근할 수 있다는 점! (static
이기 때문).
예시로 이해해보자
만약 클래스에 이렇게 작성되어 있다면:
class MySingleton {
static final MySingleton _instance = MySingleton._internal();
MySingleton._internal(); // 프라이빗 생성자
static MySingleton get instance => _instance;
}
_instance
는 클래스 내부에서 생성된 유일한 인스턴스instance
게터를 통해MySingleton.instance
로 접근할 때마다_instance
를 반환함static
이기 때문에 클래스의 인스턴스를 만들지 않고도MySingleton.instance
로 접근할 수 있음.
이런 방식은 언제 사용하냐면?
이런 문법은 주로 싱글톤 패턴(Singleton Pattern)을 구현할 때 사용한다.
싱글톤 패턴은 앱 전체에서 하나의 인스턴스만 사용하는 것을 보장하는 패턴이다.
실제로 사용했을 때 앱에서 크게 사용 할 단위는 싱글톤 패턴은 안맞다는걸 알았다. 멀티 스레딩 문제도 있고, 단일책임의 원칙을 지키지 않는 형태로 발전 할 수 있기에 코드가 복잡해지고, 유지보수하기 어려워진다
정리
static
: 클래스의 인스턴스 없이도 접근 가능한 정적 멤버를 만들 때 사용한다get instance => _instance
: 클래스 내부의_instance
를 반환하는 게터를 정의한 거
그래서 MyClass.instance
라고 호출하면, 클래스의 유일한 인스턴스인 _instance
를 얻을 수 있는 거죠. 이렇게 하면 앱 전체에서 하나의 객체만 공유할 수 있게 됨!!
그렇다면 여기에 사용된 get, 그니까 gettetr setter 는 뭐지 ?
Getter와 Setter란?
- Getter: 클래스에 있는 특정 변수의 값을 가져올 때 사용하는 것
- Setter: 클래스에 있는 특정 변수의 값을 바꿀 때 사용하는 것
이 두 가지는 우리가 클래스 안에 있는 변수에 안전하게 접근하고, 그 값을 조절할 수 있도록 도와줌
왜 필요하쥐?
만약 우리가 게임 캐릭터의 체력
을 저장하는 변수를 만들었다고 해보자. 이때 캐릭터의 체력은 무조건 0에서 100 사이
여야함.
그런데 누군가가 실수로 체력 변수를 -10
이나 150
처럼 말도 안 되는 값으로 바꿔버린다면 문제가 생겨버린다. 나의 소중한 게임 시스템에..
이런 실수를 막기 위해 Getter와 Setter를 사용하는 것. 이걸로 값이 잘못 설정되는 걸 막고, 안전하게 값을 가져오거나 바꿀 수 있다. 내가 원하는 방식으로말이다.
예시
1. 기본적인 클래스 정의
class Character {
int _health = 100; // 체력 변수 (앞에 _가 붙으면 외부에서 직접 접근 못 함)
// Getter
int get health {
return _health;
}
// Setter
set health(int value) {
if (value < 0) {
_health = 0; // 0보다 작으면 0으로 설정
} else if (value > 100) {
_health = 100; // 100보다 크면 100으로 설정
} else {
_health = value; // 0~100 사이 값만 허용
}
}
}
2. 이 클래스 사용하기
void main() {
var myCharacter = Character();
// Getter 사용
print(myCharacter.health); // 100 출력
// Setter 사용
myCharacter.health = 120; // 100으로 설정 (100보다 큰 값이므로)
print(myCharacter.health); // 100 출력
myCharacter.health = -10; // 0으로 설정 (0보다 작은 값이므로)
print(myCharacter.health); // 0 출력
myCharacter.health = 75; // 정상 범위 값
print(myCharacter.health); // 75 출력
}
여기서 중요한 것
get health
: 캐릭터의 체력을 읽을 때 사용한다.myCharacter.health
라고 하면_health
값을 가져온다set health(int value)
: 캐릭터의 체력을 바꿀 때 사용한다.myCharacter.health = 50
처럼 쓸 수 있게 된다.
정리하면
- Getter는 값을 가져올 때 사용하는 함수
- Setter는 값을 설정할 때 사용하는 함수
흐흐 이제 저 코드가 제대로 다가온다✌️
'Flutter > Dart' 카테고리의 다른 글
Dart 클로저 {} 파헤치기 + 익명함수랑 클로저의 차이는 ? (0) | 2024.11.18 |
---|---|
멤버 변수 vs 상태 (0) | 2024.10.14 |
fromMap을 사용해 map데이터 쉽게 사용하기 (0) | 2024.09.19 |
Stream, Future 둘의 차이점은 뭐지? (2) | 2024.08.12 |
Enum이 뭐고, Enhanced Enum은 왜 쓸까? (0) | 2024.08.12 |