[Swift] 접근제어에 대해 알아보자!

zooneon·2020년 11월 7일
1

Swift 기본 문법

목록 보기
5/14

본 내용은 '스위프트 프로그래밍' 책을 학습한 후 이를 바탕으로 작성한 글입니다.

접근제어

접근제어란?

- 접근제어는 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능이다.
- 불필요한 접근으로 의도치 않은 결과를 초래하거나 꼭 필요한 부분만 제공을 해야하는데 전체 코드가 노출될 가능성이 있을 때 접근제어를 이용한다.

접근수준

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

open - 개방 접근수준

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

public - 공개 접근수준

  • public 키워드로 접근수준이 지정된 요소는 어디서든 쓰일 수 있다.
  • 공개 접근수준은 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 쓰인다.

internal - 내부 접근수준

  • 내부 접근수준은 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준이다.
  • 내부 접근수준으로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있다.
  • 하지만 그 모듈을 가져다 쓰는 외부 모듈에서는 접근할 수 없다.
  • 보통 외부에서 사용할 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용할 경우 내부 접근수준을 지정한다.
  • internal은 기본 접근수준이므로 굳이 표기하지 않아도 된다.

fileprivate - 파일외부비공개 접근수준

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

private - 비공개 접근수준

  • 비공개 접근수준은 가장 한정적인 범위이다.
  • 비공개 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용할 수 있다.
  • 비공개 접근수준으로 지정한 기능은 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용할 수 없다.


이미지 출처 : https://dev-jiwon.github.io/swift-grammar-13/

접근제어 구현 참고사항

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

//AClass의 접근수준이 비공개 접근수준이므로 공개 접근수준 함수의 매개변수나 반환 값 타입으로 사용할 수 없음
public func someFunction(a: AClass) -> AClass {
		return a    
}
//오류 발생

읽기 전용 구현

  • 값을 가져갈 수는 있지만 변경할 수 없도록 구현하고 싶을 때 설정자만 더 낮은 접근수준을 갖도록 제한하면 된다.
  • 요소의 접근수준 키워드 뒤에 접근수준(set)처럼 표현하면 설정자의 접근수준만 더 낮도록 지정해줄 수 있다.
  • 설정자 접근수준 제한은 프로퍼티, 서브스크립트, 변수 등에 적용될 수 있으며, 해당 요소의 접근수준보다 같거나 낮은 수준으로 제한해주어야 한다.
public struct SomeType {
    private var count: Int = 0
    
    public var publicStoredProperty: Int = 0
    
    //설정자는 비공개 접근수준
    public private(set) var publicGetOnlyStoredProperty: Int = 0
    
    internal var internalComputedProperty: Int {
        get {
            return count
        }
        
        set {
            count += 1
        }
    }
    
    //설정자는 비공개 접근수준
    internal private(set) var internalGetOnlyComputedProperty: Int {
        get {
            return count
        }
        
        set {
            count += 1
        }
    }
}

var someInstance: SomeType = SomeType()

print(someInstance.publicStoredProperty)    //0
someInstance.publicStoredProperty = 100

print(someInstance.publicGetOnlyStoredProperty)     //0
//someInstance.publicGetOnlyStoredProperty = 100    //오류 발생

print(someInstance.internalComputedProperty)    //0
someInstance.internalComputedProperty = 100

print(someInstance.internalGetOnlyComputedProperty)     //1
//someInstance.internalGetOnlyComputedProperty = 100    //오류 발생
profile
블로그 이전했습니다. https://blog.zooneon.dev

1개의 댓글

comment-user-thumbnail
2022년 3월 28일

잘 봤습니다!

답글 달기