본문 바로가기
Flutter/Error

플러터에서 Invalid use of a private type in a public API 에러 처리방법

by Maccrey Coding 2024. 7. 17.
728x90
반응형

 

플러터 개발 시 "Invalid use of a private type in a public API" (공개 API에서 비공개 유형 사용)라는 에러가 발생하면 다음 두 가지 방법으로 해결할 수 있습니다.

 

1. 비공개 유형을 공개화 (Make the Private Type Public)

  • 문제의 클래스, 변수, 또는 함수가 코드의 다른 부분에서 사용되어야 한다면 public 키워드를 사용하여 공개화를 고려해보세요. 이렇게 하면 다른 모듈에서 해당 요소에 접근하고 상호 작용할 수 있습니다.

주의사항: 너무 많은 요소를 공개하게 되면 코드 간의 결합도가 높아지고 유지보수가 어려워질 수 있으니 신중하게 판단해야 합니다.

 

2. API를 비공개화 (Make the API that uses the private type also be private)

  • 해당 요소가 현재 모듈 내부에서만 사용된다면, 비공개 요소를 사용하는 API 자체를 private 키워드를 사용하여 비공개화 하는 것을 고려하세요. 이렇게 하면 해당 기능과 비공개 요소 모두에 대한 접근을 제한할 수 있습니다.

예시:

// my_module.dart

class MyClass {
  // 비공개 변수
  int _privateValue = 10;

  // 공개 메서드 (비공개 변수 사용)
  void doSomethingPublic() {
    print(_privateValue); // 이것은 허용됩니다
  }

  // 비공개 메서드 (비공개 변수 사용)
  void _doSomethingPrivate() {
    print(_privateValue); // 이것은 허용됩니다
  }
}

// 오류가 발생합니다!
void useMyClassPublicly(MyClass obj) {
  print(obj._privateValue); // `_privateValue`는 비공개이므로 외부에서 접근할 수 없습니다.
}
 

해결 방법 1: PrivateValue를 공개화

 
class MyClass {
  // 이제 공개 변수입니다.
  int publicValue = 10;

  // 메서드 변경 없음 (이제 publicValue 사용)
  void doSomethingPublic() {
    print(publicValue); // 이것은 허용됩니다
  }

  // 메서드 변경 없음
  void _doSomethingPrivate() {
    print(publicValue); // 이것은 허용됩니다
  }
}

// 이제 문제 없이 사용 가능합니다.
void useMyClassPublicly(MyClass obj) {
  print(obj.publicValue); // 공개 변수에 접근합니다.
}
 

해결 방법 2: useMyClassPublicly를 비공개화

 
class MyClass {
  // 비공개 변수 (변경 없음)
  int _privateValue = 10;

  // 공개 메서드 (변경 없음)
  void doSomethingPublic() {
    print(_privateValue); // 이것은 허용됩니다
  }

  // 비공개 메서드 (변경 없음)
  void _doSomethingPrivate() {
    print(_privateValue); // 이것은 허용됩니다
  }

  // 비공개 메서드 (이제 비공개 요소 사용)
  void _usePrivateValuePublicly() {
    print(_privateValue); // 클래스 내부에서만 허용됩니다.
  }
}

// 외부에서 접근할 수 없습니다.
void useMyClassPublicly(MyClass obj) {
  // print(obj._privateValue); // 여전히 오류가 발생합니다.
  obj._usePrivateValuePublicly(); // 클래스 내부 메서드 호출만 가능합니다.
}
 

코드 구조와 원하는 접근 제어 수준에 따라 적절한 방법을 선택하세요.

비공개 유형을 공개화하거나 API를 비공개화하여 에러를 해결하고 코드 내부의 캡슐화를 유지할 수 있습니다.

 

728x90
반응형