티스토리 뷰
1) 이론적 정의
* 다른 모듈의 코드 또는 다른 소스 파일 등으로부터 접근을 제한하는 것으로 세부 구현 내용을 숨기고 접근할 수 있는 인터페이스 지정이 가능하다.
Question. 모듈? 소스 파일?
Answer.
* 모듈(Module) : import 를 통해 다른 모듈로부터 불러들일 수 있는 하나의 코드 배포 단위를 말한다.
ex. import Foundation...
* 소스 파일(Source File) : 모듈 내에 포함된 각각의 Swift 소스 코드 파일을 말한다.
2) Access Levels
* Swift 에서는 5가지의 다른 접근 레벨을 제공한다. 맨 왼쪽이 가장 개방적인 접근 레벨, 맨 오른쪽이 가장 제한적인 접근 레벨을 뜻한다.
"open(Restrict : Least, Access : Highest) > public > internal(Basic Level) > file private > private(Restrict : Highest, Access : Least)"
( '>' 는 개방 크기의 정도를 나타낸다)
접근 영역으로 위 단계를 동일하게 표현하면 다음과 같이 표현할 수 있다.
"외부 모듈의 접근 + 상속/오버라이딩 > 외부 모듈의 접근 > 속한 모듈 내부에서만 접근(Basic Level) > 하나의 스위프트 파일 내부에서만 접근 > 정해진 범위 내부에서만 접근"
3) 접근 제어 문법 정의
* 다음은 접근 제어 문법을 적용한 다양한 예시이다.
// 클래스에 적용
open class SomeOpenClass {}
public class SomePublicClass {}
internal class SomeInternalClass {} Ref. internal 말고는 명시적으로 표시하는 것이 좋다.
fileprivate class SomeFilePrivateClass {}
private class SomePrivateClass {}
// 함수, 변수와 상수에 적용
public var somePublicVariable = 0
internal let someInternalConstant = 0
fileprivate func someFilePrivateFunction() {}
private func somePrivateFunction() {}
// 암시적 선언 : 타입 앞에 'internal' 이라는 표현이 생략되었다고 보면 된다. 기본적으로 생략하면 internal 이라는 것을 기억하자.
class ImplicitlyInternalClass {}
let implicitlyInternalConstant = 0
// 각 타입 내에서도 또 접근 제어 문법을 지정
public class SomePublicClass1 { // 명시적 퍼블릭 클래스 = explicitly public class
public var somePublicProperty = 0 // explicitly public class
var someInternalProperty = 0 // 암시적 인터널 클래스의 멤버 프로퍼티 = implicitly 'internal' class member)
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
위에서 클래스가 public으로 선언이 되어 있어도 다른 타입들에 아무것도 타입을 선언 안해주면 기본적으로 internal로 선언된다.
public 내부에서도 또 public으로 속성이나 메소드를 설정해주려는 경우 내부에서도 다시 명시를 정확히 해주어야 한다.
class SomeInternalClass1 { // implicitly internal class
public var somePublicProperty = 0 -->
var someInternalProperty = 0 // implicitly internal class member
fileprivate func someFilePrivateMethod() {} // explicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
위의 클래스에서 2번째 줄 초록색으로 처리된 부분을 선언할 경우 오류가 발생한다. 왜일까?
그것은 클래스의 접근 제어가 internal 인데, 앞서 언급했듯이 internal을 넘어서는 것은 안되게 되어 있기 때문이다.
그러나, Xcode에서 에러는 발생하지는 않는다.(버근가???) 주의할 것.
fileprivate class SomeFilePrivateClass1 { // explicitly file-private class
func someFilePrivateMethod() {} // implicitly file-private class member
private func somePrivateMethod() {} // explicitly private class member
}
그렇다면 이런 경우는 어떠할까? 메소드 2개를 가지고 있는 위의 클래스의 접근 단계는 fileprivate 이다. 앞선 경우와는 다르게
func은 internal이 될 수 없다(앞과 동일한 이유로). 그래서 저 func은 internal이 아닌 fileprivate이 된다.
private class SomePrivateClass1 { // explicitly private class
func somePrivateMethod() {} // implicitly private class member
}
위의 예도 앞과 같은 이유로 func의 기본 단계는 private 이라고 보면 된다.
'Programming > Swift' 카테고리의 다른 글
1. Swift : 반복문(Loops) (0) | 2018.05.23 |
---|---|
1. Swift : 조건문(Conditional Statements) (0) | 2018.05.23 |
1. Swift : 함수(function) (0) | 2018.05.16 |
1. Swift : 타입 변환(Type Conversion) (0) | 2018.05.16 |
1. Swift : 리터럴, 타입(Literals & Types) (+ 타입 앨리어스) (0) | 2018.05.16 |
- Total
- Today
- Yesterday
- 튜플
- 열거형
- GCD
- inswag
- fallthrough
- tca
- 스위프트
- 프로그래밍
- 개발스쿨
- fastcampus
- array
- 컨버전
- 딕셔너리
- var
- 리터럴
- Swift
- 깃허브
- 패캠
- OOP
- 패스트캠퍼스
- commit
- ARC
- lifecycle
- Dictionary
- iOS개발스쿨
- swiftUI
- function
- 타입
- Operator
- ios
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |