[Kotlin] 3-4. 가시성 수식어

가시성 수식어

클래스, 오브젝트, 인터페이스, 생성자, 프로퍼티 및 프로퍼티의 setter는 가시성 수식어를 가질 수 있다
(getter는 항상 프로퍼티와 동일한 가시성을 갖는다)
코틀린에는 private, protected, internal, public의 가시성 수식어 존재 / 기본은 public

패키지

함수, 프로퍼티와 클래스, 오브젝트와 인터페이스는 “최상위”에 선언할 수 있다
예를 들어 패키지에 직접 선언 가능

package foo

fun baz() {}
Class Bar {}
// 파일 이름 : example.kt
package foo

private foo() {}  // example.kt 안에서 접근 가능
public var bar: Int = 5  // 모든 곳에서 접근 가능
  private set  // setter는 example.kt에서만 접근 가능
internal val baz = 6  // 같은 모듈에서 접근 가능

클래스와 인터페이스

클래스에 선언한 멤버에 대해서는 다음과 같다

open class Outer {
  private val a = 1
  protected open val b = 2
  internal avl c = 3
  val d = r  // 기본으로 public
  
  protected class Nested {
    public val e: Int = 5
    }
  }
}

class Subclass : Outer() {
  // a는 접근 불가
  // b, c, d는 접근 가능
  // Nested와 e는 접근 가능
  
  override val b = 5
}

class Unrelated(o: Outer) {
  // o.a, o.b는 접근 불가
  // o.c와 o.d는 접근 가능(같은 모듈)
  // Outer.Nested는 접근 불가며, Nested::e 역시 접근 불가
}

생성자

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

위 코드의 생성자는 private이다 / 기본적으로 모든 생성자는 public이며 실질적으로
클래스를 접근할 수 있는 모든 곳에서 생성자에 접근할 수 있다

로컬 선언

로컬 변수, 로컬 함수, 로컬 클래스에는 가시성 수식어를 지정할 수 없다

모듈

internal 가시성 수식어는 같은 모듈에서 멤버에 접근할 수 있음을 의미
더 구체적으로 모듈은 함께 컴파일되는 코틀린 파일 집합