일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- PushNotification
- 정규표현식
- APNS
- 흐름도
- 계산기
- 순서도
- JSONSerialization
- Regex
- ios
- flow chart
- Git과 Github차이점
- swift
- github란
- OS
- 플로우 차트
- 백준
- git사용법
- xcode
- UIViewController
- GitvsGithub
- 애플
- 정규식
- 스위프트
- 플로우차트
- 깃
- git
- git이란
- 깃허브
- flowchart
- github
- Today
- Total
Diana의 iOS 개발일기
[스위프트 프로그래밍 3판] - 12. 접근제어 본문
스위프트는 많은 고급 언어들과 같이 객체지향 프로그래밍 패러다임을 채택하고 있습니다.
객체지향 프로그래밍은 은닉화, 캡슐화, 추상화, 다형성, 상속성 의 5가지 특징을 가지고 있는데 이 중 은닉화를 이해하고 편하게 사용하기 위해서는 핵심기능인 접근제어(Access Control)에 대해 알아놓을 필요가 있습니다.
[접근제어(Access Control)]
은닉화(Information Hidding)는 코드의 상세내용을 숨김으로써 코드의 불필요한 외부 노출을 막아주는 매우 중요한 기능입니다.
스위프트에서 이러한 중요 기능인 은닉화를 구현하기 위해서는 접근제어를 통해 외부에서의 접근을 제한하여야 하는데 이는 모듈과 소스파일을 기반으로 설계되었습니다.
이때 모듈(Module)은 코드들의 묶음으로 여담이지만 운영체제에서는 커널과 함께 운영체제 설계에 사용되곤 합니다.
접근제어를 이해하기 위해서는 무엇보다 이 모듈(Module)의 개념을 정확히 하여야 합니다.
모듈은 간단히 이야기 하면 하나의 프레임워크나 라이브러리 또는 애플리케이션을 말하며 즉, 배포할 코드들의 묶음을 말합니다.
우리가 프로젝트를 진행할 때 해당 프로젝트에 포함된 코드들 또한 하나의 모듈 이라고 할 수 있으며 외부의 모듈을 불러와 사용하기 위해서는 import 키워드를 사용하여 불러옵니다.
소스파일(Source FIle)은 하나의 스위프트 소스 코드 파일을 의미하며 보통 파일 하나에 타입 하나만을 정의하지만 때때로 소스파일 하나에 여러 타입이나 함수를 정의하거나 구현하기도 합니다.
즉 모듈이 제일 큰 개념이면 그 안에 소스파일, 그리고 그 소스파일 안에 요소(기능 정의)가 위치하고 있다고 이해하면 될 듯 합니다.
[접근수준(Access Level)]
접근제어는 접근수준(Access Level) 키워드에 따라 접근도를 달리할 수 있습니다.
접근수준은 타입 내부의 프로퍼티, 메서드, 이니셜라이저, 서브스크립트 각각 지정할 수 있고 종류는 아래와 같이 다섯가지가 있습니다.
접근도(높을수록 작은 수) | 키워드 | 접근수준 | 범위 | 비고 |
1 | open | 개방 접근수준 | 모듈 외부까지 | 클래스에서만 사용 |
2 | public | 공개 접근수준 | 모듈 외부까지 | |
3 | internal | 내부 접근수준 | 모듈 내부 | |
4 | fileprivate | 파일외부비공개 접근수준 | 파일 내부 | |
5 | private | 비공개 접근수준 | 기능 정의 내부 |
1. 개방 접근수준 - open
open 키워드로 지정된 개방 접근수준은 공개 접근수준과 비슷하게 높은 접근성을 가지고 있으나 몇 가지 차이점을 가지고 있습니다.
가독성을 위해 키워드로 명명하겠습니다.
- open을 제외한 다른 모든 접근수준 클래스는 그 클래스가 정의된 모듈 안에서만 상속할 수 있습니다.
- open을 제외한 다른 모든 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 오버라이딩 할 수 있습니다.
- open이 지정된 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속할 수 있습니다.
- open이 지정된 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 오버라이딩 가능합니다.
2. 공개 접근수준 - public
public 키워드로 지정된 요소는 자신이 구현된 소스파일, 소스파일에 속해 이는 모듈, 그 모듈을 가져다 쓰는 모듈 등 모든 곳에서 접근할 수 있습니다. 이렇게 접근수준이 높은 public은 주로 프레임워크에서 외부와 연결된 인터페이스 구현을 위해 사용됩니다.
3. 내부 접근수준 - internal
internal 키워드로 지정된 내부 접근수준은 모든 요소에 default로 지정되는 기본 접근수준으로 생략 가능합니다.
internal로 선언된 요소는 소스파일에 속해있는 모듈의 어디에서든 사용이 가능하지만 외부 모듈에서는 접근할 수 없습니다.
한 프로젝트 안에서는 자유롭게 사용 가능하지만 외부 프로젝트에서는 접근 불가능하다는 의미가 해석해도 좋겠습니다.
4. 파일 외부 비공개 접근수준 - fileprivate
fileprivate으로 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용할 수 있으며 외부에서 해당 소스파일의 값을 변경하거나 호출하고자 할 때 오류를 발생시킵니다.
5. 비공개 접근수준 - private
private으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용 가능합니다.
즉 구조체 안에서 구현하였으면 해당 구조체에서만 사용할 수 있고 클래스에서 구현하였으면 생성한 바로 그 클래스에서만 사용이 가능합니다.
fileprivate와의 차이점은 fileprivate은 지정하면 해당 기능을 구현된 소스파일 내부, 즉 다른 타입(클래스, 구조체 등등)에서도 사용이 가능한데 private은 좀더 좁은 범위로 해당 기능이 구현된 타입 안에서만 사용이 가능합니다.
a. 접근제어 구현 참고사항
접근제어는 하위 접근제어 내부에 상위 접근제어를 구현할 수 없습니다.
예를 들면 internal 접근수준의 내부에는 본인보다 상위의 open 접근수준 또는 public 접근수준의 요소들을 배치할 수 없습니다.
//AClass.swift 파일과 Common.swift 파일이 같은 모듈에 속해 있을 경우
//AClass.swift 파일
class AClass {
func internalMethod(){}
fileprivate func filePrivateMethod(){}
var internalProperty = 0
fileprivate var filePrivateProperty = 0
}
//Common.swift 파일
let aInstanc: AClass = AClass()
aInstance.internalMethod() //같은 모듈이므로 호출 가능
aInstance.filePrivateMethod() //다른 파일이므로 호출 불가
aInstance.internalProperty = 1 //같은 모듈이므로 접근 가능
aInstance.filePrivateProperty = 1 //다른 파일이므로 접근 불가
해당 글은 야곰님의 스위프트 프로그래밍 3판 을 기반으로 한 정리 글이며 문제가 있을 시 삭제하도록 하겠습니다.
스위프트 프로그래밍 3판 eBook 구매 링크: www.yes24.com/Product/Goods/81530016
야곰님의 블로그: blog.yagom.net/
'Swift > 책 정리' 카테고리의 다른 글
[스위프트 프로그래밍 3판] - 14. 옵셔널 체이닝과 빠른 종료 (1) | 2021.03.17 |
---|---|
[스위프트 프로그래밍 3판] - 13. 클로저 (0) | 2021.03.11 |
[스위프트 프로그래밍 3판] - 11. 인스턴스 생성 및 소멸 (0) | 2021.03.09 |
[스위프트 프로그래밍 3판] - 10. 프로퍼티와 메서드 (0) | 2021.03.08 |
[스위프트 프로그래밍 3판] - 9. 구조체와 클래스 (0) | 2021.03.08 |