[Swift 문법] 접근 제어자

!·2022년 8월 12일
0

Swift 문법

목록 보기
21/27

모듈과 소스파일

  • 모듈 은 배포할 하나의 코드 묶음 단위로, 통상적으로 하나의 프레임워크나 라이브러리 또는 애플리케이션이 모듈 단위가 될 수 있다.
  • 소스파일 은 말 그대로 하나의 소스파일(.swift) 를 의미한다.

접근 수준

  • open : 모듈 외부까지
  • public : 모듈 외부까지
  • internal : 모듈 외부까지
  • fileprivate : 파일 내부
  • private : 기능 정의 내부

open과 public의 차이는 오버라이드 및 상속 가능성 여부이다.
public 같은 경우에는 모듈 외부의 클래스에 대해 상속 및 오버라이드가 불가능 하지만, open의 경우에는 모듈 외부의 클래스에 대해 상속 및 오버라이드가 가능하다.


접근 제어 구현 참고사항

모든 타입에 적용되는 접근수준의 규칙은 상위요소보다 하위요소가 더 높은 접근 제어 수준을 가질 수 없다 이다. 예를 들어 비공개 접근 수준으로 정의한 구조체 내부의 프로퍼티는 공개수준이나 내부수준의 접근 수준을 갖는 것으로 정의할 수 없다.

private class AClass{
	public func ... /// 불가
    
}

public func sonFuction(a: AClass) -> {
	return a
} /// 불가 

internal class InternalClass{}
private class struct PrivateStruct{}

public var public tuple : (first: InternalClass, second: PrivateStruct) = (InternalClass(), PrivateStruct()) // 오류 발생

private var tuple : (first: InternalClass, second: PrivateStruct) = (InternalClass(), PrivateStruct()) // 가능

익스텐션

  • fileprivateprivate 모두 파일 내부에서만 접근이 가능하며, private 은 조금 더 제한된 접근 제어 수준을 갖는다.
    하지만 extension 키워드 통해 자신을 확장하는 키워드에서 private 의 접근 수준이 파일 내부 수준으로 올라간다.(fileprivate) 와 동일

읽기 전용 접근 제어자

  • 접근 제어자를 통해 프로퍼티에 대한 접근 수준을 조절할 수 있었다. 추가적으로 읽기 전용 접근 제어자를 통해 프로퍼티에 대한 읽기 접근 수준은 제햔을 낮추되, 쓰기 접근에 대한 수준은 높힐 수 있다.
    private(set) 이나 fileprivate(set) 와 같이 표현한다.
class Aclass{
	private count: Int = 0
    
    public private(set) getCount: Int{
    	get{
        	return count
            }
        set{
        	count += 1
         }
    }
    public internal(set) subscript(_ at: Int) -> Int{
        get{
            return 100
        }
        set{
            
        }
    }
}
var hi = Aclass()

print(hi.getCount)	// 1
hi.getCount = 2	// 오류 발생! setter의 접근 제어 수준이 private이다!
print(hi[4]) // 100

profile
개발자 지망생

0개의 댓글