티스토리 뷰

iOS

iOS) 접근제어(Access Control)

hyun99999 2022. 8. 27. 02:48
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판 - 야곰

0118 추상화.캡슐화.은닉화.상속성.다형성-객체지향 개발

Swift 접근 제어자(Access Control)

Swift ) Access Control(접근 제어) - (1)

728x90
반응형
댓글
최근에 올라온 글
최근에 달린 댓글
글 보관함
«   2024/12   »
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 31
링크
Total
Today
Yesterday