오늘은 Access Control
에 대해서 알아보려 한다.
Access Control
은 객체지향 프로그래밍에서 은닉화/캡슐화를 가능하게 해준다.
file/module
간에 접근을 제한할 수 있는 기능이다.
이를 통해 Code의 상세 구현은 숨기고 허용된 기능만 사용할 수 있도록 제한한다.
Swift를 접하기 전에 사용하던 언어들에서도public
, private
라는 Access control
이 있었다.
그때는 file
에 대한 접근을 제한한다고 배웠는데 module
이 뭘까?
Swift는 module
과 source file
기반으로 Access Control
이 설계되었다.
module
은 배포할 코드의 묶음 단위이다.
frameworke
, library
, Application
을 예로 들 수 있다.
Swift에서는 import
를 통해 불러온다.
source file
은 하나의 Swift Source Code File을 의미한다.
각 Type
과 Type 내부
의 property
, method
, initializer
, subScript
에 Access Control
을 지정할 수 있다.
이렇게 총 5가지의 Access Control
이 있다.
위에서 아래로 내려올수록 접근도가 낮아진다.
어디서든 사용 가능하다.
(구현된 source file
, source file
이 속해 있는 module
, module
을 가져다 쓰는module
)
주로 framework
에서 외부와 연결될 interface
를 구현할때 사용한다.
public
이상으로 접근도가 높은 Access Control
이다.
class
와 class 멤버
에서만 사용 가능한 Access Control
이다.
public
이하의 Access control
의 class
는 정의된 모듈 내에서만 서브 클래싱할 수 있다.Framework
내부에서만 서브클래싱이 가능)open
클래스는 정의 된 모듈 내에서 서브 클래싱 될 수 있으며 정의 된 모듈을 가져오는 모듈 내에서도 서브 클래싱 될 수 있다.FrameWork
내부, Framework
외부 어디서든 서브클래싱이 가능)public
클래스 멤버 또는 제한적인 Access Control
은 정의 된 모듈 내에서만 하위 클래스에 의해 override
될 수 있다.open
클래스 멤버는 정의 된 모듈 내의 하위 클래스와 정의 된 모듈을 가져오는 모든 모듈에서 override
될 수 있다.class
를 open
으로 명시했다면 class
를 다른 모듈에서도 부모 class
로 사용하겠다는 목적으로 class
를 설계하고 코드를 작성했음을 의미한다.
default로 선언되는 Access Control
이다.
source file
이 속해 있는 mudule
어디에서든 쓰일 수 있다.
module
을 가져다 쓰는 외부 module
에서는 접근이 불가능 하다.
즉, 외부에서 사용할 class
나 struct
가 아니고 module
내부에서 광역적으로 사용할 경우에 지정해준다.
(해당 module
에서만 접근할 수 있다.)
fileprivate
라는 이름에서 알 수 있듯 source file
내부에서만 접근 가능하다.
같은 module
내에서도 같은 source file
안에서만 접근 가능하다는 말이다.
private
은 가장 한정적인 Access Control
이다.
기능을 정의하고 구현한 범위 내에서만 사용한다.
위에서 알아본 private
로 Access Control
의 이점을 생각해보자.
내가 사용자의 정보를 받는 프로그램을 개발한다고 생각해보자.
사용자에게서 주민번호 혹은 핸드폰 번호를 입력 받고 저장하는데 이걸 어디에서든 다 접근할 수 있도록 한다면 어떨까?
이런 관점에서 바라본다면 정말 필요한데에서 필요한 정보만 접근할 수 있도록하는 것이 불필요한 접근을 줄이는 방법일 것이다.
즉, 우리가 적절한 Access Control
을 지정해줌으로써 불필요한 접근으로 우리가 원하지 않은 결과값을 받는 것을 방지해줄 수 있다.
또한, 코드의 노출도 막을 수 있다.
오늘은 Access Control에 대해 알아봤다.
이전부터 정리해야지 생각했었는데 어쩌다보니 좀 나중에 하게 되었다...ㅋㅋ
이전에 프로그램을 짤때에는 Access Control에 대해 크게 신경을 쓰지 않았는데 이에 관련한 리뷰를 받다보니 한 번 정리할 필요를 느꼈고, 이제 적절하게 사용해보도록 해야지...
그럼 이만👋