develop
AccessControl 접근 한정자 본문
접근 한정자라고 한다.
class나 struct, enum, extension, method에 접근 한정자를 붙여 모듈 외부에서 사용할 수 있거나 클래스 내부에서만 사용하게 할 수 있다.
접근한정자의 종류는 open, public, internal, fileprivate, private 이 있다.
open
가장 열려있는 접근 한정자이고 전체적으로는 public과 유사하지만
- 타모듈에서 만들어진 class의 접근한정자가 open 이면 상속을 할수 있다.
- 타모듈에서 만들어진 method의 접근한정자가 open이면 override를 할수 있다.
- 같은 모듈에서는 public이나 internal과 동일하다.
public
- 다른 모듈의 public 로 된 클래스를 상속할려고 하면 Cannot inherit from non-open class '' outside of its defining module 이란 class가 open 되지 않았다는 에러가 나온다.
- 다른 모듈의 public로 된 메서드를 override 하려고 하면 Overriding non-open instance method outside of its defining module 이란 method가 open되지 않았다는 에러가 나온다.
internal
타 모듈에서 internal 접근한정자로 만들어진 클래스를 코드에서는 가져올 수 없지만 storyboard, xib에서는 가져올 수 있다.
xml에서도 internal의 접근한정자는 쓸 수 없어야 하는데 xml과 코드에서 타 모듈을 가져오는 구조가 달라서 가져올 수 있는거 같다. xml에서 @IBOutlet(Interface Bulider Outlet)로 연결하면 Use of undeclared type '' 이런 에러가 나온다.
접근한정자를 지정하지 않았을 때 기본적으로 사용 되는 접근 수준이고 같은 모듈 에서는 자유롭게 사용 가능하다.
fileprivate
타 모듈에서 만들어진 클래스나 메서드를 코드나 storyboard, xib에서 가져올 수 없다.
같은 모듈에서 만들어진 fileprivate 접근한정자 클래스를 storyboard, xib에서
Unknown class 클래스명 in Interface Builder file.
이란 에러가 나온다.
클래스는 같은 파일 내에서만 접근 가능하고 메서드도 같은 파일 내에서만 접근 가능하다.
private
타 모듈에서 만들어진 클래스나 메서드를 코드나 storyboard, xib에서 가져올 수 없다.
같은 모듈에서 만들어진 클래스를 xml에서
Unknown class 클래스명 in Interface Builder file.
이란 에러가 나온다.
클래스는 같은 파일 내에서만 접근 가능하고 메서드는 같은 블록(클래스) 내에서만 접근 가능하다.
class ViewController: UIViewController {
private var name = ""
}
extension ViewController {
func doSomething() {
self.name = "name"
}
}
같은 파일에서는 이렇게 extension 안에서도 class, struct, enum등 같은 영역에서는 접근 가능하다.
같은 모듈
클래스
- 상속가능: open, public, internal
- 접근가능: open, public, internal
- storyboard, xml에서 사용가능: open, public, internal
- 같은파일에서 접근 가능: open, public, internal, fileprivate, private
메서드
- 오버라이드가능: open, public, internal
- 호출가능: open, public, internal
- 같은파일에서 호출 가능: open, public, internal, fileprivate
타 모듈
클래스
- 상속가능: open
- 접근가능: open, public
- xml에서 사용가능: open, public, internal
메서드
- 오버라이드가능: open
- 호출가능: open, public
open, public, internal은 타 모듈을 사용 할때 차이가 나누어진다. fileprivate와 private은 메서드를 호출 할때 블럭 내부에서 호출 인지 블럭 외부에서 호출 인지 차이가 나누어진다.
set
internal(set) var name = "Kim Gwanho"
fileprivate(set) var age = 27
private(set) var gender = "M"
public private(set) var address = "서울"
이렇게 접근한정자 뒤에 set을 붙여도 된다.
set을 붙인다는 것은 name이나 age, gender를 접근할때는 internal수준으로 어디서든지 접근할수 있지만 set할때는 접근한정자를 따른다.
타 모듈에서 set할 때는 접근한정자를 따르고 클라이언트는 get만 쓸 수 있게 하고 싶을때는 public private(set) 과 같이 쓸 수 있다.
- name는 같은 모듈 내 어디서든지 값을 가져올 수 있지만 어디서든지 값을 바꿀 수 있다.
- age는 같은 모듈 내 어디서든지 값을 가져올 수 있지만 같은 파일 내에서만 값을 바꿀 수 있다.
- gender는 같은 모듈 내 어디서든지 값을 가져올 수 있지만 같은 클래스(블럭) 내부에서만 값을 바꿀 수 있다.
- address는 같은 모듈, 타 모듈 어디서든지 값을 가져올 수 있지만 같은 파일 내에서만 값을 바꿀 수 있다.
inheritModuleFromTarget
By checking the “Inherited from Target” option the module gets compiled in for the targets I use it in (Target Memberships for swift file and everything works.
Inherit Module From Target을 체크하면 내가 소속 되어있는 타겟 모듈만 기본적으로 선택되고
체크를 하지 않으면 모듈을 직접 넣어 줘야 한다.
'iOS' 카테고리의 다른 글
Standard Library Protocol (0) | 2021.01.16 |
---|---|
OptionSet (0) | 2021.01.15 |
where Keyword (for의 where, switch 의 where, extension의 where, func의 where) (0) | 2021.01.13 |
Higher Order Functions 고차함수 (0) | 2021.01.12 |
AutoLayout (0) | 2021.01.11 |