31일차 수업 내용을 정리한 글입니다.
Learned
접근 제어 (Access Control)
1) 개요
- 특정 코드에 대한 접근을 소스파일 또는 모듈 단위로 제한하는 것
- 접근 제어를 통해 코드의 세부적인 구현을 감추고 필요한 만큼만 공개할 수 있음.
- 코드가 사용될 수 있는 범위를 직관적으로 나타낼 수 있고,
공개될 필요가 없는 불필요한 코드를 감춰서 오류를 방지하는 효과가 있음. - 객체 지향 프로그래밍의 특성 중 하나인 은닉화 특성을 구현할 수 있음.
2) 모듈과 소스파일
- 접근 제어는 모듈과 소스파일을 기준으로 판단함.
- 모듈이란 import 키워드를 통해서 사용할 수 있는 코드 묶음의 단위를 의미하며
앱과 프레임워크를 하나의 모듈로 볼 수 있다. - 소스파일은 모듈 안에 있는 .swift 같은 파일들을 의미하며 각 소스파일에
특정 타입을 선언하여 사용할 수 있음.
3) 접근 레벨 (Access Level)
- 바깥의 접근 레벨이 내부 접근 레벨보다 높아야 한다. (덜 제한적이어야 함)
- public 변수는 internal, fileprivate, private 타입 내부에서 선언될 수 없다.
- 함수의 접근 레벨이 파라미터와 리턴 타입의 접근 레벨보다 높을 수 없다.
- 접근자 (Accessor)
- open, public
선언된 모듈이 아닌 다른 모듈에서 접근할 수 있음.
open은 클래스에만 사용할 수 있고 다른 모듈에서 오버라이딩과 상속을 가능하게 함.
public은 다른 모듈에서 오버라이딩, 상속 불가능 - internal
기본적으로 설정되는 접근 레벨이며 선언된 모듈 전체에서 접근할 수 있음. - fileprivate
선언된 소스파일 안에서만 접근할 수 있음. - private
선언된 괄호(블록) 안에서만 접근할 수 있음.
- open, public
- 클래스
- 클래스에 지정한 접근 레벨이 클래스의 내부 프로퍼티와 메서드의 리턴 타입의
기본 접근 레벨로 설정됨. - 단, public으로 선언될 경우 내부 멤버는 기본적으로 internal 접근 레벨을 가짐.
(노출되면 안되는 코드가 실수로 노출되는 것을 막기 위함)
- 클래스에 지정한 접근 레벨이 클래스의 내부 프로퍼티와 메서드의 리턴 타입의
// 명시적 public
public class SomePublicClass {
public var somePublicProperty = 0 // 명시적 public
var someInternalProperty = 0 // 기본적 internal
fileprivate func someFilePrivateMethod() {} // 명시적 file-private
private func somePrivateMethod() {} // 명시적 private
}
// 명시적 fileprivate
fileprivate class SomeFilePrivateClass {
func someFilePrivateMethod() {} // 기본적 fileprivate
private func somePrivateMethod() {} // 명시적 private
}
- 함수
- 함수 타입에 대한 접근 레벨은 내부 파라미터와 리턴 타입 중
가장 최소인(제한적인) 접근 레벨로 설정됨. - 만약 파라미터 타입과 리턴 타입이 각각 internal, private이라면
함수에 private 접근 레벨을 명시해야함.
- 함수 타입에 대한 접근 레벨은 내부 파라미터와 리턴 타입 중
private func someFunction() -> (SomeInternalClass, SomePrivateClass) {
// 리턴 타입인 튜플의 접근 레벨은 내부 요소 중 가장 제한적인 접근 레벨로 설정됨.
// 따라서 리턴되는 튜블의 접근 레벨은 private이므로 함수 선언 시 private을 명시함.
}
- 열거형
- 열거형 타입에 설정된 접근 레벨이 모든 case에 동일하게 적용됨.
- case 별로 다른 접근 레벨을 설정할 수 없음.
- 프로토콜
- 프로토콜에 설정한 접근 레벨이 요구사항에 동일하게 적용됨.
- 프로토콜을 상속하여 새로운 프로토콜을 선언하는 경우
새로운 프로토콜은 상속한 프로토콜과 같은 접근 레벨을 가짐. - 높은 접근 레벨의 타입이 낮은 접근 레벨의 프로토콜을 준수할 수 있음.
그럴 경우 해당 타입은 준수하는 프로토콜의 접근 레벨과 동일하게 적용됨.
- 익스텐션
- 익스텐션을 통해 클래스, 구조체, 열거형에 추가한 새로운 멤버는
해당 타입과 동일한 접근 레벨이 적용됨. - 프로토콜에 새로운 요구사항을 추가할 경우 역시 마찬가지로
프로토콜의 접근 레벨이 동일하게 적용됨. - 익스텐션에서 private으로 설정된 멤버에 접근할 수 있음.
(같은 블록에 있는 것 처럼 취급되기 때문)
- 익스텐션을 통해 클래스, 구조체, 열거형에 추가한 새로운 멤버는
커스텀 프레임워크(모듈) 구현
- 접근 제어를 적절히 사용해서 커스텀 프레임워크를 만들 수 있음.
- 여러 기능을 모듈로 나누면 프로젝트가 가벼워진다는 장점이 있음.
- 프레임워크를 통해 앱의 결합도를 낮추고 응집도를 높이는 것이 바람직함.
- 결합도 : 모듈과 모듈이 의존적으로 결합돼있는 정도
- 응집도 : 모듈들이 공통의 목적을 가지고 연관돼있는 정도
Learning
- 스위프트 공식 문서의 "접근 제어" 공부하고 정리하기
- 인터페이스 빌더의 ContainerView 코드로 구현할 수 있는지 알아보기
이상입니다.
'TIL' 카테고리의 다른 글
[Sesac IOS] 33일차 TIL (0) | 2022.08.18 |
---|---|
[Sesac IOS] 32일차 TIL (0) | 2022.08.18 |
[Sesac IOS] 30일차 TIL (0) | 2022.08.16 |
[Sesac IOS] 29일차 TIL (0) | 2022.08.12 |
[Sesac IOS] 28일차 TIL (0) | 2022.08.11 |