이 글은 스위프트 프로그래밍(3판, 야곰 지음)을 읽고 간단하게 정리한 글입니다. 책에 친절한 설명과 관련 예제 코드들이 있으므로 직접 사서 읽기를 추천합니다.
접근제어란 파일 간 혹은 묘듈 간에 접근을 제한할 수 있는 기능이다.
객체지향 프로그래밍 패러다임에서 중요한 캡슐화와 은닉화를 구현하는 이유는 불필요한 접근으로 의도치 않은 결과를 초래할 수 있기 때문이다.
모듈이란 배포할 코드의 묶음 단위이다. 프레임워크, 라이브러리, 애플리케이션이 그 예이다.
스위프트 소스 코드 파일을 의미한다. 보통 파일 하나에 타입 하나를 정의한다.
접근제어는 접근수준 키워드를 통해 구현할 수 있다. 아래로 갈수록 접근도가 낮다.
우리가 사용하는 스위프트의 기본 요소들은 모두 public으로 구현되어 있다.
public struct Bool {
public init()
...
}
클래스에서만 사용한다. 클래스를 open으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적으로 만들었음을 의미한다.
기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근 수준이다. 굳이 표기하지 않아도 된다.
소스파일 내부에서만 사용할 수 있다.
가장 한정적인 범위로 기능을 정의하고 구현한 범위 내에서만 사용할 수 있다.
접근수준의 규칙은 '상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다'이다. private한 클래스에 public한 메서드를 명시해도 private으로 취급된다.
때문에 접근 수준에 따라 접근이 불가능한 경우도 생기기에 API로 사용할 기능을 공개 접근 수준(public)으로 지정해야 한다.
값을 변경할 수 없도록 구현하고 싶다면 어떻게 해야 할까? 그럴때는 설정자(setter)만 더 낮은 접근수준을 갖도록 제한할 수 있다.
public struct Type {
var age: Int = 99
private(set) var privateNewYearAge: Int {
get { age + 1 }
set { age = newValue - 1 }
}
var newYearAge: Int {
get { age + 1 }
set { age = newValue - 1 }
}
}
var type = Type()
print(type.age) // 99
//type.privateNewYearAge = 100 // error!
print(type.privateNewYearAge) // 100
print(type.age) // 99
type.newYearAge = 10
print(type.newYearAge) // 10
print(type.age) // 9