invalid_use_of_protected_member — protected 멤버를 잘못된 위치에서 사용

invalid_use_of_protected_member — protected 멤버를 잘못된 위치에서 사용

@protected로 표시된 멤버를 선언된 라이브러리 밖이나 그 클래스의 서브클래스가 아닌 곳에서 참조하면 나타나는 진단이에요. protected 멤버를 어디서 쓸 수 있는지, 언제 이 오류가 터지는지 설명해 드릴게요.

출처: invalid_use_of_protected_member

본문

분석기는 @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();
}

여기서 함수 bA의 서브클래스가 아니잖아요. 그래서 protected 멤버인 a()를 호출하는 게 허용되지 않는 거예요.

흔한 해결 방법

멤버가 @protected로 표시되는 게 합리적이라면, protected 멤버에 대한 참조를 없애고 그와 동등한 코드로 바꾸면 돼요.

반대로, 그 멤버가 @protected로 표시되는 게 합리적이지 않다면(그리고 수정할 권한이 있다면) 어노테이션을 제거해 주면 돼요.

더 알아보기

  • @protected 어노테이션의 정의와 활용은 package:meta 문서를 확인해 보세요.
  • 클래스 상속과 멤버 접근 제어에 대한 기본은 Dart 언어 투어 — 클래스 문서를 참고하면 좋아요.