don't stop believing

Swift Access Control 본문

Swift/Basic

Swift Access Control

Tongchun 2018. 1. 19. 11:57

Gitbut 등에 올라온 예제 소스를 보다보면 class나 fun 앞에 public 또는 private 등으로 정의된 것을 볼 수 있습니다.

접근 제어에 대해 간단히 알아 보겠습니다.

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AccessControl.html


Access Control(접근제어) 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간의 접근을 제한할 수 있는 기능을 말합니다. Access Control을 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 Interface를 제공할 수 있습니다.


객체지향 프로그래밍 페러다임에서 중요한 캡슐화(encapsulation)와 은닉화(hidden)를 구현하는 이유는 외부에서 보거나 접근하면 안 되는 코드가 있기 때문입니다. 불필요한 접근으로 의도치 않은 결과를 초래하거나 꼭 필요한 부분만 제공을 해야하는데 전체 코드가 노출될 가능성이 있을 때 접근제어를 이용합니다.


Access Control은 Access Level(접근 수준) 키워드를 통해 구현할 수 있습니다. 각 타입 (클래스, 구조체, 열거형 등)에 특정 접근수준을 지정할 수 있고, 타입 내부의 프로퍼티, 이니셜라이저, 서브스크립트 각각에도 Access Level을 지정할 수 있습니다. 접근 수준을 명시할 수 있는 키워드는 open, public, internal, fileprivate, private 다섯 가지가 있습니다.

  • open (개방 접근수준): 모든 외부까지 허용 (클래스에서만 사용)
  • public (공개 접근수준): 모듈 외부까지 허용
  • internal (내부 접근수준): 모듈 내부까지 허용
  • fileprivate (파일외부비공개 접근수준): 파일 내부에서만 허용
  • priate (비공개 접근수준): 기능 정의 내부에서만 허용
public (공개  접근수준)
public 키워드로 접근 수준이 지정된 요소는 어디서든 쓰일 수 있습니다. 자신이 구현된 소스 파일은 물론, 그 소스파일이 속해 있는 모듈을 가져다 쓰는 모듈 등 모든 곳에서 사용할 수 있습니다. public 접근수준은 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 쓰입니다. 우리가 사용하는 Swift의 기본 요소는 모두 공개 접근수준으로 구현되어 있습니다.

open (개방 접근수준)
open 키워드로 지정할 수 있는 개방 접근수준은 public 접근수준 이상으로 높은 접근수준이며, 클래스와 클래스의 멤버에서만 사용할 수 있습니다. 클래스를 open 접근수준으로 명시하는 것은 클래스를 다른 모듈에서도 부모클래스로 사용하겠다는 목적으로 클래스를 설계하고 코드를 작성했음을 의미합니다.

internal (내부 접근수분)
internal 키워드로 지정하는 내부 접근수준은 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준입니다. 내부 접근수준으로 저정된 요소는 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있습니다. 다만 그 모듈을 가져다 쓰는 외부 모듈에서는 접근할 수 없습니다. 보통 외부에서 사용할 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용할 경우 internal 접근수준을 지정합니다.

fileprivate (파일외부비공개 접근수준)
fileprivate 접근수준으로 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용할 수 있습니다.해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길수 있는 경우에 사용하면 좋습니다.

private (비공개 접근수준)
private 접근수준은 가장 한정적인 범위입니다. 비공개 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용할 수 있습니다. 비공개 접근수준으로 지정한 기능은 심지어 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용할 수 없습니다.

실재 iOS 앱개발이나 Server-Side 개발할때는 기본 접근수준은 internal만 사용하게 되네요.


Comments