Kotlin에서 가시성 수정자는 클래스, 속성, 함수 및 최상위(파일 수준) 선언에 대한 접근을 제어하는 데 사용됩니다. Java와 달리 수정자가 클래스 수준에서만 작동하는 대신, Kotlin에서는 최상위 선언에도 적용되어 대규모 프로젝트와 라이브러리 API를 구조화하는 데 중요합니다.
Java에는 클래스 외부의 함수나 속성에 대한 가시성 수정자가 없습니다 — 모든 것이 public(또는 package-private) 클래스 내부에 있습니다. Kotlin에서는 프로젝트를 구조화하는 방식이 달라지며, 종종 함수나 속성이 클래스 안이 아닌 파일 자체에 존재합니다.
Java 개발자는 종종 기본적으로 public이 Java와 같은 방식으로 작동할 것이라고 예상하지만, Kotlin의 경우 최상위 함수(또는 속성)는 다르게 표시되지 않는 한 모든 모듈에서 볼 수 있습니다. 잘못된 가시성 정의는 공개 API의 어휘적 오염을 초래하거나, 내부 유틸리티의 예기치 않은 가시성을 제공하거나, 필요한 공개 함수가 사용 불가능해질 수 있습니다.
Kotlin에서는 다음과 같은 수정자를 사용할 수 있습니다:
예:
// file: Foo.kt private fun utilityFun() {} internal val bar: Int = 10 public val baz: Int = 20 // public은 선택적 fun printValue() { println(bar) }
최상위 함수에 protected를 사용할 수 있습니까?
아니요, protected는 클래스/인터페이스의 멤버에게만 해당되며, 최상위 요소는 지원하지 않습니다.
최상위 함수를 internal로 선언하면 다른 모듈 내에서 보일까요?
아니요. 해당 함수는 현재 jar/Gradle 모듈 내에서만 보입니다.
private class와 private top-level function의 차이는 무엇입니까?
예:
// file: Utils.kt private fun helper() { /* ... */ } // 이 파일 내에서만 보임 internal fun useful() { /* ... */ } // 모듈 내에서 보임
테스트 유틸리티가 public으로 선언되어 artefact에 포함되어 라이브러리 클라이언트에 방해가 됩니다 — public API와 관련 없는 모든 것이 보이게 됩니다.
장점:
단점:
내부 함수는 private로 선언되고, 공용 사용을 위해 internal 가시성의 유틸리티만 있으며, 신중하게 설계된 인터페이스만이 public 접근을 가집니다.
장점:
단점: