접근 제어는 다른 소스 파일, 코드가 또 다른 코드의 특정 부분에 접근하는 것을 제한하는 놈이다.
이 접근 제어를 적절하게 활용하면 코드 구현의 세부사항을 분리하고
외부에서 접근 가능한 코드와 그렇지 않은 코드를 분리 할 수 있다.
프로토콜을 사용하기에도 용이해진다.
접근 레벨의 할당은 Class, Struct, Enum 뿐 아니라 Property, Method, Initializer, Subscripts 에도 사용할 수 있다. 전역 상수, 변수도 마찬가지.
Access Level (접근 수준)
이 엑세스 레벨을 사용한 녀석(class, struct, enum, variable, method 등등) 을 엔티티(Entities) 로 통칭한다.
•
Private : 엔티티를 둘러싸는 선언과 그 선언의 동일 파일 내에서 사용되는 확장(Extension) 에서 접근할 수 있다는 뜻이다.
- Extension이 덩치가 커지면 별도 파일로 분리되는 경우가 있는데
이 때 Private 변수에 접근 할 수 없다.
- 애초에 그런 변수에 접근할 필요가 있는 것들을 분리하는 것 자체를 피하는게 제일 좋다.
- 어쩔 수 없는 경우엔 값을 전달해줘야 한다.
- 값을 전달해야 한다. private 를 internal이나 public으로 풀라는 뜻이 아니다.
- 풀면 목적이 달라진다.
Plain Text
복사
•
File-Private : 같은 file 내에서만 접근이 가능하도록 제한한다는 뜻이다.
언뜻 Private 과 유사해보인다.
기억해야 할 것은 Private 보다 한단계 열려있다는 사실이
class Class1 {
private var privateValue: NSObject?
fileprivate var filePrivateValue: NSObject?
}
class Class2 {
let class1 = Class1()
func useFunction() {
someClass.privateValue
someClass.filePrivateValue
}
}
Swift
복사
같은 파일에서 class2 에서 class1 으로 접근 할 때 fileprivate에는 접근이 가능하다는게 핵심
•
Internal : '같은 모듈안에만 있다면' 어떤 소스파일에서도 접근이 가능하다는 뜻
•
Public : '다른 모듈' 에서도 접근이 가능하다는 뜻
•
Open : 기본적으로 public과 접근 레벨은 같지만 Override가 가능하다, 즉 상위 클래스의 변경이 가능하다는 점이 가장 큰 차이점이다.
아무것도 선언하지 않으면 기본 값은 internal 이다.
그럼 또 헷갈리는게 있다.
public class SomePublicClass {
public var somePublicProperty = 0
var someInternalProperty = 0 // -> 이놈은 public 인가?
}
class SomeInternalClass {
var someInternalProperty = 0 // -> 이놈은 뭘까?
}
fileprivate class SomeFilePrivateClass {
func someFilePrivateMethod() {} // -> 이놈은 fileprivate 인가?, Private는 아니겠지
}
private class SomePrivateClass {
func somePrivateMethod() {} // -> 이놈은 private 인가?
}
Swift
복사
공식 문서에서 추려낸 코드다.
두개씩 묶어 생각하면 편하다. Private가 들어있는 둘은 상위 선언을 따라간다.
상위 클래스가 각각 fileprivate 와 private 면 하위에 선언된 애들도 같은 접근레벨을 가진다.
(외부에서 봤을 때 얘기다.)
나머지 public과 open, 그리고 선언하지 않은 기본값 internal은 상위 선언과 관계없이 명시적으로 선언한 접근 레벨을 가진다.
즉, 아무것도 선언안하면 Internal, public이나 open을 사용하려면 따로 명시해줘야 한다는 말이다.