[Swift] 접근제어, 접근수준

Jade·2023년 7월 10일
0

TIL

목록 보기
2/10
post-custom-banner

Swift의 접근제어접근수준에 대해서 Araboza


접근 제어(Access Control)

  • 외부로 굳이 보여주지 않아도 될 것들은 감추는 것이 좋다.
  • 은닉화 (Hiding)

    • 주요 사항이 겉으로 드러나지 않도록 감추는 것
  • 캡슐화 (Encapsulation)

    • 중요사항을 감춘 상태에서 외부에서 그것을 사용할 수 있는 방법을 제공하고 외부와 소통하는 것
  • 운전자가 직접 자동차 하부의 전진 기어를 엔진으로 연결하도록 하는 것이 아니라, 차에게 전진 명령을 주면 자동차의 인스턴스가 전진 기어를 엔진으로 연결하게 만드는 것이 캡슐화이다.
  • 그 과정에서 전진 기어는 운전자에게 직접 보이지 않도록 내부로 감추는 것이 은닉화이다.
  • 타입을 설계할 때 순서
    • 일반화 → 추상화 → 은닉화 → 캡슐화

접근 수준(Access Level)

  • 접근제어는 접근 수준 키워드를 통해 구현할 수 있다.

  • 각 타입(클래스, 구조체, 열거형 등)에 특정 접근수준을 지정할 수 있다.

  • 타입 내부의 프로퍼티, 메서드, 이니셜라이저, 서브스크립트 각각에도 접근수준을 지정할 수 있다.

  • public - 공개 접근 수준 (모듈 외부까지)

    • 어디서든 쓰일 수 있다.

    • 자신이 구현된 소스파일, 그 소스파일이 속해 있는 모듈, 그 모듈을 가져다 쓰는 모듈 등 모든 곳

    • 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 쓰인다.

    • 스위프트의 기본 요소는 모두 공개 접근 수준으로 구현한다.

      // 스위프트 표준 라이브러리에 정의되어 있는 Bool 타입의 일부
      /// A value type whose instances are either 'true' or 'false'.
      public struct Bool {
             /// Default-initialize Boolean value to 'false'.
             public init()
      }
  • open - 개방 접근 수준 (모듈 외부까지)

    • public 접근 수준 이상으로 높은 접근 수준
    • 클래스와 클래스의 멤버에서만 사용 가능하다.
    • public 접근 수준과 비슷하지만 다음과 같은 차이점이 있다.
      • 개방 접근 수준을 제외한 다른 모든 접근수준의 클래스는 그 클래스가 정의된 모듈 안에서만 상속할 수 있다.

      • 개방 접근 수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속할 수 있다.

      • 개방 접근 수준을 제외한 다른 모든 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 재정의할 수 있다.

      • 개방 접근 수준의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의(override)할 수 있다.

      • 클래스를 개방 접근 수준으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모클래스로 사용 하겠다는 목적으로 클래스를 설계하고 코드를 작성했음을 의미한다.

        // Foundation 프레임워크에 정의되어 있는 개방 접근 수준의 NSString 클래스
        open class NSString : NSObject, NSCopying, NSMutableCopying, NSSecureCoding {
               open var length: Int { get }
               open func character(at index: Int) -> unichar
               public init()
               public init?(coder aDecoder: NSCoder)
        }
    • 라이브러리 혹은 프레임워크를 설계할 때 라이브러리나 프레임워크를 사용하는 프로그래머가 이 타입을 사용할 수 있도록 하려면 open 혹은 public 공개수준으로 타입을 정의하면 된다.
      • 라이브러리 사용자(프로그래머)가 상속받아 사용하면 좋겠다거나 상속 후 재정의하여 사용하면 좋겠다는 생각을 한다면 open 개방 접근 수준으로, 그렇지 않고 클래스를 상속받거나 재정의 할 수 없도록 막고싶다면 public 공개 접근 수준으로 정의한다.
      • open 및 public 접근수준이 아닌 다른 클래스 및 타입은 모듈 외부에서 접근할 수 없으므로 라이브러리 혹은 프레임워크를 사용하는 프로그래머가 사용할 수 없다.
  • internal - 내부 접근 수준 (모듈 내부)

    • 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준
    • 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있다.
    • 다만 그 모듈을 가져다 쓰는 외부 모듈에서는 접근할 수 없다.
    • 보통 외부에서 사용할 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용할 경우 지정한다.
  • fileprivate - 파일 외부 비공개 접근 수준 (파일 내부)

    • 요소가 구현된 소스파일 내부에서만 사용 가능하다.
    • 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우 사용하면 좋다.
  • private - 비공개 접근 수준 (기능 정의 내부)

    • 가장 한정적인 범위
    • 기능을 정의하고 구현한 범위 내에서만 사용 가능하다.
    • 심지어 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용이 불가능하다.
profile
응애 iOS 개발자
post-custom-banner

0개의 댓글