From bcaa7fa0296966903ba825ebaa7faf1dc8381cc1 Mon Sep 17 00:00:00 2001 From: zzangmmz <109843103+zzangmmz@users.noreply.github.com> Date: Tue, 25 Feb 2025 01:08:38 +0900 Subject: [PATCH 1/3] Create 10-Access-Control.md --- LEVEL 1/10-Access-Control.md | 73 ++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 LEVEL 1/10-Access-Control.md diff --git a/LEVEL 1/10-Access-Control.md b/LEVEL 1/10-Access-Control.md new file mode 100644 index 0000000..7303f52 --- /dev/null +++ b/LEVEL 1/10-Access-Control.md @@ -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. 의존성을 줄이고 책임 명확히 하기 + - 캡슐화로 내부와 외부를 구분 지으면 책임이 명확해짐. From 424e9ef7387460114ff6550d49709740052556d8 Mon Sep 17 00:00:00 2001 From: zzangmmz <109843103+zzangmmz@users.noreply.github.com> Date: Tue, 25 Feb 2025 01:09:48 +0900 Subject: [PATCH 2/3] [LEVEL 1] 10 - Access Control (#10) From d2ff5fad73d46dc0ba4a16a68120233e4b72dc15 Mon Sep 17 00:00:00 2001 From: zzangmmz <109843103+zzangmmz@users.noreply.github.com> Date: Tue, 25 Feb 2025 01:10:34 +0900 Subject: [PATCH 3/3] [LEVEL 1] 10 - Access Control (#10) --- LEVEL 1/10-Access-Control.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/LEVEL 1/10-Access-Control.md b/LEVEL 1/10-Access-Control.md index 7303f52..329f261 100644 --- a/LEVEL 1/10-Access-Control.md +++ b/LEVEL 1/10-Access-Control.md @@ -15,7 +15,7 @@ - 라이브러리나 외부에 공개할 API 개발 시 사용. ex) `func addSubview()`, `removeFromSuperview()` - + 3. package - 정의된 패키지 내 모든 소스파일에서 사용 가능. - 패키지 외부 소스 파일에서는 사용 불가.