본문으로 건너뛰기
AIDevOps
  • Learn
  • Learning Paths
  • Practice
  • Open Source
  • Books
  • Engineering

    AI DevOpsAI 서비스 개발·운영 전체 지도LLMOpsLLM 배포·평가·관측실전 프로젝트AI Agent 프로젝트 실습

    Knowledge

    Docs기술 문서 모음Blog엔지니어링 아티클Plogger개발 기록 피드

    Validate

    Certification3단계 역량 인증 · 준비 중
AI Models
LlamaMistralGemmaDeepSeekQwen
📱 Mobile
Mobile 입문 & 로드맵KotlinAndroidFlutter
🤖 AI 실전 개발
AI 실전 입문 & 로드맵Hugging FaceLangChainLlamaIndexLLMOps|LangGraphMCPMulti-AgentAgent Evaluation
🧠 AI Core
AI 입문 & 로드맵ML FundamentalsLLM Fundamentals|Python AIC++|PyTorchTensorFlowJAX
🧠 AI Agent 개발
금융 AI AgentLLM API 서버주식 투자 AgentAIOps AI Agent교육 AI Agent코딩 AI Agent
🌱 Spring Cloud
Spring 입문 & 로드맵Spring Cloud GatewaySpring BootJava|Spring AISpring SecuritySpring BatchSpring JPA
🐳 DevOps
DevOps 입문 & 로드맵LinuxDockerCI/CD|Kubernetes 기본K8s 심화/실무PrometheusGrafana
🧱 인프라
인프라 입문 & 로드맵NginxRedis
☁️ 클라우드
클라우드 입문 & 로드맵AWSGCPAzureNCPCloudflare
🎨 Frontend
Frontend 입문 & 로드맵JavaScriptTypeScript|ReactNext.js|VueNuxt
⚙️ Backend
Backend 입문 & 로드맵Python 기본FastAPIDjangoFlask|CGoGinNode.js
💾 Database
DB 입문 & 로드맵공통 SQLOracleMySQLPostgreSQL|MongoDB벡터 DB
🧪 검증
k6JMeternGrinder
AIDevOps

Engineering AI. From Code to Production.
AI와 AI Agent를 개발하고 운영하기 위한 엔지니어링 학습 플랫폼

Learn

  • 전체 가이드
  • Learning Paths
  • Practice
  • Books

Resources

  • AI DevOps
  • LLMOps
  • 실전 프로젝트
  • Docs
  • Blog
  • Plogger
  • Open Source
  • Certification (준비 중)

Start Here

  • AI Core 로드맵
  • AI 실전 개발 로드맵
  • Spring Cloud 로드맵
  • DevOps 로드맵
  • 인프라 로드맵

 

  • 클라우드 로드맵
  • Frontend 로드맵
  • Mobile 로드맵
  • Backend 로드맵
  • Database 로드맵
© 2026 AI DevOps Korea. All rights reserved.
이용약관개인정보처리방침Sitemaptestforge.kr
  1. Home
  2. Learn
  3. Mobile
  4. Kotlin
모던 JVM 언어 가이드

🅺 Kotlin 완전 가이드

Visitors

JetBrains가 만들고 Android 공식 언어로 채택된 Kotlin을 학습합니다. Null 안전성, 간결한 문법, 코루틴 기반 동시성까지 실무 수준으로 다룹니다.

  • Beginner · 입문
  • 업데이트 2026.09.19
  • 약 6분 읽기
  • 9개 섹션
  • 예제 코드 6개
🅺
Android 앱 개발Spring Boot 백엔드멀티플랫폼 (KMP)코루틴 기반 비동기 처리

관련 프레임워크 & 개발환경

🤖Android→🦋Flutter→☕Java→

목차

0 / 11
  1. 가이드 사용법
  2. 구조 다이어그램
  3. 환경 설정
  4. 기본 문법 & Null 안전성
  5. 클래스 & data class
  6. 확장 함수 & Scope Function
  7. 코루틴
  8. 구조화된 동시성
  9. Kotlin 설계
  10. 운영 기준
  11. 검증 전략
목차 11개 섹션
  1. 가이드 사용법
  2. 구조 다이어그램
  3. 환경 설정
  4. 기본 문법 & Null 안전성
  5. 클래스 & data class
  6. 확장 함수 & Scope Function
  7. 코루틴
  8. 구조화된 동시성
  9. Kotlin 설계
  10. 운영 기준
  11. 검증 전략

가이드 사용법

읽는 방향

Kotlin를 실무 흐름으로 이해하기

JetBrains가 만들고 Android 공식 언어로 채택된 Kotlin을 학습합니다. Null 안전성, 간결한 문법, 코루틴 기반 동시성까지 실무 수준으로 다룹니다. 이 가이드는 개념을 나열하기보다, 실제 프로젝트에서 판단해야 하는 순서대로 내용을 따라갈 수 있게 구성했습니다.

핵심 관점

프론트엔드 / 앱 개발

화면을 그리는 법에서 멈추지 않고, 상태, 데이터 요청, 라우팅, 접근성, 배포 단위까지 함께 봅니다.

Android 앱 개발Spring Boot 백엔드멀티플랫폼 (KMP)코루틴 기반 비동기 처리

구조 다이어그램

글로 읽은 내용을 머릿속에 오래 남기려면 먼저 흐름을 그림으로 잡는 편이 좋습니다. 아래 두 그림은 Kotlin를 학습할 때 계속 되돌아볼 수 있는 기준 지도입니다.

학습 흐름

다이어그램 렌더링 중…

아키텍처 관점

다이어그램 렌더링 중…

환경 설정

Kotlin를 처음 펼칠 때는 세부 명령보다 큰 그림이 먼저입니다. 이 섹션에서는 앞으로 배울 개념들이 어떤 문제를 풀기 위해 등장했는지부터 잡아봅니다.

Kotlin은 JVM 위에서 동작하므로 JDK가 먼저 필요합니다. SDKMAN 하나로 JDK와 Kotlin 컴파일러를 함께 설치·버전 관리할 수 있어, 프로젝트마다 다른 JDK/Kotlin 조합을 요구할 때 특히 편리합니다.
BASH
# SDKMAN으로 JDK + Kotlin 설치 (macOS/Linux)
curl -s "https://get.sdkman.io" | bash
source "$HOME/.sdkman/bin/sdkman-init.sh"
sdk install java 17.0.9-tem
sdk install kotlin

# 설치 확인
kotlin -version

# 컴파일 & 실행
kotlinc main.kt -include-runtime -d main.jar
java -jar main.jar

Tip

-include-runtime 옵션은 Kotlin 표준 라이브러리를 jar에 함께 묶어, java -jar만으로 별도 클래스패스 설정 없이 바로 실행할 수 있게 해줍니다.

기본 문법 & Null 안전성

여기서는 기본 문법 & Null 안전성을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

Kotlin은 val(불변)/var(가변)로 변수를 선언하며, 타입 시스템 자체에서 null 가능 여부를 구분해 NullPointerException을 컴파일 타임에 방지합니다.
main.ktKOTLIN
fun main() {
    val name: String = "Kotlin"   // non-null: null 대입 시 컴파일 에러
    var nickname: String? = null // nullable: ?를 붙여야 null 허용

    // 안전 호출(?.) + 엘비스 연산자(?:)
    val len = nickname?.length ?: 0
    println("이름: $name, 닉네임 길이: $len")

    // let: null이 아닐 때만 블록 실행
    nickname?.let { println("닉네임: $it") }
}

클래스 & data class

여기서는 클래스 & data class을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

data class는 equals/hashCode/toString/copy를 자동 생성합니다. sealed class는 제한된 계층 구조를 만들어 when에서 모든 분기 처리를 컴파일 타임에 강제합니다.
KOTLIN
data class User(val id: Int, val name: String)

sealed class ApiResult
data class Success(val data: String) : ApiResult()
data class Failure(val error: String) : ApiResult()
object Loading : ApiResult()

fun handle(result: ApiResult) = when (result) {
    is Success -> println("성공: ${result.data}")
    is Failure -> println("실패: ${result.error}")
    Loading    -> println("로딩 중...")
    // sealed class는 모든 하위 타입을 다루면 else 불필요
}

확장 함수 & Scope Function

여기서는 확장 함수 & Scope Function을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

확장 함수는 기존 클래스(내가 만들지 않은 클래스 포함)에 새 메서드를 추가한 것처럼 호출할 수 있게 해줍니다. let/run/with/apply/also 같은 Scope Function은 이름은 비슷해 보이지만 "수신 객체를 어떻게 참조하는지"와 "무엇을 반환하는지"가 각각 다릅니다.
extensions.ktKOTLIN
// 확장 함수 — String 클래스를 건드리지 않고 새 메서드처럼 추가
fun String.isValidEmail(): Boolean =
    this.matches(Regex("^[\w.-]+@[\w.-]+\.\w+$"))

if ("user@example.com".isValidEmail()) {
    println("유효한 이메일")
}

// apply — 객체 자신(this)을 설정하고 그 객체를 반환 (초기화에 유용)
val user = User(id = 1, name = "").apply {
    // 여기선 this가 User이므로 프로퍼티에 직접 접근 (val이면 생성자에서만 가능하니 var 가정)
}

// let — 인자(it)로 받고 람다의 결과를 반환 (null 체크와 자주 결합)
val length = nickname?.let { it.length } ?: 0

// also — 인자(it)로 받고 원본 객체를 그대로 반환 (부수 효과, 로깅에 유용)
val list = mutableListOf(1, 2, 3).also { println("생성됨: $it") }
함수수신 객체 참조반환값주로 쓰는 곳
letit람다의 결과null이 아닐 때만 실행, 값 변환
runthis람다의 결과객체 설정 + 계산 결과가 모두 필요할 때
applythis객체 자신객체 초기화/설정 후 그대로 사용
alsoit객체 자신로깅 등 원본 흐름에 끼워 넣는 부수 효과

코루틴 (Coroutines)

여기서는 코루틴 (Coroutines)을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

코루틴은 스레드를 블로킹하지 않는 경량 비동기 처리 방식입니다. launch는 결과가 필요 없는 작업, async/await는 결과가 필요한 병렬 작업에 사용합니다.
KOTLIN
import kotlinx.coroutines.*

suspend fun fetchUser(id: Int): String {
    delay(100)
    return "User-$id"
}

fun main() = runBlocking {
    val d1 = async { fetchUser(1) }
    val d2 = async { fetchUser(2) }
    println("${d1.await()}, ${d2.await()}") // 병렬 실행
}

구조화된 동시성

여기서는 구조화된 동시성을 실제 코드와 함께 확인합니다. 예제를 그대로 따라 하기보다, 입력과 출력, 그리고 바뀌기 쉬운 부분이 어디인지 보면서 읽어보세요.

코루틴은 반드시 어떤 CoroutineScope 안에서 실행되며, 부모 스코프가 취소되면 그 안의 모든 자식 코루틴도 함께 취소됩니다. 이 "구조화된 동시성" 덕분에 작업을 따로따로 추적하지 않아도 한 번의 취소로 관련된 모든 비동기 작업을 정리할 수 있습니다.
다이어그램 렌더링 중…
structured_concurrency.ktKOTLIN
class UserViewModel : ViewModel() {
    fun loadUser(id: Int) {
        // viewModelScope 안에서 실행된 코루틴은 ViewModel이 정리될 때 자동 취소됨
        viewModelScope.launch {
            val user = fetchUser(id)       // 화면이 먼저 사라지면
            updateUi(user)                  // 이 줄은 실행되지 않음 (안전하게 취소됨)
        }
    }
}

Tip

GlobalScope.launch로 코루틴을 실행하면 이 구조화된 동시성 혜택을 받지 못합니다 — 화면이 사라져도 작업이 계속 살아남아 메모리 누수나 이미 사라진 화면 업데이트 시도로 이어질 수 있습니다. 항상 적절히 스코프가 지정된 CoroutineScope를 사용하세요.

Kotlin 실무 설계

Kotlin 실무 설계은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.

Kotlin은 확장 함수와 null 안전성을 남용하지 않고 도메인 경계를 명확히 잡는 것이 중요합니다. sealed class로 상태를 표현하고, data class는 불변으로 유지해야 합니다.
결정 지점확인 질문실무 기준
경계Kotlin 코드에서 바뀌기 쉬운 부분은 어디인가?입출력, 설정, 외부 연동, 핵심 규칙을 분리합니다.
상태상태가 어디서 생성되고 어디서 사라지는가?상태 소유자와 수명 주기를 코드로 드러냅니다.
장애실패했을 때 호출자는 무엇을 받는가?timeout, fallback, error contract를 먼저 정합니다.

Kotlin 운영 기준

이 섹션은 Kotlin 운영 기준을 실무 관점에서 정리합니다. 개념을 외우기보다, 어떤 상황에서 이 기준을 꺼내 쓸지에 초점을 맞춰보세요.

코루틴 기반 운영에서는 structured concurrency, Dispatcher 선택, 예외 전파(CoroutineExceptionHandler), 취소(cancellation) 처리를 명확히 해야 합니다.

Tip

  • structured concurrency
  • CoroutineExceptionHandler
  • sealed class 분기 커버리지
  • runTest 가상 시간

Kotlin 검증 전략

Kotlin 검증 전략은 선택지가 갈리는 지점입니다. 표를 기준으로 각 방법의 쓰임새와 운영상의 차이를 비교해두면 이후 판단이 훨씬 쉬워집니다.

코루틴 테스트는 runTest와 가상 시간(virtual time)을 사용하고, null 처리 경로와 sealed class의 모든 분기를 테스트로 커버해야 합니다.
품질 축검증 방법완료 기준
정확성정상/실패 케이스를 자동화합니다.핵심 시나리오가 재현 가능하게 통과합니다.
회귀 방지버그 수정 시 동일 케이스를 테스트로 남깁니다.같은 장애가 다시 배포되지 않습니다.
운영성로그, 메트릭, 알림을 확인합니다.문제가 생겼을 때 원인 추적 경로가 있습니다.
← 이전 가이드Mobile 입문 & 로드맵다음 가이드 →Android