Skip to main content
Summary

문법을 프로그램으로 연결하기

지금까지 변수, 함수, 클래스, 널 안전성, 컬렉션, 람다, 예외, 코루틴, 자바 상호 운용까지 코틀린의 주요 문법을 배웠습니다. 하지만 문법을 안다는 것과 프로그램을 만들 수 있다는 것은 다릅니다. 문법은 직접 만들고, 실패하고, 고쳐 보는 과정을 거칠 때 실력이 됩니다.

이번 장에서는 콘솔 기반 할 일 관리 프로그램을 만듭니다. 기능은 단순합니다.

  • 할 일을 추가한다.

  • 할 일 목록을 조회한다.

  • 할 일을 완료 처리한다.

  • 할 일을 삭제한다.

  • 잘못된 입력에는 안내 메시지를 보여 준다.

작은 프로그램이지만 여기에 지금까지 배운 핵심이 거의 모두 들어갑니다. data class로 데이터를 표현하고, sealed interface로 명령을 모델링하며, 컬렉션으로 목록을 관리하고, 테스트로 핵심 로직을 검증합니다. 마지막에는 테스트가 있는 상태에서 리팩터링을 진행합니다.

테스트와 리팩터링으로 완성하는 실전 프로젝트AI 생성 이미지

Kotlin/JVM Gradle 프로젝트 만들기

IntelliJ IDEA에서 새 프로젝트를 만듭니다. New Project → Kotlin → Gradle → Kotlin DSL을 선택하고 JDK를 지정합니다. JetBrains의 Kotlin TDD 안내도 IntelliJ IDEA에서 Gradle 기반 Kotlin 프로젝트를 만들고, 테스트 패키지와 테스트 클래스를 생성한 뒤 실패하는 테스트부터 작성하는 흐름을 권장합니다.1

프로젝트 구조는 다음처럼 잡습니다.

src
 ├─ main
 │   └─ kotlin
 │       └─ todo
 │           └─ Main.kt
 └─ test
     └─ kotlin
         └─ todo
             └─ TodoServiceTest.kt

build.gradle.kts는 최소한 다음 내용을 포함하면 됩니다. Kotlin 버전은 프로젝트 생성 시점의 최신 안정 버전을 사용해도 됩니다.

plugins {
    kotlin("jvm") version "2.3.21"
    application
}

repositories {
    mavenCentral()
}

kotlin {
    jvmToolchain(17)
}

application {
    mainClass.set("todo.MainKt")
}

dependencies {
    testImplementation(kotlin("test"))
}

tasks.test {
    useJUnitPlatform()
}

Kotlin/JVM 테스트 프로젝트에서는 Kotlin JVM 플러그인, JVM toolchain, kotlin("test"), JUnit Platform 설정을 함께 사용해 테스트를 실행할 수 있습니다.2

명령줄에서는 다음 명령을 반복해서 사용합니다.

./gradlew run
./gradlew test
./gradlew build

run은 프로그램 실행, test는 테스트 실행, build는 컴파일과 테스트를 포함한 전체 확인입니다. 코드를 조금 고칠 때마다 이 세 명령 중 하나를 실행하는 습관을 들이면 좋습니다.

요구사항을 역할로 나누기

처음부터 모든 코드를 main 함수에 넣으면 금방 복잡해집니다. 입력을 읽고, 문자열을 해석하고, 할 일 목록을 바꾸고, 결과를 출력하는 일이 한곳에 섞이기 때문입니다.

그래서 역할을 나눕니다.

  • Todo: 할 일 한 건을 표현한다.

  • Command: 사용자가 입력한 명령을 표현한다.

  • CommandParser: 문자열 입력을 Command로 바꾼다.

  • TodoService: 할 일 추가, 조회, 완료, 삭제를 처리한다.

  • TodoController: 명령을 받아 서비스에 전달하고 실행 결과를 만든다.

  • main: 콘솔 입출력만 담당한다.

이렇게 나누면 콘솔 없이도 핵심 로직을 테스트할 수 있습니다. 좋은 구조의 첫 번째 기준은 "테스트하기 쉬운가?"입니다.

도메인 모델 만들기

먼저 할 일 데이터를 표현합니다.

package todo

data class Todo(
    val id: Int,
    val title: String,
    val done: Boolean = false
) {
    fun complete(): Todo = copy(done = true)
}

Todo는 data class입니다. 값 비교, 출력, 복사에 필요한 기본 함수를 코틀린이 만들어 줍니다. 완료 상태를 바꿀 때는 기존 객체를 직접 수정하지 않고 copy()로 새 객체를 만듭니다.

사용자 명령은 제한된 종류 중 하나입니다. 이럴 때 문자열 상수보다 sealed interface가 안전합니다.

package todo

sealed interface Command {
    data class Add(val title: String) : Command
    data class Complete(val id: Int) : Command
    data class Delete(val id: Int) : Command
    data object ListAll : Command
    data object Help : Command
    data object Quit : Command
    data class Unknown(val reason: String) : Command
}

Command를 이렇게 만들면 when에서 모든 명령을 빠짐없이 처리하기 쉽습니다. 문자열 `

책 목록

처음 배우는 코틀린: 문법에서 실전 프로젝트까지

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기