접근 제어자의 종류엔 어떤게 있는지 설명하시오

이하연·2021년 9월 16일
0

[Swift] 스위프트

목록 보기
20/27

접근제어란?

  • 주체와 객체 사이의 정보 흐름을 통제하는 것
    • 주체 - 사용자
    • 객체 - 사용자가 접근하고자 하는 자원
    • 정보 흐름 통제
      : 사용자가 특정 자원에 접근하려고 할때 사용자가 합당한 권한이 있는지 체크하는 일련의 과정
  • 코드끼리 상호작용 시 파일 간, 모듈 간에 접근을 제한
  • 불필요한 접근으로 의도치 않은 결과를 초래하거나 꼭 필요한 이상의 코드가 노출될 위험이 있을 때 사용
    • 캡슐화, 은닉화를 이용한 것
    • 은닉화란
      클래스의 프로퍼티를 private으로 만들어 클래스 밖에서 함부로 접근할 수 없도록 하는 것을 말함
      클래스를 사용할 때 프로퍼티에 직접 접근하는 것은 데이터 무결성 오류에 치명적일 수 있기에 대신 연산프로퍼티(get, set)를 통한 접근을 가능케 하는 것을 말함

접근 수준이란?

  • 접근 제어는 접근 수준 키워드를 통해 구현 가능
  • 각 타입에 특정 접근수준을 지정할 수 있고, 타입 내부의 프로퍼티, 메서드, 이니셜라이저에도 접근 수준 지정 가능
  • 접근 수준을 명시할 수 있는 키워드는 open, public, internal, fileprivate, private가 있음.

접근 제어자 5가지 종류

Private 비공개 접근 수준

  • 가장 한정적인 범위
  • 기능을 정의하고 구현한 범위 내에서만 사용 가능
  • private로 지정한 기능은 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용 불가

Fileprivate 파일 외부 비공개 접근 수준

  • fileprivate로 지정된 요소가 구현된 소스파일 내부에서만 사용 가능
  • 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용하면 좋다.

Internal 내부 접근 수준

  • 기본적으로 모든 요소에 암묵적으로 저장하는 기본 접근 수준
    → 즉, 지정하지 않을 경우 internal로 설정 ( 표기하지 않아도 됨 )
  • internal로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있음
    But 그 모듈을 가져다 쓰는 외부 모듈에서는 접근 불가
  • 보통 외부에서 사용할 클래스나 구조체가 아니고, 모듈 내부에서 광역적으로 사용할 경우에 지정한다.

Public 공개 접근 수준

  • public으로 지정된 요소는 어디서든 쓰일 수 있음
  • 주로 프레임워크에서 외부와 연결된 인터페이스를 구현하는데 많이 쓰임

Open 개방 접근 수준

  • 공개 접근수준 이상으로 높은 접근수준
  • 클래스와 클래스 멤버에서만 사용 가능
  • 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속할 수 있음
  • open으로 정의된 클래스 멤버는 정의된 모듈 밖의 다른 모듈에서도 재정의 가능
  • 클래스를 open으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모 클래스로 사용할 목적으로 설계했다는 것을 의미함

접근제어 구현 참고사항

  • 상위 요소보다 하위요소가 더 높은 접근수준은 가질 수 없다.
  • 함수의 매개변수로 특정 접근수준이 부여된 타입이 전달되거나 반환한다면, 그 타입의 접근수준보다 함수의 접근수준이 높게 설정될 수 없다.
  • 프레임워크를 만들 때, 다른 모듈에서 특정 기능에 접근할 수 있도록 API로 사용할 기능을 공개 접근 수준으로 지정해주어야한다.
  • 열거형 내부의 각 case별로 따로 접근수준을 부여할 수 없고, 각 case의 접근수준은 열거형 자체의 접근수준을 따른다.

응용 ) 읽기 전용 구현

읽기 전용이란, 값을 가져갈 수는 있지만 변경할 수 없도록 구현

  • 설정자만 더 낮은 접근 수준을 갖도록 제한하면 된다.

  • setter를 위한 접근 제어자 ( setter가 getter보다 더 제한적으로 설정가능 )
    요소의 접근수준 키워드 뒤에 접근수준(set)처럼 표현하면 설정자의 접근수준만 더 낮도록 지정가능

    ```swift
    public private(set) var publicGetOnlyStoredProperty: Int = 0
    ```
  • 설정자 접근수준 제한은 프로퍼티, subscript, 변수 등에 적용 가능

  • 해당 요소의 접근수준보다 같거나 낮은 수준으로 제한해줘야 한다.

  • 예시

    Setter만 더 낮은 접근수준을 갖도록 제한할 수 있음

    private(set) var property: Type

    접근은 public이지만 설정은 비공개로 할 수 있음

    public private(set) var property: Type

왜 사용하는가?

외부에서 보거나 접근하면 안되면서 코드의 필요한 부분만을 제공

0개의 댓글