티스토리 뷰
728x90
반응형
객체지향 프로그래밍 패러다임에서 은닉화는 중요한 개념 중 하나이다. 이를 구현하기 위한 핵심 기능인 접근제어에 대해 알아보자.
들어가기 전
- 은닉화하니까 생각이 났는데 캡슐화랑 무엇이 다를까?
- 모듈과 소스파일은 무엇일까?
✅ 은닉화? 캡슐화?
- 은닉화(hiding) :
내부 데이터와 연산을 외부에서 접근하지 못하도록 은닉(hiding) 혹은 격리(isolation)시키는 것이다.
객체 외부에서 객체내의 데이터 접근을 제한하고 데이터를 수정, 조작하는 동작은 내부에 두고 접근(getter),설정(setter)하는 메소드로 데이터를 얻는다.
- 캡슐화(encapsulation)
캡슐 알약에 비유할 수 있다. 연관있는 약효를 가진 약끼리 모여있고 감싸서 외부에서 무엇이 있는지 알 수 없다. 즉, 연관 있는 변수와 함수를 클래스로 묶는 작업을 말한다. 외부에서 내부 멤버들을 사용할수 있는 방법을 설정하여 사용 할 수 있도록 한다.
✅ 모듈과 소스파일
스위프트의 접근제어는 모듈과 소스파일을 기반으로 설계되어있다.
- 모듈(Module) : 배포할 코드의 묶음 단위. 통상 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단위가 될 수 있고, import 를 사용해 불러온다.
- 소스파일(Source File) : 하나의 스위프트 소스 코드 파일을 의미.
👉 다섯개의 접근 제어자
위에서 아래로 접근수준이 한정적이게 된다.
open
- public 접근수준보다 높다. 모듈 내부, 모듈 외부에서도 사용가능하다. open 은 유일하게 외부 모듈에서도 상속이 가능하다. 외부 모듈에서 재정의가 가능하다.(이것이 public 과 다른 점)
- 예를 들어, 클래스를 open 접근수준으로 지정하게 되면 다른 모듈에서 상속하여 사용할 수 있다. 우리가 외부 모듈인 UIKit 에서 UIViewController 를 상속받아 사용할 수 있는 것도 이와 같은 이유이다.
@available(iOS 2.0, *)
open class UIViewController : UIResponder, NSCoding, UIAppearanceContainer, UITraitEnvironment, UIContentContainer, UIFocusEnvironment {
// ...
public
- 구현된 소스파일, 같은 모듈, 그 모듈을 가져다 쓰는 모듈 등 모든 곳에서 사용할 수 있다. pulic 접근수준은 프레임워크에서 인터페이스를 구현할 때 주로 사용된다.
internal
- 기본적으로 암묵적으로 지정되는 기본 접근수준이다. 즉, 아무런 접근 제어자가 없다면 internal 접근수준이라고 보면 된다. 외부 모듈에서 사용하는 것이 아닌 모듈 내부에서 사용될 때 지정된다.
fileprivate
- 구현된 소스파일 내부에서만 사용할 수 있다. 소스파일 외부에서 호출되지 않는 경우에 혹은 호출되면 부작용이 생길 우려가 있는 경우 사용한다.
private
- 가장 한정적인 범위를 가진 접근수준이다. 정의하고 구현한 범위내에서만 사용할 수 있다.
- extension 코드가 같은 파일에 존재하는 경우에도 사용할 수 있습니다.
✅ 참고사항
- 접근수준에는 규칙이 있다. 상위 요소보다 하위 요소가 더 넓은 접근수준을 가질 수 없다.
예를 들어, private 클래스의 함수로 public 과 같이 더 넓은 접근수준은 private 접근수준으로 취급된다. - 또한, 매개변수로 전달되거나 반환되는 타입의 접근수준보다 함수의 접근수준이 넓게 설정될 수 없다.(이때는 오류가 발생한다.)
예를 들어, public 함수는 private 의 타입을 반환하거나 전달할 수 없다. - 열거형의 접근수준을 구현할 때는 각 case 별로 따로 접근수준을 설정할 수 없다. 그래서 열거형 자체의 접근수준을 따르고, 그렇기 때문에 열거형의 접근수준보다 좁은 접근수준의 타입은 원시 값으로 될 수 없다.
예를 들어, public 열거형은 private 타입을 원시 값으로 사용할 수 없다.
✅ get set 접근제어자 설정
연산 프로퍼티의 경우 get 과 set 의 접근수준을 별도로 설정할 수 있다. 이를 통해 setter 만 더 낮은 접근수준을 부여하여 읽기전용 프로퍼티를 만들 수 있다.
- 설정자(setter) 접근수준은 해당 요소의 접근수준보다 같거나 좁은 수준이어야 합니다.
(쉽게 생각해서 설정자로 해당 요소를 설정하는 것인데 해당 요소가 더 좁은 접근수준을 갖는 것은 이상하다고 보면 된다.)
public class SomeClass {
private var count: Int = 0
// public 접근수준의 프로퍼티.
// 설정자는 private 접근수준.(읽기 전용)
public private(set) var publicGetOnlyStoredProperty: Int {
get {
return count
}
set {
count += 1
}
}
출처
SWIFT 스위프트 프로그래밍 3판 - 야곰
728x90
반응형
'iOS' 카테고리의 다른 글
iOS) Property Wrapper 로 User Defaults 리펙토링하기 (0) | 2022.09.01 |
---|---|
iOS) Dependency Injection(의존성 주입) (0) | 2022.08.28 |
iOS) COW(Copy-on-Write) (0) | 2022.08.25 |
iOS) DispatchQueue에서 [weak self] 를 사용해야만 하나요? (0) | 2022.08.24 |
iOS) UIView.animate(...) 왜 메모리릭이 발생하지 않나요? (2) | 2022.08.23 |
댓글
TAG
- WWDC
- YPImagePicker
- async/await
- urlsession
- RxCocoa
- WidgetKit
- MOYA
- Algorithm
- rxswift
- UserDefaults
- watchOS
- Protocol
- containerBackground
- projectsetting
- github
- IOS
- Widget
- OpenSourceLibrary
- Firebase
- WWDC22
- 서버통신
- MVVM
- SwiftUI
- configurable widget
- 2022 KAKAO TECH INTERNSHIP
- Swift
- CloneCoding
- APNS
- Objective-C
- Notification
최근에 올라온 글
최근에 달린 댓글
글 보관함
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
링크
- Total
- Today
- Yesterday