본문으로 바로가기
// file name: example.kt
package foo

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

코틀린에서의 접근 제한자(Visibility Modifiers)는 private, protected, internal, public 을 제공한다.

위 코드와 같은 함수나 클래스 앞에 아무것도 붙이지 않으면 자바에서는 default로 지정되지만 기본 public으로 지정된다.

// file name: example.kt
package foo

private fun foo() { ... } // example.kt 에서만 접근가능

public var bar: Int = 5 // 어디에서나 접근가능한 프로퍼티
    private set         // example.kt 에서만 쓰기(set) 가능
    
internal val baz = 6    // 같은 모듈안에서만 접근가능

자바에서 사용되는 private, protected, public 과 코틀린에서 같은 의미로 사용된다. 

 

하지만 internal은 자바에서 default(같은 패키지내에서만 접근가능)과 다르게

새로운 internal은 같은 모듈안에서만 사용 가능하다.

 

모듈은 아래와 같이 정의하고 있다.

  • an IntelliJ IDEA module;
  • a Maven project;
  • a Gradle source set (with the exception that the test source set can access the internal declarations of main);
  • a set of files compiled with one invocation of the <kotlinc> Ant task.

a Gradle source set 이라고 되어 있어서 다른 source set에서는 internal로 선언된 것들을 접근 못하는 줄 알았지만 접근이 가능하였다.

안드로이드에서는 멀티 모듈을 사용할 때 서로 다른 모듈에서 internal로 선언된 것들을 접근하지 못하는 것 같다.

멀티 모듈 프로젝트가 아니면 안드로이드의 app폴더 안에서는 internal로 접근이 가능하다.

 

실제로 코틀린으로 internal이나 public으로 작성한 class들은 자바로 변환된 바이트코드를 보면

똑같이 public 접근제어자를 가지는 것을 볼 수 있었다.

 

참고: https://kotlinlang.org/docs/reference/visibility-modifiers.html#modules