Swift

❓ 접근 제어(Access Control)

_yunie 2024. 6. 17. 23:17

이전에 스위프트 문법 강의를 듣다가 알게 된 open이라는 키워드에 대해 알아보다 자연스레 스위프트의 접근 제어자 5가지를 알아보게 되었습니다!

 

❓ 접근 제어자

접근 제어자가 어떤 것인지 알기 위해서는 접근 제어가 무엇인지부터 이해해야 할 것 같아요

 

접근 제어란 코드끼리 상호작용 할 때, 소스파일 간 또는 모듈 간 접근을 제한하는 것을 말합니다

이를 통해 특정 코드의 세부적인 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공할 수 있습니다 

 

✏️ 여기서 잠깐!

모듈은 배포하는 코드의 묶음 단위를 말하며 간단하게 import 해오는 것들을 의미합니다

소스파일은 스위프트의 코드 파일 한 개를 의미합니다

 

🧐 그렇다면 소스파일 간, 모듈 간 접근을 제한하는 이유는 뭘까요?

 

이는 객체지향프로그래밍(OOP)의 은닉화와 연관이 있다고 합니다

OOP의 은닉화는 내부 데이터 및 연산을 외부에서 접근하지 못하도록 하고 setter, getter를 통해 변수에 접근하고 제어할 수 있게 합니다

즉, 외부에서는 내부에서의 어떠한 움직임도 알 수 없어 데이터에 어떤 값이 있는지, 어떤 변화가 일어나는지 알 수 없음을 의미합니다!

결국, 우리는 getter를 통한 결과만을 받아볼 수 있습니다 

 

이처럼 외부에서 보거나 접근해서는 안 되는 코드들을 위해 접근 제어자가 등장하게 되었습니다 

접근 제어자에는 총 5가지의 레벨이 있고 제가 호기심을 가졌던 open 또한 이에 속합니다

 

🧐 접근레벨(Access Levels) 5가지

접근 레벨에는 open, public, internal, fileprivate, private 이렇게 5가지가 존재하고 앞에서 뒤로 갈수록 폐쇄적인 경향을 보입니다

폐쇄적이라는 건 곧 해당 메서드 또는 프로퍼티에 접근할 수 있는 범위가 좁아짐을 의미합니다!

그리고 각 레벨의 특징을 정리해 보면 다음과 같습니다

 

open

가장 높은 수준의 접근 제어자로 어디서든 사용할 수 있습니다

그렇기 때문에 다른 모듈에서도 해당 클래스, 메서드를 상속 또는 재정의 할 수 있습니다

이러한 특징 때문에 외부 라이브러리를 만들고 사용할 때 유용하다고 하네요!

주의할 점은 오로지 class에만 붙일 수 있다는 점입니다

public

기본적으로 open과 접근 제어 정도가 동일합니다

하지만 open과 달리 다른 모듈에서 상속하거나 재정의 할 수 없고 class 외 enum, struct에도 사용할 수 있습니다

 

internal

같은 모듈 내라면 어디서든 접근할 수 있습니다

또한 기본 접근 제어자로 아무런 키워드 없이 선언한다면 internal이라고 생각하시면 됩니다

 

fileprivate

같은 소스파일 내에서만 해당 데이터를 사용할 수 있습니다

 

private

해당 데이터가 선언된 블록 내에서만 사용할 수 있습니다

그래서 private으로 선언된 데이터는 다른 블록에서 불러오려고 할 때, 왼쪽 이미지처럼 자동완성으로도 뜨지 않음을 알 수 있습니다!

그리고 만약 사용하려고 불러오더라도 오른쪽 이미지처럼 붉은색의 에러메시지를 마주하게 됩니다 

 

 

✏️  오늘의 요약

  • 접근 제한은 외부에서 보거나 접근해서는 안되는 코드를 위해 사용됨
  • 접근 레벨에는 open - public - internal - fileprivate - private 이 있음

 

마무리

이렇게 특징을 정리해 보면 어디서든 사용할 수 있는 open부터 선언된 블록 내부까지로 제한되는 private까지 단계별로 접근이 제한되는 것을 알 수 있습니다

그러므로 각 접근 제어자의 특징에 대해 알아두면 적재적소에 맞추어 사용할 수 있을 것 같아요!

 

📚  참고

https://velog.io/@justdotheg/Swift-%EA%B8%B0%EC%B4%88-%EC%A0%91%EA%B7%BC-%EC%A0%9C%EC%96%B4Access-Control

https://ios-daniel-yang.tistory.com/25

https://velog.io/@justdotheg/Swift-%EA%B8%B0%EC%B4%88-%EC%A0%91%EA%B7%BC-%EC%A0%9C%EC%96%B4Access-Control

https://clamp-coding.tistory.com/380

https://infinitt.tistory.com/396

https://pooh-footprints.tistory.com/entry/Swift-접근제어자Access-Control에-대해서

https://beerntv.wordpress.com/2017/01/18/0118-추상화-캡슐화-은닉/

'Swift' 카테고리의 다른 글

❓ Optional  (0) 2024.06.24
❓ Type Inference / Type Annotation  (0) 2024.06.21
❓ Delegate와 DataSource의 차이  (1) 2024.06.10
❓ 타입 프로퍼티  (2) 2024.06.07
❓ 연산 프로퍼티  (0) 2024.06.05