[Swift] 함수 앞에 private가 붙어 있던 이유, 접근 제어(Access Control)

2021. 11. 8. 17:58Swift, iOS Foundation

💡 접근 제어(Access Control)란?

특정 코드에 다른 파일과 모듈이 접근할 수 있는 범위를 제한하는 것이다.
클래스, 구조체, 열거형, 프로퍼티, 메서드 등 전혀 상관없이 코드 모든 곳에 적용할 수 있고,
Swift에서는 총 5가지 접근 수준(Access Level)에 따른 각각의 키워드를 사용해서 적용을 하게 된다.

✔️ 객체지향 프로그래밍에서의 캡슐화(Encapsulation), 은닉화(Hiding) 개념이 적용되었다고 보면 된다.

 

💡 접근 제어가 왜 필요한데?

세부적인 코드의 구현 내용을 접근 제한해서 큰 틀에서 재사용할 수 있을 만큼만 공개를 하기 위해서이다.
또한, 불필요한 접근이 발생해 예상치 못한 결과를 초래하는 경우를 막거나, 공유하고 싶지 않은 내용을 가리기 위해서 사용한다.
(SNS에서 게시글 공개 범위를 제한하는 것과 마찬가지라고 생각하면 된다 ^_^)

 

💡 접근 레벨(Access Level)의 종류


- open (개방 접근 수준)
  : 다른 모듈에서 오버라이드(재정의)와 서브 클래싱(상속)이 가능할 정도로 개방하는 수준이다.
    해당 클래스를 다른 모듈에서 부모 클래스로 사용하고자 클래스를 설계했을 때 이 키워드를 사용한다.

- public (공개 접근 수준)
  : 다른 모듈에서 모두 사용 가능할 정도로 공개하는 수준이다.
    단, 오버라이드(재정의)와 서브 클래싱(상속)은 불가하다는 점이 open과의 차이점이다.

- internal (내부 접근 수준) - default
  : 아무것도 명시하지 않을 경우에는, 모두 internal 수준의 접근 수준을 갖게 된다. <default Access Level, 생략 가능>
    가장 기본적인 수준이고, 모듈 내에서는 모두 자유롭게 사용할 수 있다.

- fileprivate (파일 외부 비공개 접근 수준)
  : 이 요소가 구현된 소스파일 내부에서만 사용할 수 있다.
    지정한 소스 파일 외부에서 호출되면 안 되거나, 값이 변경되면 안 되는 경우 사용하게 된다.

- private (비공개 접근 수준)
  : 구현한 곳에서만 사용할 수 있는 가장 제한적인 접근 수준이다.

 

💡 접근 제어(Access Control) 사용법

사용법은 간단하다.
그저 클래스, 구조체, 열거형, 프로퍼티, 메서드 등등의 사용 키워드 앞에 접근 레벨 종류의 이름을 명시해주기만 하면 된다.

open class SomeOpenClass {}    
public class SomePublicClass {}
internal class SomeInternalClass {}       // class SomeInternalClass()와 같음
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}

 

💡 접근 제어(Access Control) 알아두어야 할 사항들

(1)
당연히 하위로 내려갈수록 상위 요소보다 더 높은 접근 수준을 가지면 안 되겠다.
예를 들어, 어떤 클래스는 private 타입인데, 그 클래스 안에 있는 프로퍼티나 메서드가 public이면 안된다는 뜻이다.

(2)
또한, 함수의 경우에는 해당 함수의 파라미터 타입이나 리턴 값 타입보다 더 높은 접근 수준을 가져도 안된다.
만약 그렇게 되는 경우에는, 함수 자체에는 접근이 가능해도 실제로 사용할 때 이용할 수 없게 될 것이니.

(3)
앞에서 말했지만, 아무런 접근 레벨을 명시하지 않을 경우에는 internal 수준이 default로 설정된다.

(4)
단일 타깃 앱에서는 특별히 접근 수준을 작성할 필요는 없다. (우리가 만드는 과제나 공부용 클론코딩 정도 선에서는)
대신, 필요에 따라서 fileprivae나 private로 세부적으로 구현된 내용을 숨길 수 있으니 활용해봐도 좋겠다.

(5)
프레임워크를 개발할 때는, public 아니면 open으로 접근 수준을 지정해서 접근 가능하도록 만들어야 한다.
만약, 프레임워크에서 감추고 싶은 부분이 있으면, 해당 부분을 internal로 선언해주면 되겠다.
그리고 노출시키고 싶은 API만 public 혹은 open으로 지정해주면 된다.