프로그래밍iOS 개발자

스위프트에서 private/protected/internal/public/open 접근 제어 원리를 설명하십시오. 각 수정자를 언제 사용하는 것이 좋으며, 실제 프로젝트에서 어떤 오류에 직면할 수 있습니까?

Hintsage AI 어시스턴트로 면접 통과

답변

스위프트에는 타입 구성원(속성, 메서드 등) 및 타입 자체에 대한 다섯 가지 접근 수준이 있습니다:

  • open — 가장 높은 공개 수준. 모듈 외부에서도 상속하고 재정의할 수 있습니다.
  • public — 모듈 외부에서 접근 가능하지만 재정의/상속할 수 없습니다.
  • internal (기본값) — 모듈 내에서 접근 가능합니다.
  • fileprivate — 파일 내에서만 접근 가능합니다.
  • private — 선언 범위 내에서만 접근 가능합니다 (extension도 이 범위에 포함됩니다).

사용 규칙:

  • 외부 선언에서 보이지 않아야 하는 논리에는 private를 사용하십시오.
  • 동일한 파일 내에서 데이터 교환이 필요할 때 fileprivate를 사용합니다 (예: 두 개의 연관된 extension 간).
  • internal — 모듈에서 공개적으로 사용되는 모든 것의 기본값입니다.
  • public/open — 다른 모듈/프레임워크에서 사용되는 API를 위해.

예제:

open class MyOpenClass {} public class MyPublicClass {} internal class InternalClass {} fileprivate class FilePrivateClass {} private class PrivateClass {}

교훈이 있는 질문

클래스 설명에서 open과 public의 차이는 무엇입니까? 모든 public 클래스가 상속 가능하지 않은 이유는 무엇입니까?

답변: open은 클래스/메서드를 모듈 외부에서 재정의 및 상속 가능하다고 표시합니다. public은 사용에 대한 접근만 열어주지만, 모듈 외부에서 상속할 수는 없습니다. 한편으로는 구현을 원치 않는 변경으로부터 보호하고, 다른 한편으로는 필요한 확장 지점만 개방합니다.

public class PublicClass {} open class OpenClass {} // 다른 모듈에서: class InheritFromOpen: OpenClass {} // OK class InheritFromPublic: PublicClass {} // 오류!

주제에 대한 세밀한 지식 부족으로 인한 실제 오류 사례


이야기

공통 라이브러리에서 클래스가 public으로 표시되었고 외부 프로젝트가 이를 확장하려고 메서드를 재정의했습니다. 프로젝트는 public과 open의 차이에 대한 잘못된 이해로 인해 컴파일되지 않았습니다 — 팀에는 인터페이스를 수정하는 데 추가로 일주일이 소요되었습니다.


이야기

한 파일 내에서 extension에서 private 속성에 접근하려고 했으나 속성이 fileprivate이 아닌 private로 선언되었습니다. 이로 인해 컴파일 오류가 발생했으며, 이는 통합 빌드에서만 발견되었습니다.


이야기

여러 프레임워크로 구성된 애플리케이션에서 모든 타입이 internal로 표시되었습니다 (기본값). 모듈 간에 타입을 사용해야 할 때 인터페이스에 접근할 수 없었고 — 공개를 위해 수십 개의 선언을 public으로 다시 작성해야 했습니다. 이는 추가 시간과 테스트를 소모했습니다.