패키지와 임포트
패키지와 임포트
Kotlin 프로젝트에서 코드는 패키지(package)와 임포트(import)로 정리돼요. 한 프로젝트의 파일이 많아지면 어디에 뭐가 있는지 가늠하기가 어려워지는데, 이 두 가지가 코드를 일정한 단위로 묶고 서로를 손쉽게 참조할 수 있게 해 줘요.
출처: Kotlin 공식 문서
본문
패키지는 하나 이상의 Kotlin 파일을 담는 컨테이너예요. 파일은 package 헤더로 특정 패키지에 연결되고요. 한편 임포트는 다른 패키지에 있는 엔티티를 현재 파일에서 쓸 수 있게 해 주는 지시문이에요.
패키지 헤더
소스 파일은 패키지 헤더로 시작할 수 있어요.
package org.example
fun printMessage() { /*...*/ }
class Message(val text: String) { /*...*/ }
소스 파일의 모든 내용(클래스, 함수)은 이 패키지에 속해요. 이들의 완전한 이름(fully qualified name)은 패키지 이름과 엔티티 이름을 합친 값이에요. 위 예시에서는 이렇게 돼요.
printMessage()의 완전한 이름은org.example.printMessage예요.Message의 완전한 이름은org.example.Message예요.
파일에 패키지 헤더가 없다면, 그 내용은 루트 패키지에 속해요.
임포트
다른 패키지에 있는 파일의 엔티티를 쓰려면 import 지시문을 사용해요. 기본 임포트에 더해, 각 파일은 자기만의 임포트를 추가로 선언할 수 있어요.
단일 엔티티 임포트
특정 엔티티를 임포트하면 한정자(qualification) 없이 그 이름을 쓸 수 있어요.
// Message를 한정자 없이 쓸 수 있어요
import org.example.Message
fun main() {
val message = Message("Hello")
println(message.text)
}
스코프의 내용 통째로 임포트
별표 *로 끝나는 스타 임포트(star import)는 해당 스코프 안에 있는 모든 이름 있는 엔티티를 가져와요.
// org.example 안의 모든 것이 접근 가능해요
import org.example.*
fun main() {
printMessage()
val message = Message("Hi")
}
어떤 엔티티를 스타 임포트와 명시적 임포트로 동시에 가져온다면, 오버로드 해석 때는 명시적 임포트가 우선해요.
별칭으로 이름 충돌 해결하기
임포트한 두 엔티티의 이름이 같다면, as 키워드로 그중 하나를 파일 안에서만 다른 이름으로 바꿔 쓸 수 있어요.
// Message는 org.example.Message를 가리켜요
import org.example.Message
// TestMessage는 org.test.Message를 가리켜요
import org.test.Message as TestMessage
fun main() {
val a = Message("from example")
val b = TestMessage("from test")
}
무엇을 임포트할 수 있을까
import 키워드는 클래스에만 국한되지 않아요. 패키지든 클래스든 객체든 enum이든 상관없이 아래 엔티티들은 모두 임포트할 수 있어요.
- 패키지 안에 직접 선언된 최상위 함수와 프로퍼티:
import org.example.printMessage // 최상위 함수
import org.example.VERSION // 최상위 프로퍼티
- 객체 선언(object declaration)의 함수와 프로퍼티:
import org.example.Config.DEFAULT_TIMEOUT // 객체의 프로퍼티
import org.example.Config.loadSettings // 객체의 함수
- 동반 객체(companion object)의 멤버. 바깥 클래스 이름을 통해 참조해요:
import org.example.MyClass.create // MyClass.Companion.create를 가리켜요
- enum 상수:
import org.example.Color.RED
import org.example.Color.GREEN
- 중첩 클래스:
import org.example.Outer.Nested
기본 임포트
Kotlin은 기본적으로 다음 임포트를 포함해요.
- kotlin.*
- kotlin.annotation.*
- kotlin.collections.*
- kotlin.comparisons.*
- kotlin.io.*
- kotlin.ranges.*
- kotlin.sequences.*
- kotlin.text.*
- kotlin.math.*
타깃 플랫폼에 따라 Kotlin은 추가 패키지도 임포트해요.
- JVM:
- JS:
가시성과 임포트
엔티티를 임포트할 수 있는지는 그 엔티티의 가시성 수정자(visibility modifier)에 따라 달라져요.
public엔티티는 어디서든 임포트할 수 있어요.internal엔티티는 같은 모듈 안에서만 임포트할 수 있어요.protected엔티티는 임포트할 수 없어요.- 최상위
private엔티티는 선언된 파일 안에서만 접근할 수 있어요. - 그 외
private엔티티는 임포트할 수 없어요.
더 알아보기 (Learn more)
패키지와 임포트는 코드를 조직화하는 기본이에요. 가시성 수정자와 더 자세한 규칙은 공식 문서의 관련 장을 이어서 보면 좋아요. 객체 선언이나 동반 객체, enum처럼 이 페이지에서 언급된 엔티티들의 임포트 규칙도 각각의 문서에서 더 자세히 다뤄져요.