패키지와 임포트

패키지와 임포트

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은 추가 패키지도 임포트해요.

가시성과 임포트

엔티티를 임포트할 수 있는지는 그 엔티티의 가시성 수정자(visibility modifier)에 따라 달라져요.

  • public 엔티티는 어디서든 임포트할 수 있어요.
  • internal 엔티티는 같은 모듈 안에서만 임포트할 수 있어요.
  • protected 엔티티는 임포트할 수 없어요.
  • 최상위 private 엔티티는 선언된 파일 안에서만 접근할 수 있어요.
  • 그 외 private 엔티티는 임포트할 수 없어요.

더 알아보기 (Learn more)

패키지와 임포트는 코드를 조직화하는 기본이에요. 가시성 수정자와 더 자세한 규칙은 공식 문서의 관련 장을 이어서 보면 좋아요. 객체 선언이나 동반 객체, enum처럼 이 페이지에서 언급된 엔티티들의 임포트 규칙도 각각의 문서에서 더 자세히 다뤄져요.