Modifier
1 Access Modifier
- 코틀린에는
public
,private
,protected
,internal
4가지의 접근 지시자가 있습니다. - 코틀린의 기본 가시성은
public
입니다. - 자바의 기본 가시성인
package-private
는 코틀린에 존재하지 않습니다. - 코틀린은 패키지를 네임스페이스를 관리하기 위한 용도로만 사용합니다.
package-private
의 대안으로 코틀린에서는internal
이라는 새로운 접근 지시자를 도입했습니다.internal
은 모듈 내부에서만 볼 수 있음을 나타냅니다.- 여기서 모듈이란 한 번에 한꺼번에 컴파일 되는 코틀린 파일을 의미합니다.
- IntelliJ, 이클립스, 메이븐, gradle 등의 프로젝트가 모듈이 될 수 있습니다.
internal
키워드의 주요 목적은 모듈 외부에 노출하지 않고 모듈 내부에서만 사용할 수 있는 클래스나 함수를 정의하는 것입니다.- 이를 통해 모듈 외부로부터의 불필요한 접근을 방지하여 캡슐화와 코드의 안정성을 향상시킬 수 있습니다.
- 예를 들어, 어떤 라이브러리를 개발하는 경우에
internal
클래스나 함수는 라이브러리 사용자가 볼 필요가 없는 내부 구현 세부사항을 숨기는 데 유용합니다. - 이렇게 함으로써 라이브러리의 API를 더 깔끔하게 유지할 수 있습니다.
- 예를 들어, 어떤 라이브러리를 개발하는 경우에
1.1 public
public
은 어디서나 접근 가능한 가장 개방적인 접근 지시자입니다.- 클래스, 함수, 프로퍼티 등 모든 요소에 적용할 수 있습니다.
- 코틀린에서는 접근 지시자를 명시하지 않으면 기본적으로
public
으로 간주됩니다. - 예를 들어,
public class MyClass
와class MyClass
는 동일한 의미입니다.
1.2 private
private
은 선언된 클래스 내부에서만 접근 가능한 가장 제한적인 접근 지시자입니다.- 클래스 외부에서는 접근할 수 없으며, 상속받은 클래스에서도 접근이 불가능합니다.
- 파일의 최상위 수준에서 선언된
private
요소는 해당 파일 내에서만 접근이 가능합니다.
예시
class MyClass {
private val secretValue = 42
fun accessSecret() {
println(secretValue) // 클래스 내부에서는 접근 가능
}
}
fun main() {
val instance = MyClass()
// println(instance.secretValue) // 컴파일 오류: private 접근 불가
}
1.3 protected
protected
는 선언된 클래스와 그 클래스를 상속받은 하위 클래스에서만 접근 가능합니다.- 자바와 달리, 코틀린에서
protected
멤버는 같은 패키지의 다른 클래스에서 접근할 수 없습니다. - 최상위 선언에 적용할 수 없습니다.
예시
open class Base {
protected val protectedValue = 10
}
class Derived : Base() {
fun accessProtected() {
println(protectedValue) // 상속받은 클래스에서 접근 가능
}
}
fun main() {
val base = Base()
// println(base.protectedValue) // 컴파일 오류: protected 접근 불가
}
1.4 internal
internal
은 같은 모듈 내에서만 접근 가능한 접근 지시자이다.- 모듈은 함께 컴파일되는 코틀린 파일의 집합을 의미한다.
- 이는 자바의
package-private
과 유사하지만, 패키지 단위가 아닌 모듈 단위로 접근을 제한한다
예시
// ModuleA.kt
internal class InternalClass {
fun doSomething() = println("InternalClass is doing something")
}
// 같은 모듈의 다른 파일
fun useInternalClass() {
val instance = InternalClass() // 같은 모듈이므로 접근 가능
instance.doSomething()
}
// 다른 모듈에서는 InternalClass에 접근할 수 없음