[스위프트 프로그래밍-12장] 접근 제어

sanghee·2021년 11월 9일
0
post-thumbnail

이 글은 스위프트 프로그래밍(3판, 야곰 지음)을 읽고 간단하게 정리한 글입니다. 책에 친절한 설명과 관련 예제 코드들이 있으므로 직접 사서 읽기를 추천합니다.

12.1 접근제어란

접근제어란 파일 간 혹은 묘듈 간에 접근을 제한할 수 있는 기능이다.

12.1.1 접근제어의 필요성

객체지향 프로그래밍 패러다임에서 중요한 캡슐화와 은닉화를 구현하는 이유는 불필요한 접근으로 의도치 않은 결과를 초래할 수 있기 때문이다.

12.1.2 모듈과 소스파일

모듈

모듈이란 배포할 코드의 묶음 단위이다. 프레임워크, 라이브러리, 애플리케이션이 그 예이다.

소스파일

스위프트 소스 코드 파일을 의미한다. 보통 파일 하나에 타입 하나를 정의한다.

12.2 접근수준

접근제어는 접근수준 키워드를 통해 구현할 수 있다. 아래로 갈수록 접근도가 낮다.

  1. open: 클레스에서만 사용
  2. public: 공개 접근수준
  3. internal: 기본 접근수준
  4. fileprivate: 파일 내부
  5. private: 기능 정의 내부

12.2.1 공개 접근수준 - public

우리가 사용하는 스위프트의 기본 요소들은 모두 public으로 구현되어 있다.

public struct Bool {
  public init()
  ...
}

개방 접근수준 - open

클래스에서만 사용한다. 클래스를 open으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적으로 만들었음을 의미한다.

내부 접근수준 - internal

기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근 수준이다. 굳이 표기하지 않아도 된다.

파일외부비공개 접근수준 - fileprivate

소스파일 내부에서만 사용할 수 있다.

비공개 접근수준 - private

가장 한정적인 범위로 기능을 정의하고 구현한 범위 내에서만 사용할 수 있다.

12.4 접근제어 구현 참고사항

접근수준의 규칙은 '상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다'이다. private한 클래스에 public한 메서드를 명시해도 private으로 취급된다.

때문에 접근 수준에 따라 접근이 불가능한 경우도 생기기에 API로 사용할 기능을 공개 접근 수준(public)으로 지정해야 한다.

12.6 읽기 전용 구현

값을 변경할 수 없도록 구현하고 싶다면 어떻게 해야 할까? 그럴때는 설정자(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
profile
👩‍💻

0개의 댓글