Swift - 접근제어

접근제어란

코드끼리 상호작용을 할 때 파일 간 또는 모듈() 간에 접근을 제한할 수 있는 기능입니다. 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공할 수 있습니다.

  • 접근제어의 필요성
    • 객체 지향 프로그래밍(OOP, Obejct-oriented programming)에서 캡슐화와 은닉화는 중요한 개념이고 잘 설계된 클래스를 만드는데 사용되는 기법입니다.
    • 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용할 수 있습니다.
    • 전체 코드를 노출하지 않고 꼭 필요한 부분만 제공하는 것을 통해 프로그래머에게 의도한 대로 코드 작성을 유도할 수 있습니다.

접근 수준

  • 스위프트에서는 접근 수준 키워드를 통해 접근제어를 구현할 수 있습니다. 타입(클래스, 구조체, 열거형 등)에 특정 접근수준을 지정할 수 있고, 타입 내부의 프로퍼티, 메소드, 이니셜라이저, 서브스크립트 각각에도 접근수준을 지정할 수 있습니다.
접근수준 키워드 접근도 범위 비고
개방접근수준 open 높음 모듈 외부까지 클래스에서만 사용
공개 접근수준 public 모듈 내부
내부 접근수준 internal 모듈 내부
파일외부비공개 접근수준 fileprivate 파일 내부
비공개 접근수준 private 낮음 기능 정의 내부

공개 접근수준

  • public 키워드 사용
  • 소스파일, 소스파일이 속해 있는 모듈 등 어디에서든 사용할 수 있다.
  • 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 많이 쓰입니다.
  • 스위프트의 기본 요소는 모두 공개 접근수준으로 구현되어 있습니다.

개방 접근수준

  • open 키워드 사용
  • 클래스와 클래스의 멤버에서만 사용할 수 있습니다.
    • 개방 접근수준을 제외한 다른 모든 접근수준의 클래스는 그 클래스가 정의된 모듈 안에서만 상속될 수 있습니다.
    • 개방 접근수준을 제외한 다른 모든 접근수준의 클래스 멤버는 그 멤버가 정의된 모듈 안에서만 재정의될 수 있습니다.
    • 개방 접근수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속될 수 있습니다.
    • 개방 접근수준의 클래스 멤버는 그 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의될 수 있습니다.

내부 접근수준

  • internal 키워드 사용
  • 기본적으로 모든 요소에 암묵적으로 저장되는 기본 접근수준입니다.
  • 보통 외부에서 사용될 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용될 경우 내부 접근수준을 지정하게 됩니다.

내부 접근수준으로 접근수준이 지정된 요소는 구현된 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있습니다.

파일외부비공개 접근수준

  • fileprivate 키워드 사용
  • 파일외부비공개 접근수준으로 접근수준이 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용할 수 있습니다.
  • 해당 소스파일 외부에서 값이 변경되거나 함수가 호출되면 부작용이 생길 수 있는 경우에 사용하면 좋습니다.

비공개 접근수준, private

  • private 키워드 사용
  • 비공개 접근수준으로 접근수준이 지정된 요소는 그 기능이 정의되고 구현된 범위 내에서만 사용될 수 있습니다.
  • 비공개 접근수준으로 지정된 기능은 심지어 같은 소스파일 안에 구현된 다른 타입이나 기능에서도 사용할 수 없습니다.

접근제어 구현 참고사항

  • 모든 타입에 적용되는 접근수준의 규칙은 '상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다.'입니다.
    • 비공개 접근수준으로 정의된 구조체 내부의 프로퍼티로 내부수준이나 공개수준을 가지는 프로퍼티가 정의될 수 없습니다.
    • 함수의 매개변수로 특정 접근수준이 부여된 타입이 전달되거나 반환된다면, 그 타입의 접근수준보다 함수의 접근수준이 높게 설정될 수 없습니다.

글의 일부 내용은 야곰님의 저서 스위프트 프로그래밍(2017, 한빛미디어)를 참고하여 작성되었습니다.