객체지향 프로그래밍 패러다임에서 은닉화는 중요한 개념입니다. 이번 시간에는 은익화를 구현하기 위한 핵심 기능인 접근제어에 대해서 알아보도록 하겠습니다.
접근제어란?
접근제어는 코드의 다양한 구성 요소(클래스, 메서드, 프로퍼티, 변수 등)이 코드의 다른 부분 또는 외부 모듈에서 어떻게 액세스 또는 사용될 수 있는지를 개발자가 지정할 수 있게 해주는 기능입니다. 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공할 수 있습니다.
접근 제어는 코드베이스의 무결성, 보안 및 구성을 유지하도록 도와주며, 서로 다른 코드 부분 간의 상호 작용 방식에 제한을 부과합니다. 스위프트에서는 다섯 가지 수준의 접근 제어를 제공하며, 각 수준마다 고유한 규칙과 제한이 있습니다.
5가지 수준의 접근 제어
- Open: 가장 높은 접근 수준입니다. "Open"으로 표시된 엔티티는 정의 모듈 내부뿐만 아니라 외부 모듈에서도 액세스할 수 있습니다. 이 수준은 일반적으로 다른 모듈의 코드에서 서브클래싱(subclassing)하고 오버라이딩(overriding)할 필요가 있는 클래스 및 메서드에 사용됩니다.
- Public: "Open"과 유사하지만 일부 제한 사항이 있습니다. "Public" 엔티티는 정의 모듈 내외의 모든 모듈에서 액세스할 수 있지만, 정의 모듈 외부에서는 서브클래싱이나 오버라이딩할 수 없습니다.
- Internal: 접근 제어가 지정되지 않으면 기본적으로 적용되는 수준입니다. "Internal" 엔티티는 동일한 모듈 내에서 액세스할 수 있지만 외부 모듈에서는 액세스할 수 없습니다. 이 수준은 모듈 내에서만 사용되어야 하는 구성 요소에 유용합니다.
- File-private: "File-private"로 표시된 엔티티는 정의된 소스 파일 내에서만 액세스할 수 있습니다. 이 접근 수준은 다른 모듈의 다른 부분에서 숨겨져야 할 세부 정보나 도우미 구성 요소에 적합합니다.
- Private: 가장 제한적인 접근 수준입니다. "Private" 엔티티는 둘러싸는 선언 범위 내에서만 액세스할 수 있습니다. 이는 특정 클래스, 구조체 또는 열거형 내에서만 사용될 수 있음을 의미합니다.
접근 제어는 스위프트의 다양한 구성 요소에 적용할 수 있으며, 이에는 다음이 포함됩니다.
- 클래스, 구조체 및 열거형: 이러한 유형의 접근 수준은 해당 유형의 인스턴스나 서브클래스를 생성할 수 있는 사용자를 결정합니다.
- 프로퍼티 및 메서드: 이러한 멤버의 접근 수준은 해당 멤버를 읽거나 수정하거나 호출할 수 있는 사용자를 결정합니다.
- 이니셜라이저, 디이니셜라이저 및 서브스크립트: 이 특수한 메서드의 접근 수준도 비슷한 방식으로 제어됩니다.
- 익스텐션: 타입에 대한 익스텐션도 접근 수준을 가질 수 있으며, 해당 타입의 접근 수준과 동일하거나 더 제한적이어야 합니다.
모듈과 소스파일
스위프트의 접근제어는 모듈과 소스파일을 기반으로 설계되었습니다. 모듈은 배포할 코드의 묶음 단위라고 생각하면 됩니다. 프레임워크나 라이브러리가 모듈 단위가 될 수 있습니다. 스위프트에서는 import 키워드를 이용해서 모듈을 불러옵니다.
소스파일은 스위프트 소스 코드 파일을 의미합니다. 자바, Objective-C와 같은 기존 프로그램빙 언어에서는 통상 파일 하나에 타입을 하나만 정의합니다. 스위프트도 보통은 파일 하나에 타입 하나만 정의하지만, 때로는 소스파일 하나에 여러 개의 클래스, 구조체, 열거형이나 함수 등 많은 것을 구현할 수 있습니다.
접근제어 구현
접근제어는 아까 얘기한 접근수준을 지정해서 구현할 수 있습니다. 각각의 접근수준을 요소 앞에 지정해주기만 하면 됩니다. 하지만 internal은 기본 접근수준이기 때문에 생략이 가능합니다.
접근제어 구현 참고사항
모든 타입에 적용되는 접근수준의 규칙은 '상위 요소보다 하위 요소가 더 높은 접근수준을 가질 수 없다.'입니다.
비공개 접근수준으로 정의한 구조체 내부의 프로퍼티로 내부수준이나 공개수준을 갖는 프로퍼티를 정의할 수 없습니다. 또한 함수의 매개변수로 특정 접근수준이 부여된 타입이 전달되거나 변환된다면, 그 타입의 접근수준보다 함수의 접근수준이 높게 설정될 수 없습니다.
감사합니다.
틀린 부분이 있거나 더 좋은 내용 훈수 환영합니다!
공감과 댓글 부탁드립니다.
'Apple > Swift' 카테고리의 다른 글
[Swift] for문을 이용한 특정 키워드 반복 출력 (2) | 2023.09.05 |
---|---|
[Swift] 클래스 인스턴스의 소멸 (0) | 2023.08.21 |
[Swift] framework import (0) | 2023.07.26 |
[Swift] 리터럴, 식별자, 키워드 (0) | 2023.07.11 |
[Swift] 열거형(enum) (0) | 2023.02.12 |