invalid_use_of_protected_member — protected 멤버를 잘못된 위치에서 사용
invalid_use_of_protected_member — protected 멤버를 잘못된 위치에서 사용
@protected로 표시된 멤버를 선언된 라이브러리 밖이나 그 클래스의 서브클래스가 아닌 곳에서 참조하면 나타나는 진단이에요. protected 멤버를 어디서 쓸 수 있는지, 언제 이 오류가 터지는지 설명해 드릴게요.
본문
분석기는 @protected 어노테이션이 달린 getter, setter, 필드, 혹은 메서드가 선언된 라이브러리 밖이면서 그 클래스를 상속한 서브클래스가 아닌 곳에서 참조될 때 이 진단을 내보내요.
즉, @protected 멤버는 딱 두 곳에서만 쓸 수 있어요. 하나는 정의된 라이브러리 안, 다른 하나는 그 클래스의 서브클래스(자식 클래스) 안이에요.
예시
먼저 a.dart 파일에 아래 내용이 있다고 해볼게요.
import 'package:meta/meta.dart';
class A {
@protected
void a() {}
}
그런데 아래 코드처럼 A의 서브클래스가 아닌 곳에서 메서드 a를 호출하면 이 진단이 나타나요.
import 'a.dart';
void b(A a) {
a.a();
}
여기서 함수 b는 A의 서브클래스가 아니잖아요. 그래서 protected 멤버인 a()를 호출하는 게 허용되지 않는 거예요.
흔한 해결 방법
멤버가 @protected로 표시되는 게 합리적이라면, protected 멤버에 대한 참조를 없애고 그와 동등한 코드로 바꾸면 돼요.
반대로, 그 멤버가 @protected로 표시되는 게 합리적이지 않다면(그리고 수정할 권한이 있다면) 어노테이션을 제거해 주면 돼요.
더 알아보기
@protected어노테이션의 정의와 활용은package:meta문서를 확인해 보세요.- 클래스 상속과 멤버 접근 제어에 대한 기본은 Dart 언어 투어 — 클래스 문서를 참고하면 좋아요.