문제:
ApiService의 getTodaysToons method를 다른 클래스에서 호출하려 했더니 제목의 에러가 발생함.
에러 뜻풀이:
인스턴스 멤버는 정적 접근으로 사용할 수 없다.
- 인스턴스 멤버: 클래스의 객체를 생성해야만 사용할 수 있는 변수나 메서드
- 정적 접근: 클래스 이름으로 직접 접근하는 방식 (객체 생성 없이)
즉, 위 상황에서 ApiService의 멤버 함수인 getTodayToons는
ApiService의 객체를 통해서만 접근이 가능한데
객체를 생성하지 않고 접근하려 하기 때문에 에러가 발생하는 것이다.
인스턴스를 생성하는 방법은 ApiService 뒤에 ()를 붙여 생성자를 호출하면 된다.
처리해주면 이렇게 에러가 사라진 모습을 볼 수 있음
만약 getTodayToons 메서드에 정적으로 접근하고 싶다면 아래와 같이 static 키워드를 함수 선언에 붙여주면 된다.
정리해보자.
인스턴스를 통해 getTodayToons에 접근하고 싶다면 static 없이 함수 선언을 해주면 되고
정적 접근을 통해 getTodayToons에 접근하고 싶다면 static을 붙여서 함수 선언을 해주면 된다.
이제 에러 없이 getTodayToons 함수에 원하는 방식으로 접근할 수 있게 되었다.
그런데 getTodayToons에는 static을 붙여야 할까, 말아야 할까?
바꿔 말해 getTodayToons는 인스턴스 접근이 적절할까, 정적 접근이 적절할까?
한번 더 들어가 보자, getTodayToons를 사용하기 위해서 객체를 생성해야 할까 말아야 할까?
객체를 왜 생성해야 되느냐는 질문에 답할 필요가 있다.
1. 객체를 생성해야 하는 경우
class BankAccount {
String owner;
double balance;
BankAccount(this.owner, this.balance);
void withdraw(double amount) {
balance -= amount;
}
}
// 각 계좌마다 다른 주인과 잔액이 필요 → 객체 생성 필수
BankAccount account1 = BankAccount("철수", 1000);
BankAccount account2 = BankAccount("영희", 5000);
account1.withdraw(100); // 철수 계좌에서만 출금
account2.withdraw(200); // 영희 계좌에서만 출금
2. 객체를 생성할 필요가 없는 경우
class MathHelper {
static double add(double a, double b) {
return a + b;
}
static double multiply(double a, double b) {
return a * b;
}
}
// 계산기는 각자 다른 상태가 필요 없음 → 객체 생성 불필요
double result1 = MathHelper.add(5, 3);
double result2 = MathHelper.multiply(4, 2);
위와 같이 독립적인 상태가 필요하면 객체를 생성해야 하고
필요 없으면 객체를 생성하지 않아도 된다.
다시 말해, 이 독립적인 상태를 이용할 필요가 있으면 해당 메서드는 인스턴스 접근으로 구현해야 하고
필요 없으면 정적 접근으로 구현해야 한다는 뜻이 된다.
다시 getTodayToons로 돌아가 보자.
이 함수는 static을 붙여야 할까 말아야 할까?
class ApiService {
String baseUrl = 'https://webtoon-crawler.nomadcoders.workers.dev';
String today = "today";
Future<List<WebtoonModel>> getTodaysToons() async {
List<WebtoonModel> webtoonInstances = [];
final url = Uri.parse('$baseUrl/$today');
final response = await http.get(url);
if (response.statusCode == 200) {
final List<dynamic> webtoons = jsonDecode(response.body);
for (var webtoon in webtoons) {
webtoonInstances.add(WebtoonModel.fromJson(webtoon));
}
}
print(webtoonInstances);
return webtoonInstances;
}
throw Error();
}
getTodayToons는 baseURL과 today라는 클래스 변수에 의존하고 있다.
baseURL과 today의 특성을 생각해보면 이 둘은 굳이 독립적인 상태를 가질 필요가 없다.
URL을 https://google.com으로 바꿔버리면 이 함수의 기능을 수행할 수가 없으므로 당연한 일이다.
그러므로, baseURL과 today에 static을 붙여 독립적인 상태를 갖지 못하도록 하고
거기에 추가로 const를 붙여 절대로 이 변수 안의 내용물들이 변화하지 않도록 막은 다음
getTodayToons에 static을 붙여 구현해야 한다.
한 줄 정리:
어떤 메서드가 클래스 변수에 의존하고, 이 클래스 변수가 독립적인 상태를 가질 필요가 없다면
둘 다 static을 붙여 구현하는 것이 합리적이다.
참고:
'프레임워크 > flutter' 카테고리의 다른 글
[Flutter]개발 효율 2배 높이는 VS Code 설정 (0) | 2024.07.05 |
---|---|
[Flutter]꼭 알아야 할 플러터 핵심 개념 (0) | 2024.01.01 |
[아이디어]본격적으로 코드를 짜기 전에 이렇게 하면? (0) | 2023.12.24 |
[Flutter]app_time_stats (0) | 2023.12.08 |
[Error]FontawesomeIcon 인식 안됨 (0) | 2023.12.05 |