이전에 스위프트 문법 강의를 듣다가 알게 된 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://ios-daniel-yang.tistory.com/25
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 |