KOTLIN · 심층 가이드
Kotlin Hello World 완전 정리
Kotlin 첫 실행부터 Gradle Kotlin DSL 빌드 스크립트와 멀티모듈 구성, IntelliJ 설정까지 개발 환경 전체를 5편으로 갖춥니다.
Kotlin의 첫 코드는 클래스가 없습니다. JVM 위에서 도는 언어인데도 fun main() 하나만 파일에 적으면 실행됩니다. 컴파일러가 뒤에서 파일 이름을 딴 클래스를 만들어 그 안에 정적 메서드로 넣어 주기 때문입니다. Java의 public static void main 의식을 기억하는 분이라면 이 축약이 Kotlin이 취한 태도를 압축해서 보여 준다고 느끼실 겁니다. 필요한 것만 적고 나머지는 컴파일러에 맡깁니다.
Hello World 출력과 여러 줄 문자열 (Triple Quote)은 몇 분이면 지나가고, 실제 시간이 드는 곳은 뒤쪽 세 편입니다. 프로젝트 설정 (Gradle Kotlin DSL)에서 build.gradle.kts의 뼈대를 익힌 뒤 빌드 시스템 이해 (멀티모듈)로 넘어가면 settings.gradle.kts가 왜 모듈 목록의 유일한 출처인지 이해하게 됩니다.
삼중 따옴표 문자열은 들여쓰기를 그대로 보존합니다. 함수 안에 들여 쓴 채로 적으면 앞의 공백까지 문자열에 들어가므로, 각 줄 앞에 |를 붙이고 trimIndent()나 trimMargin()을 호출해야 의도한 모양이 나옵니다. Gradle 쪽에서는 Kotlin 플러그인 버전과 JVM 타깃을 맞추지 않아 생기는 오류가 첫 관문입니다. 모듈마다 다른 JVM 타깃을 쓰면 링크 단계에서 어긋나므로, 루트에서 한 번에 지정하는 편이 안전합니다.
01Hello World 출력
Kotlin에서 가장 첫 번째로 배우는 Hello World. JVM 언어이지만 class 없이 top-level 함수로 바로 실행됩니다.
Kotlin code
fun main() {
println("Hello, World!")
// print()는 줄바꿈 없이 출력
print("Hello ")
print("Kotlin!")
println() // 빈 줄 출력
}println()은 줄바꿈 포함, print()는 줄바꿈 없이 출력합니다.
Java처럼 class Main { companion object { @JvmStatic fun main... }} 형태로 작성할 필요 없습니다. Kotlin 1.3+부터 top-level fun main()이 표준입니다.
02여러 줄 문자열 (Triple Quote)
삼중 따옴표 """로 여러 줄 문자열을 들여쓰기 그대로 작성합니다.
Kotlin code
fun main() {
// trimIndent(): 공통 들여쓰기 자동 제거
val poem = """
Kotlin은 간결하고
안전하며
표현력이 풍부합니다.
""".trimIndent()
println(poem)
// trimMargin(): | 기준으로 좌측 제거
val sql = """
|SELECT *
|FROM users
|WHERE active = true
""".trimMargin()
println(sql)
}trimIndent()는 공통 들여쓰기를 자동 감지해 제거합니다. trimMargin()은 | 파이프를 기준으로 정렬합니다.
trimMargin()을 쓸 때 각 줄 앞에 |를 붙이지 않으면 공백이 그대로 남습니다.
03프로젝트 설정 (Gradle Kotlin DSL)
Kotlin 프로젝트의 기본 build.gradle.kts 설정입니다. Gradle Kotlin DSL을 사용하면 빌드 스크립트도 Kotlin으로 작성하여 타입 안전성과 IDE 자동완성을 얻습니다.
Kotlin code
// build.gradle.kts
plugins {
kotlin("jvm") version "1.9.22"
application
}
repositories {
mavenCentral()
}
dependencies {
testImplementation(kotlin("test"))
}
application {
mainClass.set("MainKt")
}kotlin("jvm")은 org.jetbrains.kotlin.jvm 플러그인의 축약형입니다. application 플러그인을 추가하면 ./gradlew run으로 바로 실행할 수 있습니다.
mainClass에 파일명이 아닌 클래스명을 지정해야 합니다. Main.kt 파일의 top-level fun main()은 MainKt로 컴파일됩니다.
04빌드 시스템 이해 (멀티모듈)
Gradle 멀티모듈 프로젝트 구성입니다. settings.gradle.kts에서 서브프로젝트를 선언하고, 공통 설정을 루트에서 관리합니다.
Kotlin code
// settings.gradle.kts
rootProject.name = "my-kotlin-app"
include("app", "core", "data")
// build.gradle.kts (루트)
subprojects {
apply(plugin = "org.jetbrains.kotlin.jvm")
repositories { mavenCentral() }
dependencies {
"testImplementation"(kotlin("test"))
}
}루트 build.gradle.kts의 subprojects 블록으로 공통 의존성을 한 곳에서 관리하면 버전 충돌을 방지할 수 있습니다.
include에 지정한 이름과 실제 디렉토리명이 일치해야 합니다. 불일치하면 Gradle이 프로젝트를 찾지 못해 빌드에 실패합니다.
05IDE 설정 (IntelliJ IDEA)
IntelliJ IDEA에서 Kotlin 프로젝트를 효율적으로 설정하는 핵심 구성입니다. .editorconfig를 활용하면 팀 전체의 코드 스타일을 통일할 수 있습니다.
Kotlin code
// .editorconfig
// [*.{kt,kts}]
// indent_size = 4
// max_line_length = 120
// insert_final_newline = true
// 코드에서 컴파일러 옵션 확인
fun main() {
// -Xjsr305=strict: null 안전성 강화
// -opt-in=kotlin.RequiresOptIn
println("Kotlin version: ${KotlinVersion.CURRENT}")
println("JVM target: ${System.getProperty("java.version")}")
}IntelliJ에서 File → Settings → Editor → Code Style → Kotlin에서 Set from... → Kotlin style guide를 선택하면 공식 코딩 컨벤션이 자동 적용됩니다.
JVM target 버전을 Gradle과 IDE 양쪽에서 일치시켜야 합니다. 불일치하면 Cannot inline bytecode 오류가 발생할 수 있습니다.
정리하며
- top-level fun main만으로 실행되며 클래스 선언은 필요 없습니다
- 삼중 따옴표 문자열은 trimIndent나 trimMargin으로 들여쓰기를 정리합니다
- 멀티모듈은 settings.gradle.kts의 include 선언이 유일한 기준입니다
- JVM 타깃과 Kotlin 플러그인 버전은 루트에서 한 번에 통일합니다
더 깊이 들어가고 싶다면 Kotlin 학습 라이브러리에서 다른 주제 가이드를 이어서 보거나, 언어 비교에서 같은 개념이 다른 언어에서 어떻게 표현되는지 확인해 보세요.