Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
73 changes: 73 additions & 0 deletions LEVEL 1/10-Access-Control.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
## Swift의 접근 제어자(Access Control Levels)에 대해 설명해주세요.
- 다른 소스 파일, 모듈에서 코드에 접근하는 것을 제한하는 것.

1. open
- 가장 개방적인 접근 제어자.
- 모듈 외부에서도 접근 가능.
- 다른 모듈에서 상속, 오버라이드가 가능.
- 주로 프레임워크 개발 시 사용.

ex) `func viewWillApeear()`, `viewDidLoad()`

2. public
- 모듈 외부에서 접근 가능.
- 다른 모듈에서 상속 및 오버라이드 불가능.
- 라이브러리나 외부에 공개할 API 개발 시 사용.

ex) `func addSubview()`, `removeFromSuperview()`

3. package
- 정의된 패키지 내 모든 소스파일에서 사용 가능.
- 패키지 외부 소스 파일에서는 사용 불가.
- 다중 모듈 패키지 내에서 모듈 간 코드 공유에 유용.
- 패키지에서 여러 모듈을 사용하는 상황에서 ‘패키지 내 여러 모듈 간에만 공유하고 싶은 코드’를 package로 정확하게 표현할 수 있다.
4. internal
- 기본 접근 레벨.
- 같은 모듈 내에서만 접근 가능.
- 일반적인 내부 구현에 사용.
5. fileprivate
- 같은 파일 내에서만 접근 가능.
- 특정 파일 내의 구현을 캡슐화할 때 사용.
6. private
- 가장 제한적인 접근 레벨
- 선언된 타입 내부와, 같은 파일의 해당 타입 extension에서만 접근 가능.


## open과 public의 차이점은 무엇인가요?
- open
- 다른 모듈에서 상속, 오버라이드 모두 가능
- ex) `override func viewWillAppear(_ animated: Bool)`
- public
- 다른 모듈에서 접근은 가능하지만 상속, 오버라이드 불가능
- ex) `view.addSubview(stackView)`

## internal, fileprivate, private의 사용 시기는 어떻게 결정하나요?
- internal
- 다른 파일에서도 접근이 필요할 때

ex) 모듈 내 다른 파일에서 접근이 가능해야 하는 API 메서드의 경우

`func fetchUser()`

- fileprivate
- 특정 파일 내 다른 타입에서 접근이 필요할 때.
- private
- 특정 파일 내부의 세부 구현 사항을 숨기고 싶을 때.
- 클래스,구조체, 열거형 외부에서 접근하면 안되는 프로퍼티나 메서드에 적용.

## 접근 제어자를 사용하는 이유는 무엇인가요?

1. 코드 캡슐화와 보안 강화
- 외부에서 함부로 수정하거나 볼 수 없도록 캡슐화 가능.
2. 모듈과 소스 파일 간의 경계 설정
- 모듈 외부에서 어디까지 접근 가능한지 모듈과 그 내부의 소스 파일 간의 경계를 설정할 수 있음.
3. 의도된 사용 유도

---

### 코드 캡슐화를 해야하는 이유
1. 내부 구현을 숨겨 외부의 오용 방지
2. 변경의 유연성 확보
- 캡슐화 시, 외부에 공개된 부분만 유지하면 되기 때문에 내부 코드를 마음대로 바꿀 수 있다.
3. 의존성을 줄이고 책임 명확히 하기
- 캡슐화로 내부와 외부를 구분 지으면 책임이 명확해짐.