Swift의 접근제어와 접근수준에 대해서 Araboza
접근 제어(Access Control)
캡슐화
이다.은닉화
이다.일반화 → 추상화 → 은닉화 → 캡슐화
접근 수준(Access Level)
접근제어는 접근 수준
키워드를 통해 구현할 수 있다.
각 타입(클래스, 구조체, 열거형 등)에 특정 접근수준을 지정할 수 있다.
타입 내부의 프로퍼티
, 메서드
, 이니셜라이저
, 서브스크립트
각각에도 접근수준을 지정할 수 있다.
어디서든 쓰일 수 있다.
자신이 구현된 소스파일, 그 소스파일이 속해 있는 모듈, 그 모듈을 가져다 쓰는 모듈 등 모든 곳
주로 프레임워크
에서 외부와 연결될 인터페이스를 구현하는데 많이 쓰인다.
스위프트의 기본 요소는 모두 공개 접근 수준으로 구현한다.
// 스위프트 표준 라이브러리에 정의되어 있는 Bool 타입의 일부
/// A value type whose instances are either 'true' or 'false'.
public struct Bool {
/// Default-initialize Boolean value to 'false'.
public init()
}
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
접근수준이 아닌 다른 클래스 및 타입은 모듈 외부에서 접근할 수 없으므로 라이브러리 혹은 프레임워크를 사용하는 프로그래머가 사용할 수 없다.