패키지 구조

지금까지 우리는 하나의 파일 안에서 모든 코드를 작성했습니다. 하지만 실제 프로그램은 수십, 수백 개의 파일로 이루어져 있습니다. 코틀린에서는 이 파일들을 **패키지(Package)**로 정리합니다.

코틀린의 패키지 시스템은 자바와 거의 같지만, 훨씬 더 유연합니다.


패키지란?

패키지는 관련된 코드 파일들을 폴더로 묶어 정리하는 방법입니다.

코틀린 파일의 맨 윗줄에 이 파일이 어느 패키지에 속하는지 선언합니다:

package com.myapp

fun main() {
    println("Hello!")
}

package com.myapp은 “이 파일은 com/myapp 폴더에 있습니다”라고 코틀린에게 알려주는 것입니다.


다른 패키지의 코드 사용하기

다른 패키지에 있는 함수나 클래스를 사용하려면 import를 사용합니다:

package com.myapp

import com.myapp.utils.formatName

fun main() {
    println(formatName("kotlin"))
}

import는 “이 코드를 가져다 쓰겠습니다”라는 뜻입니다.

IntelliJ에서는 다른 패키지의 코드를 사용하면 자동으로 import를 추가해주니, 걱정하지 않아도 됩니다!


나만의 패키지 만들기

my_project/
├── src/
│   └── main/
│       └── kotlin/
│           └── com/
│               └── myapp/
│                   ├── Main.kt           ← 시작점
│                   ├── calculator/
│                   │   └── Calculator.kt ← calculator 패키지
│                   └── greeting/
│                       └── Hello.kt      ← greeting 패키지

calculator/Calculator.kt:

package com.myapp.calculator

fun add(a: Int, b: Int): Int {
    return a + b
}

fun subtract(a: Int, b: Int): Int {
    return a - b
}

Main.kt에서 사용하기:

package com.myapp

import com.myapp.calculator.add

fun main() {
    val result = add(3, 5)
    println(result) // 8
}

코틀린의 유연한 점

코틀린은 자바와 달리, 한 파일에 여러 함수와 클래스를 자유롭게 넣을 수 있습니다.

// Utils.kt

package com.myapp.utils

fun formatName(name: String): String {
    return name.uppercase()
}

fun isValidEmail(email: String): Boolean {
    return email.contains("@")
}

data class User(val name: String, val email: String)

자바에서는 파일 이름과 클래스 이름이 반드시 같아야 하지만, 코틀린은 그런 제약이 없습니다.


코틀린의 표준 패키지

코틀린은 자주 쓰는 기능들을 기본으로 제공합니다:

패키지설명
kotlin기본 중의 기본 (Int, String, println 등) - import 불필요
kotlin.collections리스트, 맵 등 자료구조 - import 불필요
kotlin.io입출력 관련 기능
kotlin.math수학 관련 기능

println()을 import 없이 바로 쓸 수 있었던 이유가 바로 이것입니다! kotlin 패키지에 포함된 함수라서 자동으로 사용할 수 있었던 것이죠.


실제 프로젝트는 이렇게 생겼습니다

my_app/
├── build.gradle.kts              ← 빌드 설정 파일
└── src/
    └── main/
        └── kotlin/
            └── com/
                └── myapp/
                    ├── Main.kt                ← 프로그램 시작점
                    ├── model/                 ← 데이터 구조
                    │   ├── User.kt
                    │   └── Product.kt
                    ├── service/               ← 비즈니스 로직
                    │   ├── UserService.kt
                    │   └── ProductService.kt
                    └── util/                  ← 도구 모음
                        └── StringHelper.kt

이렇게 역할별로 패키지를 나누면, “유저 관련 로직은 service 패키지에, 데이터 구조는 model 패키지에 있겠구나!” 하고 바로 찾을 수 있습니다.


외부 라이브러리 사용하기

다른 개발자가 만든 라이브러리도 가져다 쓸 수 있습니다. build.gradle.kts 파일에 추가하면 됩니다:

dependencies {
    implementation("com.google.code.gson:gson:2.10.1")
}

추가한 후에는 import해서 바로 사용할 수 있습니다:

import com.google.gson.Gson

fun main() {
    val gson = Gson()
    // JSON 데이터 처리...
}

정리하자면:

  • 패키지 = 관련된 코틀린 파일들을 정리하는 폴더
  • package 선언 = 이 파일이 어디에 속하는지 알려주기
  • import = 다른 패키지의 코드를 가져다 쓰기
  • kotlin 기본 패키지 = import 없이 바로 쓸 수 있는 기능들 (println 등)

코틀린의 패키지 시스템을 이해하면, 체계적이고 깔끔한 프로젝트를 만들 수 있습니다!