패키지 구조
지금까지 우리는 하나의 파일 안에서 모든 코드를 작성했습니다. 하지만 실제 프로그램은 수십, 수백 개의 파일로 이루어져 있습니다. 코틀린에서는 이 파일들을 **패키지(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 등)
코틀린의 패키지 시스템을 이해하면, 체계적이고 깔끔한 프로젝트를 만들 수 있습니다!