조용한 담장

코틀린(Kotlin) 클래스(Class) : Visibility Modifiers 본문

kotlin

코틀린(Kotlin) 클래스(Class) : Visibility Modifiers

iosroid 2019. 12. 31. 17:54

코틀린의 Visibility Modifier 를 살펴보자.

원문 https://kotlinlang.org/docs/reference/visibility-modifiers.html 을 보며 정리.

 

class, object, interface, constructor, function, property 와 그들의 setter 들은 visibility modifier 를 가질 수 있다.

visibility modifier : private, protected, internal, public

기본은 public 이다.

Packages

function, property 와 class, object 와 interface 는 package 내에서 최상위에서 바로 선언할 수 있다.

// file name: example.kt
package foo

fun baz() { /*...*/ }
class Bar { /*...*/ }

이렇게 패키지 내의 최상위에서 선언된 것들의 visibility 관련 속성은 아래와 같다.

public 은 다른 설정이 없다면 기본 값이다. 모든 곳에서 접근이 가능하다.

private 은 선언한 파일 내에서만 접근이 가능하다.

internal 은 같은 모듈 안 어디에서나 접근이 가능하다.

protected 은 최상위 선언(top-level declaration)이 불가능 하다.

다른 패키지로부터 최상위 선언들을 사용하려면 import 를 해야한다.

// file name: example.kt
package foo

private fun foo() { ... } // visible inside example.kt

public var bar: Int = 5 // property is visible everywhere
    private set         // setter is visible only in example.kt

internal val baz = 6    // visible inside the same module

Classes and Interfaces

클래스 멤버의 visibility 속성은 아래와 같다.

private 는 클래스 내에 있는 멤버들 사이에서만 접근이 가능하다.

protectedprivate 과 같고 subclass 에서 접근이 가능하다.

internal 은 모듈내에서 클래스의 정의를 볼 수 있는 모든 클라이언트들은 internal 멤버들을 볼 수 있다.

public 은 클래스의 정의를 볼 수 있는 모든 클라이언트들은 public 멤버들을 볼 수 있다.

중첩된 클래스의 경우 외부 클래스는 내부 클래스의 private 멤버를 볼 수 없다.

protected 멤버를 override 할 때 visibility 변경을 선언해주지 않으면 그대로 유지한다.

open class Outer {
    private val a = 1
    protected open val b = 2
    internal val c = 3
    val d = 4  // public by default

    protected class Nested {
        public val e: Int = 5
    }
}

class Subclass : Outer() {
    // a is not visible
    // b, c and d are visible
    // Nested and e are visible

    override val b = 5   // 'b' is protected
}

class Unrelated(o: Outer) {
    // o.a, o.b are not visible
    // o.c and o.d are visible (same module)
    // Outer.Nested is not visible, and Nested::e is not visible either 
}

Constructors

클래스의 primary constructor 의 visibility 를 설정하려면 아래의 문법대로 constructor 와 함께 쓴다.

class C private constructor(a: Int) { ... }

모든 생성자는 public 이 기본이다.

Local declarations

지역 변수, 함수와 클래스는 visibility modifier 를 가질 수 없다.

 

Comments