안녕하세요. 도미닉입니다.
오늘은 Access Control 에 대해서 알아보겠습니다.
Access Control 이란?
Access Control 을 해석하면 무슨 뜻일까요?
접근 제어 입니다.
그렇다면 접근 제어하면 무슨 생각이 드시나요?
접근 금지라는 단어도 생각이 납니다.
관계자외 출입금지라는 표지판도 많이 붙어있죠.
어느 Access Level 까지 접근을 허용할지 제어하는 것을 접근 제어라고 합니다.
Access Levels 이란?
해석하면 접근 단계입니다.
스위프트의 접근 단계는 5단계가 있습니다.
open - 모듈 외부에서도 접근 가능
public - 모듈 외부에서도 접근 가능
internal - 하나의 모듈 내부에서만 접근 가능
fileprivate - 하나의 파일 내에서만 접근 가능
private - 정의한 블록 내부에서만 접근 가능
각 단계에 대해 자세히 살펴보겠습니다.
open
open 은 public 과 동일하게 모듈 외부에서도 접근 가능합니다.
하지만 아래 두가지 특징이 있습니다.
모든 접근수준 중 open만이 모듈 밖의 다른 모듈에서 상속될 수 있습니다. (클래스)
모든 접근수준 중 open으로 선언된 클래스의 멤버(프로퍼티, 메소드)들만이 다른 모듈에서 override될 수 있습니다.
public
public 으로 선언된 요소들 역시 모듈 바깥에서도 접근이 가능합니다.
클래스를 public으로 선언한다면 모듈 바깥에서 생성할 수 있지만 해당 클래스를 상속할 수 없습니다.
public 으로 선언한 클래스의 멤버(프로퍼티, 메소드)는 모듈 밖에서 override할 수 없습니다.
internal
internal은 따로 접근제어를 선언해주지 않으면 기본으로 할당되는 default 접근제어 수준입니다.
internal은 같은 모듈 내에서는 어디서든 접근이 가능하고 클래스도 모듈 내의 어느 곳에서나 해당 클래스를 상속받을 수 있습니다.
fileprivate
private는 하나의 스위프트 파일(.swift) 내부에서만 접근이 가능한 접근제어 수준입니다.
접근제어를 fileprivate으로 선언하면 그 파일(.swift) 내부에서만 해당 타입에 접근이 가능합니다.
private
private 은 그 요소가 선언된 영역(블록)내에서만 접근이 가능합니다.
private(set) 은 그 요소가 선언된 영역(블록)내에서만 수정이 가능하고 외부에서 조회는 할 수 있습니다.
접근제어간의 충돌
접근 제어를 사용할 때 아래 두가지 원칙을 지켜야합니다.
바깥 요소의 접근제어 수준보다 높은 수준의 내부 요소는 있을 수 없다.
특정 접근제어 수준의 타입이 함수의 매개변수나 반환되는 타입일 경우 함수는 해당 값의 접근제어보다 높을 수 없다.
먼저 첫번째의 경우 클래스의 접근수준이 private이면 클래스의 멤버들은 public, internal 등 private보다 상위 수준의 접근수준이 될 수 없고 선언이 되어도 private으로 취급됩니다.
두번째의 경우 메소드나 함수가 public한데 private한 매개변수를 받거나 private한 값을 반환하는 것은 상식적으로 맞지 않습니다. 이때 매개변수의 타입이나 반환되는 값의 접근제어 수준은 메소드나 함수의 접근제어 수준과 같거나 높아야 합니다.
정리
접근 제어 단계는 private 정도만 알고 있었는데 이렇게 다양한 접근 제어 단계가 있었습니다.
용도에 맞춰서 적절하게 접근 제어를 해야하겠습니다.
감사합니다.