- 다른 소스 파일, 모듈에서 코드에 접근하는 것을 제한하는 것.
-
open
-
가장 개방적인 접근 제어자.
-
모듈 외부에서도 접근 가능.
-
다른 모듈에서 상속, 오버라이드가 가능.
-
주로 프레임워크 개발 시 사용.
ex)
func viewWillApeear(),viewDidLoad()
-
-
public
-
모듈 외부에서 접근 가능.
-
다른 모듈에서 상속 및 오버라이드 불가능.
-
라이브러리나 외부에 공개할 API 개발 시 사용.
ex)
func addSubview(),removeFromSuperview()
-
-
package
- 정의된 패키지 내 모든 소스파일에서 사용 가능.
- 패키지 외부 소스 파일에서는 사용 불가.
- 다중 모듈 패키지 내에서 모듈 간 코드 공유에 유용.
- 패키지에서 여러 모듈을 사용하는 상황에서 ‘패키지 내 여러 모듈 간에만 공유하고 싶은 코드’를 package로 정확하게 표현할 수 있다.
-
internal
- 기본 접근 레벨.
- 같은 모듈 내에서만 접근 가능.
- 일반적인 내부 구현에 사용.
-
fileprivate
- 같은 파일 내에서만 접근 가능.
- 특정 파일 내의 구현을 캡슐화할 때 사용.
-
private
- 가장 제한적인 접근 레벨
- 선언된 타입 내부와, 같은 파일의 해당 타입 extension에서만 접근 가능.
- open
- 다른 모듈에서 상속, 오버라이드 모두 가능
- ex)
override func viewWillAppear(_ animated: Bool)
- public
- 다른 모듈에서 접근은 가능하지만 상속, 오버라이드 불가능
- ex)
view.addSubview(stackView)
-
internal
-
다른 파일에서도 접근이 필요할 때
ex) 모듈 내 다른 파일에서 접근이 가능해야 하는 API 메서드의 경우
func fetchUser()
-
-
fileprivate
- 특정 파일 내 다른 타입에서 접근이 필요할 때.
-
private
- 특정 파일 내부의 세부 구현 사항을 숨기고 싶을 때.
- 클래스,구조체, 열거형 외부에서 접근하면 안되는 프로퍼티나 메서드에 적용.
- 코드 캡슐화와 보안 강화
- 외부에서 함부로 수정하거나 볼 수 없도록 캡슐화 가능.
- 모듈과 소스 파일 간의 경계 설정
- 모듈 외부에서 어디까지 접근 가능한지 모듈과 그 내부의 소스 파일 간의 경계를 설정할 수 있음.
- 의도된 사용 유도
- 내부 구현을 숨겨 외부의 오용 방지
- 변경의 유연성 확보
- 캡슐화 시, 외부에 공개된 부분만 유지하면 되기 때문에 내부 코드를 마음대로 바꿀 수 있다.
- 의존성을 줄이고 책임 명확히 하기
- 캡슐화로 내부와 외부를 구분 지으면 책임이 명확해짐.