Swift code’s Access Control(스위프트의 접근제어)

iOS 개발하다가 자꾸 까먹어서 검색하길래 메모해둡니다. Swift에선 코드에 대한 접근 제어를 open, public, internal, file-private, private로 지정하고 있습니다. 다른 언어들에서 사용하는 것과 거의 유사하지만, 몇개 다른 부분들이 있기도 합니다.

public

많은 언어에서 사용된 것과 동일하게 외부에서 접근이 가능한 레벨입니다. public으로 선언된 부분들은 클래스나 프레임워크 이외에서도 동일하게 호출할 수 있기 때문에 메소드로 빼주는 부분들은 대다수가 public으로 선언됩니다.

public class hackers{
    init(){
        print("hello-world")
    }
}

Other code..

var hacker : hackers = hackers()

open

open은 클래스 외부에서 접근이 가능한 레벨입니다. 클래스나 프레임워크 이외에서도 접근해서 쓸 수 있기 때문에 같이 사용해야하는 공용 인터페이스 등에서 많이 사용됩니다.

public과 거의 비슷하지만, 상속이 가능하고 오버라이딩 또한 가능한다는 점이 있습니다. 재사용이 필요한 부분에선 public이 아닌 open 사용이 필요합니다. (물론 보안적인 관점에선 꼭 필요한 부분, 중요한 부분이 아닐 때 사용해야할 것 같네요)

open class hackers{
    init(){
        print("hello-world")
    }
}

Other code..

public class dotori: hahwul{
    hi(){
        print("Hi")
    }
}

var dd = dotori()
dotori.hi()

internal

내부 코드에서만 사용할 수 있는 레벨입니다. 여기서 내부 코드는 클래스 내부를 의미하는게 아니라 동일 프로젝트상의 코드를 의미합니다.

예를들어서.. A라는 어플리케이션에 B 프레임워크가 들어가있는데, B에 internal로 정의된 함수들은 B 안에서는 어디서든지 사용할 수 있지만, A에선 불러올수가 없습니다.

internal class hackers{
    init(){
        print("hello-world")
    }
}

file-private

솔직히 저는 swift 하면서 처음 본 내용입니다… (보통 public, private, protect.. 너무 구시대같구나..) 찾아본봐로는 file-private을 사용했을 떄 해당 소스코드 파일에서만 사용할 수 있다는 것 같네요.

private

이름 그대로 프라이빗한 접근 레벨입니다. 동일 클래스 등 정의된 구간에서만 사용할 수 있고 그렇기 떄문에 중요한 값이나 코드를 숨기는데 있어서 많이 사용됩니다.

public class hackers{
    init(){
        print("hello-world")
    }
    private secret(){
        print("this is secret")
    }
}