티스토리 뷰
오늘은 접근제어에 대해 공부해볼게요!
접근제어는 말 그대로 접근을 제어하는 건데요 ㅎㅎ
타입, 변수/상수, 메서드 등에 접근할 수 있게/없게 제한하는 키워드입니당.
5가지의 제어 수준이 있는데요.
1. private
단어에서도 느껴지시져? 가장 접근하기가 어려운(?) 수준입니당.
같은 스코프({ }) 내에서만 접근이 가능하쥬
2. fileprivate
private보다는 발전된 수준의 접근 가능 단계입니당.
같은 file 내에서는 접근이 가능해서 file이라고 붙인 것 같아요.
3. internal (default)
우리가 지금까지 접근제어를 신경쓰지 않았지만, 사실은 기본값이 internal이었어요.
따로 명시를 하지 않으면 항상 internal 수준을 갖는거져.
internal은 같은 모듈 내에서 접근이 가능한 수준입니당.
4. public
다른 모듈에서도 접근이 가능한 수준이 바로 public입니다.
상속과 재정의가 불가능하기 때문에 구조체가 가질 수 있는 최대치의 접근 수준이에요.
5. open
public과 유사한 접근 수준으로 다른 모듈에서 접근 가능한 단계입니다.
그러나 상속과 재정의가 가능하기 때문에 class의 최대치의 접근 가능 수준이겠네요.
보통 평범한 개발자라면 private, fileprivate, internal 수준의 접근만 사용하지만,
frameworks, APIs, SDKs, libraries 개발자라면 public과 open도 사용하는 경우가 많대요.
아마 다른 모듈에서도 전부 사용이 가능할 수 있도록 하기 때문이겠져?
아직 저는 초보 개발자니까, private/fileprivate/internal을 각 같은 파일과 다른 파일 내에서 어떻게 접근할 수 있는지 알아볼게요!
(Udemy 강의의 코드를 활용했습니당!)
3개의 파일을 가진 하나의 모듈을 가지고 시작해볼게요!
AFile에서 class하나를 만들어주고, 총 3개의 변수를 만들어줄게요!
// AFile.swift
class AccessControlClass {
//private: 같은 scope 내에서만 접근 가능
private var aPrivateProperty = "private property"
//fileprivate: 같은 파일 내에서 접근 가능
fileprivate var aFilePrivateProperty = "fileprivate property"
//internal: 같은 모듈 내에서 접근 가능 (default 값이기 때문에 생략되어 있음)
var anInternalProperty = "internal property"
func methodA () {
//메서드 내의 변수
var aLocalVariable = "local variable"
}
func methodB () {
}
}
1. 같은 class 내에서 접근하기
같은 클래스에서 methodA와 methodB에서 어디까지 접근이 가능할까요?
print문을 만들어 확인해볼게요.
class AccessControlClass {
//private: 같은 scope 내에서만 접근 가능
private var aPrivateProperty = "private property"
//fileprivate: 같은 파일 내에서 접근 가능
fileprivate var aFilePrivateProperty = "fileprivate property"
//internal: 같은 모듈 내에서 접근 가능 (default 값이기 때문에 생략되어 있음)
var anInternalProperty = "internal property"
func methodA () {
//메서드 내의 변수
var aLocalVariable = "local variable"
print("\(aLocalVariable) printed from methodA in AccessControlClass")
print("\(aPrivateProperty) printed from methodA in AccessControlClass")
print("\(aFilePrivateProperty) printed from methodA in AccessControlClass")
print("\(anInternalProperty) printed from methodA in AccessControlClass")
}
func methodB () {
}
}
이제 methodA 함수를 실행해주기 위해서 main.swift파일로 가서 AccessControlClass의 객체를 하나 만들고 methodA를 실행해볼게요!
쨔잔! 모든 변수들이 다 잘 출력이 되는군여!!
// AFile.swift
class AccessControlClass {
//private: 같은 scope 내에서만 접근 가능
private var aPrivateProperty = "private property"
//fileprivate: 같은 파일 내에서 접근 가능
fileprivate var aFilePrivateProperty = "fileprivate property"
//internal: 같은 모듈 내에서 접근 가능 (default 값이기 때문에 생략되어 있음)
var anInternalProperty = "internal property"
func methodA () {
//메서드 내의 변수
var aLocalVariable = "local variable"
}
func methodB () {
print("\(aLocalVariable) printed from methodA in AccessControlClass")
print("\(aPrivateProperty) printed from methodA in AccessControlClass")
print("\(aFilePrivateProperty) printed from methodA in AccessControlClass")
print("\(anInternalProperty) printed from methodA in AccessControlClass")
}
}
그러면 같은 scope인 methodB에서는 어떨까요? 다시 main.swift로 가서 methodB를 출력해볼게요!
Local 변수였던 aLocalVariable를 제외하고는 모두 접근할 수 있군여!
private이 같은 scope 안에서 접근 가능할 때, scope가 해당 class를 말하는가봐요.
2. 같은 파일 다른 class에서 접근하기
같은 파일(= Afile) 안에 또 다른 class 하나(= AnotherClassInTheSameFile)를 선언해줄게요.
// AFile.swift
class AccessControlClass {
//private: 같은 scope 내에서만 접근 가능
private var aPrivateProperty = "private property"
//fileprivate: 같은 파일 내에서 접근 가능
fileprivate var aFilePrivateProperty = "fileprivate property"
//internal: 같은 모듈 내에서 접근 가능 (default 값이기 때문에 생략되어 있음)
var anInternalProperty = "internal property"
func methodA () {
//메서드 내의 변수
var aLocalVariable = "local variable"
}
func methodB () {
}
}
class AnotherClassInTheSameFile {
init() { }
}
같은 파일 다른 class(= AnotherClassInTheSameFile)의 생성자에서 print문을 찍어서 어떻게 출력되는지 볼게요!
// AFile.swift
class AccessControlClass {
//private: 같은 scope 내에서만 접근 가능
private var aPrivateProperty = "private property"
//fileprivate: 같은 파일 내에서 접근 가능
fileprivate var aFilePrivateProperty = "fileprivate property"
//internal: 같은 모듈 내에서 접근 가능 (default 값이기 때문에 생략되어 있음)
var anInternalProperty = "internal property"
func methodA () {
//메서드 내의 변수
var aLocalVariable = "local variable"
}
func methodB () {
}
}
class AnotherClassInTheSameFile {
init() {
print("\(accessControl.aPrivateProperty) printed from methodA in AccessControlClass")
print("\(accessControl.aFilePrivateProperty) printed from methodA in AccessControlClass")
print("\(accessControl.anInternalProperty) printed from methodA in AccessControlClass")
}
}
그리고 main함수에서 AnotherClassInTheSameFile의 객체를 찍어내면 (생성자에서 print문을 만들었기 때문에) 아래 문장 두개가 출력되는 걸 볼 수 있어요.
private는 해당 scope에서만 접근이 가능했으니까, 접근이 안되는군여!
aLocalVariable 또한 local 변수였으니까 접근이 불가능하구여!
오키오키!!
3. 다른 파일 다른 class 접근하기
다른 파일(=AnotherFile)에서 접근할 때는 어떨까요?
//AnotherFile.swift
class AnotherClassInAnotherFile {
init() {
print("\(accessControl.aPrivateProperty) printed from methodA in AccessControlClass")
print("\(accessControl.aFilePrivateProperty) printed from methodA in AccessControlClass")
print("\(accessControl.anInternalProperty) printed from methodA in AccessControlClass")
}
}
2번과 똑같이 main.swift에서 객체를 만들어줘볼게요! 그리고 출력되는 걸 보면?!
같은 모듈 내에서 접근이 가능했던 internal만 출력되는 걸 볼 수 있습니당!
어차피 private, fileprivate은 오류가 나서 출력이 안됐어요!
이런 접근 제어는 변수/상수뿐만 아니라 클래스, 구조체, 함수 등에도 전부 적용되는 개념이래요.
특히 클래스/구조체에 접근 제어 키워드가 붙을 때는 그 클래스/구조체 안에 있는 변수/상수, 메서드 등의 접근 제어 수준이 클래스/구조체 이하만 가능하다고 합니다.
예를 들어, internal class로 선언된 클래스 안에는 internal/fileprivate/private 수준의 속성과 메서드만 있을 수 있다는 거져! internal이 default이기 때문에 보통은 생략되지만, 우리가 쓰는 class는 internal이었다는 거!
https://www.inflearn.com/course/스위프트-문법-마스터-스쿨
앨런 Swift문법 마스터 스쿨 (온라인 BootCamp - 2개월과정) - 인프런 | 강의
Swift문법을 제대로 이해, 활용해보고자 하는 철학을 바탕으로 과정이 설계되었습니다. 코딩에 대해 1도 모르는 비전공자를 시작으로 네카라쿠배에 입사할 수 있는 초고급 수준까지 올리는 것을
www.inflearn.com
앨런쌤의 강의를 들으면 커스텀 타입에서 접근제어는 어떻게 활용되는지, 상속과 확장에서 접근제어는 어떻게 사용되는지 전부 배울 수 있으니, 궁금하신 분들은 고고!!!
혹시 잘못된 부분이 있다면 언제든 알려주십셔 슨배님덜!!!
'swift' 카테고리의 다른 글
[swift] Struct vs. Class (0) | 2022.03.29 |
---|---|
[swift] Tuple (0) | 2022.03.22 |
[swift] 계산 속성(computed property) (0) | 2022.03.21 |
[swift] Singleton 알아보기 (0) | 2022.03.14 |
[swift] Result Type 알아보기 (0) | 2022.02.03 |
- Total
- Today
- Yesterday