Swift/개념 & 응용

[Swift] Swift 문법 - 접근 제어

유정주 2021. 8. 28. 00:10
반응형

안녕하세요.

 

오늘은 Swift의 접근 제어(access control / access modifier)에 대해 알아보겠습니다

Java에서는 public, protected, private 등이 대표적인데

Swift에는 어떤 종료가 있을지 알아보겠습니다.

 

그럼 시작하겠습니다.


참고 자료

해당 포스팅은 Smile Han님의 유튜브 영상을 참고하며 작성하였습니다.

https://www.youtube.com/channel/UCM8wseo6DkA-D7yGlCrcrwA


Swift 접근 제어

접근 속성은 클래스, 메서드, 멤버의 접근 가능성을 설정하는 객체 지향 언어의 키워드입니다.

구성 요소를 캡슐화하는 데 사용합니다.

 

접근 제어라는 단어가 낯설 수 있는데요, 익숙한 접근 제어로는 private, protected, public 등이 있습니다.

물론 Swift에도 다양한 접근 제어 키워드가 있습니다.

 

open/public -> internal(기본) -> fileprivate -> private 순으로 좁은 범위의 접근 속성입니다.

하나하나 알아보도록 하겠습니다.


open, public

open과 public으로 설정하면 어디에서든 사용 가능할 수 있습니다.

심지어 다른 모듈의 소스파일에서도 사용이 가능합니다.

일반적으로 Framework에 공용 interface를 지정할 때 open 또는 public 접근을 사용한다고 하네요.

다만 open은 클래스 및 클래스 멤버에게만 적용된다는 것이 public과 차이가 있습니다.


internal

접근 제어를 생략하면 internal이 기본으로 적용됩니다.

internal로 설정하면 모듈(Module) 내에서만 사용이 가능합니다.

여기서 모듈이란 코드 배포의 단일 유닛으로 앱, Framework, 외부 라이브러리 등이 있습니다.

 

internal은 외부의 소스 파일에서는 사용하지 못합니다.

일반적으로 App이나 Framework의 내부 구조를 정의할 때 internal 접근을 사용하네요.


fileprivate

fileprivate는 이름에서 알 수 있듯이 동일 소스파일 내에서만 사용 가능합니다.


private

private는 기능 정의(Functionalilty declaration) 내에서만 사용 가능합니다.

즉, 해당 블록에서만 사용 가능하도록 하는 아주 좁은 범위의 접근 속성입니다.


예시

public class MyPublicClass { //모든 곳에서 사용 가능
    fileprivate var name: String = "Jeong" //현재 소스파일 내에서 사용 가능
    private func play() {} //현재 블록 내에서만 사용 가능
    func display() {} //모듈 내에서 사용 가능
}

var myInstance = MyPublicClass()
myInstance.display() //internal이기 때문에 에러가 나지 않음

myInstance.play() //에러 발생

위 코드를 그대로 실행하면 play()에서 에러가 발생합니다.

play()의 접근 속성이 private이기 때문인데요.

'play' is inaccessible due to 'private' protection level 에러가 납니다.

이렇게 private는 아주 좁은 범위이기 때문에 안전하다는 장점이 있지만 남발하면 확장성이 낮다는 단점이 있습니다.


접근 속성은 상황에 따라 적절한 속성을 고르는 것이 핵심인 듯합니다.

범위와 관련된 안전성과 확장성을 고려해야 한다는 것이 큰 고민이 필요한 사항인 것 같네요.

실제 앱 개발을 하며 경험이 쌓여야 할 듯합니다.

 

감사합니다!


아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

반응형