접근제어

박형석·2021년 12월 13일
0

Swift

목록 보기
15/20
post-thumbnail
post-custom-banner

접근제어란?

  • 객체지향 프로그래밍 패러다임에서 은닉화를 구현하기 위한 핵심 기능
  • 코드끼리 상호작용을 할 때, 파일 간, 모듈 간에 접근을 제한할 수 있는 기능.
  • 코드의 상세 구현은 숨기고, 허용된 기능만 사용하는 인터페이스를 제공할 수 있도록 하는 기능

모듈과 소스 파일

  • 스위프트 접근제어는 모듈과 소스파일을 기반으로 설계
    • 모듈 : 배포할 코드의 묶음 단위, 통상 하나의 프레임워크, 라이브러리, 애플리케이션 단위를 의미, import를 사용해 불러온다.
    • 소스파일 : 스위프트 소스 코드 파일. 보통 하나의 타입을 파일 하나에 정의하지만 여러 개를 정의할 수도 있다.

접근수준

  • 접근제어는 접근수준 키워드를 통해 구현
  • 타입, 타입의 프로퍼티, 메서드, 이니셜라이저, 서브스크립트 각각에도 지정 가능
  • open, public, internal, fileprivarte, private 5가지
  • 높은 접근수준 ———————————낮은 접근 수준
  1. public, 공개 접근수준
    • 어디서든 접근 가능
    • 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 사용
    • 스위프트의 기본 요소는 모두 공개 접근 수준
  2. open, 개방 접근수준
    • 공개 접근수준이지만 다음과 같은 차이가 있음
      • 클래스와 클래스 멤버에서만 사용 가능
      • open ✅
        → class : 모듈 밖의 다른 모듈에서도 상속 가능
        → member : 모듈 밖의 다른 모듈에서도 재정의 가능
      • open ⛔️ , open을 제외한 나머지 접근수준의 클래스
        → class : 모듈 안에서만 상속
        → member : 모듈 안에서만 재정의
    • 따라서 open을 명시하는 것은 다른 모듈에서도 부모 클래스로 사용하겠다는 목적이 분명!
  3. internal, 내부 접근수준
    • 기본적으로 모든 요소에 암묵적으로 지정하는 접근 수준
    • 모듈 안에서 어디서든 사용 가능
  4. fileprivate, 파일외부비공개 접근수준
    • 소스파일 내부에서만 사용 가능
    • 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용
  5. private, 비공개 접근수준
    • 해당 기능을 정의하고 구현한 범위 내에서만 사용 가능
    • 같은 파일 extension은 가능
    • 같은 소스 파일도 안된다.

접근제어 구현

  • 접근수준을 지정해서 접근제어를 구현, 그냥 각각 요소 앞에 지정해주기만 하면 된다.
  • internal은 굳이 안해도 된다.

접근제어 구현 참고사항

  • 규칙 : 상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다. 적어도 같아야 한다.

    • 비공개 클래스에 공개 프로퍼티를 정의할 수 없다.
    • 파라미터나 리턴값이 비공개인데 함수가 공개일 수 없다.
    • 튜플 내부 타입이 비공개인데 튜플이 공개일 수 없다.
  • 프레임워크를 만들 때는 다른 모듈에서 특정 기능에 접근할 수 있도록 API로 사용할 기능을 공개로, 그외의 요소는 internal이나 비공개로 설정. 적절히 구현하자.

  • 열거형은

    • case 별로 불가능. 타입 자체에 해야 함
    • 원시 값 타입의 접근 수준이 열거형 보다 낮을 수 없다
    • 연관 값 타입도 마찬가지

읽기 전용 구현

  • 설정자만 낮은 수준으로 제한해서 읽기 전용으로 만들기
  • 설정자 접근수준 제한은 해당 요소의 접근 수준보다 같거나 낮게
  • (set)으로 표현
internal private(set) var gogo = 1
public internal(set) subscript(some: Int) -> Int { 
 //...
}
profile
IOS Developer
post-custom-banner

0개의 댓글