Kotlin 치트시트 — 빠른 레퍼런스
Kotlin 2.0의 문법, null 안전성, 코루틴과 가장 자주 쓰이는 표준 라이브러리를 다루는 치트시트로, 일상적인 사용의 약 80%를 다룹니다.
Kotlin Kotlin 2.0
JVM (kotlinc) / Multiplatform · 객체 지향, 함수형, 멀티플랫폼 · 정적, 강한 타입, 타입 추론
추천 학습 경로
먼저 kotlinc 컴파일·실행과 fun main 배우기 → 변수, 타입, 제어 흐름 익히기 → null 안전성(null 허용 ?, 안전 호출 ?., 엘비스 ?:)과 data class 이해하기 → 람다, 확장 함수, 컬렉션의 함수형 작업 사용하기 → 클래스, 인터페이스, 제네릭 깊이 배우기 → try / runCatching으로 오류 처리 → 코루틴과 Flow로 동시성 작성 → 필요할 때 네트워크, 시간, 정규식, Gradle 빌드 학습. FAQ 섹션은 돌아와서 함정을 피하기에 좋습니다.
1.Hello World와 빌드 환경
Kotlin 프로그램 컴파일 및 실행: kotlinc 도구 체인, 스크립트, 패키지 구조, 명령줄 인자.
최소 프로그램
모든 Kotlin 프로그램은 최상위 fun main()을 진입점으로 하며, println은 표준 출력에 씁니다. Kotlin 2.0은 인자 없는 main을 지원합니다.
실행과 빌드
kotlinc는 소스를 JVM 바이트코드로 컴파일하고 java -jar로 실행합니다. Gradle은 Kotlin 프로젝트의 주류 빌드 도구입니다.
Kotlin 스크립트
.kts 파일은 바로 실행할 수 있어 작은 도구와 자동화에 적합합니다. 스크립트는 main 함수가 필요 없고 최상위 문장이 순서대로 실행됩니다.
패키지와 임포트
package는 파일이 속한 패키지를 선언하고, import는 다른 패키지의 타입을 가져옵니다. Java와 달리 사용하지 않는 import는 오류가 아닙니다.
명령줄 인자
main의 Array<String> 인자가 명령줄 인자를 받고, args[0]이 첫 번째 인자입니다. 인자는 항상 문자열이므로 직접 변환해야 합니다.
출력과 포맷
println은 출력 후 줄바꿈, print는 줄바꿈 없음. 문자열 템플릿 ${}은 표현식을 내장하며 가장 흔한 포맷 방식입니다.
종료 코드
exitProcess는 프로그램을 즉시 종료하고 종료 코드를 설정합니다. 0이 성공, 0이 아니면 실패입니다. 라이브러리 코드에서는 호출하지 마세요.
환경 설정
IntelliJ IDEA Community Edition은 Kotlin을 내장으로 지원하고 Android Studio도 마찬가지입니다. 명령줄에서는 kotlinc와 Gradle을 사용합니다.
2.변수와 상수
변수 선언, val/var, 상수, 타입 추론, 구조 분해, 스코프.
val과 var
val은 읽기 전용 참조, var은 가변 참조를 선언합니다. val을 우선 사용하며 컴파일러가 val로 바꿀 수 있는 var를 알려줍니다.
타입 추론
컴파일러가 초기화 표현식으로 변수 타입을 추론하므로 명시적 타입을 생략할 수 있습니다. 추론 결과는 명시적 선언과 동등합니다.
명시적 타입
명시적 타입은 가독성을 높이고 null 안전성과 제네릭에서 자주 필요합니다. 타입은 변수명 다음에 콜론으로 구분해 씁니다.
컴파일 타임 상수
const val은 컴파일 타임 상수를 선언합니다. 기본 타입과 String만 가능하며 최상위 또는 컴패니언 객체에서만 선언할 수 있습니다.
최상위 변수
파일 최상위에서 변수와 함수를 직접 선언할 수 있어 클래스로 감쌀 필요가 없습니다. 최상위 val/var는 파일 수준의 전역 상태입니다.
구조 분해 선언
구조 분해는 객체를 여러 변수로 분해합니다. Pair, Triple, data class가 모두 지원합니다.
타입 별칭
typealias는 기존 타입에 별칭을 붙여 가독성을 높입니다. 새 타입을 만들지 않으며 원래 타입과 완전히 동등합니다.
스코프와 블록
변수 스코프는 중괄호 블록으로 결정되며 안쪽에서 바깥쪽 변수에 접근할 수 있습니다. 같은 스코프에서 같은 이름의 변수를 중복 선언할 수 없습니다.
3.데이터 타입
숫자, 문자, 불리언, 배열, 범위, data class, 타입 변환.
숫자 타입
Kotlin은 Byte/Short/Int/Long/Float/Double의 6가지 숫자 타입을 제공하며 접미사 L, f, u로 구체적인 타입을 지정합니다.
수치 연산
산술, 비트 연산, 수학 함수. Int를 Int로 나눌 때 Int가 되며 정수 나눗셈은 잘림에 주의하세요.
문자와 불리언
Char는 단일 문자(작은따옴표)를 나타내고 Boolean은 true/fake만 갖습니다. 문자는 완전한 검사 및 변환 메서드를 가집니다.
배열
Array<T>는 참조 타입 배열, IntArray 등은 기본 타입 배열(더 효율적)입니다. 배열 크기는 고정입니다.
범위
범위 a..b는 닫힌 범위, until은 열린 범위입니다. for 루프와 in 판정과 함께 자주 사용됩니다.
문자열 타입
String은 불변인 UTF-16 문자 시퀀스입니다. 문자열 리터럴은 큰따옴표, 이스케이프는 백슬래시를 사용합니다.
data class
data class는 equals/hashCode/toString/copy 및 구조 분해를 자동 생성하며 데이터를 보관하는 순수한 값 객체입니다.
타입 변환
Kotlin은 숫자 타입을 암묵적으로 변환하지 않으므로 명시적 toXxx() 메서드가 필요합니다. 작은 타입에서 큰 타입 변환도 오버플로할 수 있으니 주의하세요.
Unit과 Nothing
Unit은 반환값이 없음을 나타내고(Java void와 유사) Nothing은 절대 반환하지 않음을 나타내며 반드시 던지거나 미구현인 함수에 사용됩니다.
4.참조와 null 안전성
Kotlin에는 원시 포인터가 없습니다: 참조 의미론, null 허용 타입, 안전 호출, 엘비스 연산자, lateinit, 값 클래스.
참조와 객체
Kotlin에는 원시 포인터가 없으며 모든 변수는 참조입니다. JVM이 수명을 자동 관리하므로 포인터 연산은 없습니다.
null 허용 타입
타입에 ?를 붙이면 null 허용이 됩니다. null 허용 타입은 메서드를 직접 호출할 수 없으며 먼저 null 판정이 필요합니다. 이는 Kotlin null 안전의 초석입니다.
안전 호출
?.는 객체가 non-null일 때 메서드를 호출하고, null이면 전체 표현식이 null이 됩니다. 안전 호출은 체이닝할 수 있습니다.
엘비스 연산자
?:는 왼쪽이 null일 때 오른쪽 기본값을 반환합니다. 오른쪽은 표현식, 조기 return, throw가 가능합니다.
non-null 단언
!!는 null 허용 타입을 강제로 non-null로 변환하며 null이면 NPE를 던집니다. 사용을 피하고 논리적으로 분명히 non-null일 때만 사용하세요.
lateinit 속성
lateinit은 나중에 초기화되는 non-null var를 선언하며 의존성 주입이나 프레임워크 콜백에 사용됩니다. 초기화 전에 사용하면 예외가 던져집니다.
by lazy 위임
by lazy는 첫 접근 시 초기화를 실행하고 이후 결과를 캐시합니다. 스레드 안전하며 비싼 일회성 초기화에 적합합니다.
복사와 동등성
==는 구조적 동등성을 비교하고, ===는 참조 동일성을 비교합니다. data class의 copy()는 얕은 복사입니다.
value class
value class는 단일 값을 감싸고 런타임에 인라인되어 박싱 오버헤드를 없애며 타입 안전한 커스텀 래퍼와 같습니다.
5.제어 흐름
if, when, for, while, 스마트 캐스트 — 표현식 스타일의 제어 흐름.
if 표현식
if는 표현식이며 값을 반환해 변수에 대입할 수 있습니다. Kotlin에는 삼항 연산자가 없고 if-else가 그 자리를 차지합니다.
when 표현식
when은 switch를 대체하며 값, 범위, 타입, 조건 분기를 지원합니다. 표현식 형태에서는 else가 필수입니다.
for 루프
for는 범위, 컬렉션, 배열 등 반복 가능 객체를 순회합니다. Kotlin에는 C 스타일의 삼중 표현식 for가 없습니다.
while 루프
while은 먼저 판정 후 실행, do-while은 먼저 실행 후 판정합니다. 조건은 Boolean 표현식이어야 합니다.
break와 continue
break는 루프를 종료하고 continue는 현재 반복을 건너뜁니다. 레이블 @는 중첩 루프의 점프를 제어합니다.
스마트 캐스트
타입 검사 후 컴파일러가 자동으로 타입을 변환하므로 명시적 캐스트가 필요 없습니다. null이나 is 검사 후 안전하게 사용할 수 있습니다.
레이블과 점프
레이블 @는 루프나 람다에 표시를 붙이며 break, continue, return과 함께 정확한 점프를 구현합니다.
takeIf와 takeUnless
takeIf는 조건을 만족하면 원본 객체를 반환하고 아니면 null이며, takeUnless는 그 반대입니다. 체이닝된 null 판정 및 필터링에 자주 사용됩니다.
6.함수와 람다
함수 선언, 람다, 고차 함수, 확장 함수, 스코프 함수, 중위 함수.
함수 선언
fun으로 함수를 선언하며 인자는 타입을 갖고 반환 타입은 인자 목록 뒤에 옵니다. 반환값이 없으면 Unit을 사용합니다.
단일 표현식 함수
함수 본문이 단일 표현식일 때 =로 단축해 return과 중괄호를 생략할 수 있습니다.
기본 인자와 명명된 인자
인자에 기본값을 설정할 수 있어 호출 시 생략 가능합니다. 명명된 인자는 임의 순서로 전달 가능해 가독성이 좋아집니다.
가변 인자
vararg는 임의 개수의 인자를 받고 함수 내에서는 배열로 사용됩니다. 전개 연산자 *로 배열을 전달할 수 있습니다.
람다 표현식
람다는 익명 함수이며 중괄호로 감싸고 ->로 인자와 본문을 구분합니다. 마지막 인자가 람다일 때 트레일링 람다 구문을 사용할 수 있습니다.
고차 함수
고차 함수는 함수를 인자로 받거나 반환합니다. map/filter 등 표준 라이브러리의 고차 함수는 일상의 주력입니다.
확장 함수
확장 함수는 기존 클래스에 메서드를 추가하며 원본 클래스는 변경하지 않습니다. this는 수신 객체를 가리키고 스코프는 정의된 곳으로 한정됩니다.
중위 함수
infix 키워드는 함수를 공백으로 호출하게 해 연산자처럼 만듭니다. 멤버 또는 확장 함수이며 인자 하나여야 합니다.
스코프 함수
let/run/with/apply/also는 객체 컨텍스트에서 코드를 실행합니다. let은 결과를, apply는 수신자를 반환합니다.
로컬 함수
함수 내에서 로컬 함수를 정의할 수 있으며 외부 변수를 캡처합니다. 로직 정리와 중복 감소에 유용합니다.
7.문자열
문자열 기본, 템플릿, 원시 문자열, 메서드, 연결, 포맷, 변환.
문자열 기본
String은 불변 문자 시퀀스입니다. 큰따옴표 리터럴, 이스케이프 시퀀스, 인덱스 접근, 순회.
문자열 템플릿
$변수와 ${표현식}으로 값을 문자열에 내장하는 가장 흔한 문자열 구성 방식입니다.
원시 문자열
삼중 따옴표 """의 원시 문자열은 줄바꿈과 서식을 보존하고 이스케이프하지 않습니다. trimIndent로 공통 들여쓰기를 제거합니다.
자주 쓰는 메서드
표준 라이브러리는 풍부한 문자열 메서드를 제공합니다: 부분 문자열, 치환, 공백 판정, 트림, 패딩.
연결과 StringBuilder
루프에서 연결할 때는 StringBuilder(또는 buildString)를 사용해 많은 중간 문자열 생성을 피하세요.
포맷
format 메서드는 printf 스타일의 포맷팅을 구현하며 너비, 정밀도, 타입 플레이스홀더를 지원합니다.
문자열 변환
문자열과 숫자 상호 변환, Boolean으로 변환. toXxxOrNull 계열은 안전한 변환으로 예외를 피합니다.
분할과 결합
split은 구분자로 리스트로 나누고 joinToString은 컬렉션을 문자열로 합칩니다. 여러 구분자를 지원합니다.
8.컬렉션
List, Set, Map, 지연 시퀀스, 변환 작업, 그룹화, 정렬.
List
listOf는 읽기 전용 리스트를 생성하고 elementAt과 get은 인덱스로 접근합니다. 기본 List 인터페이스는 수정할 수 없습니다.
Set
setOf는 중복 없는 컬렉션을 생성하며 원소가 유일합니다. 존재 판정은 List보다 효율적입니다.
Map
mapOf는 키/값 쌍을 생성하며 to 또는 Pair로 엔트리를 만듭니다. 키로 값을 찾고 없는 키는 기본값을 반환할 수 있습니다.
가변 컬렉션
mutableListOf/mutableSetOf/mutableMapOf는 가변 컬렉션을 생성합니다. 읽기 전용 뷰는 add할 수 없습니다.
지연 시퀀스
Sequence는 지연 평가되며 체이닝된 작업이 종결 작업에서 요소별로 실행됩니다. 대용량 데이터에서 중간 컬렉션을 피할 수 있습니다.
변환 작업
map/filter/flatMap 등은 컬렉션 처리의 주력으로 손으로 작성한 루프를 함수형 스타일로 대체합니다.
그룹화와 연관
groupBy는 조건으로 그룹화하고 associate는 키/값 관계를 구축하며 partition은 둘로 나눕니다.
정렬
sorted/sortedBy는 새 정렬 리스트를 반환하고 sort는 가변 리스트를 제자리에서 정렬합니다. 커스텀 비교자를 지원합니다.
컬렉션 상호 변환
컬렉션, 배열, Map 사이의 상호 변환. toList/toSet/toMap/toTypedArray.
9.메모리와 성능
JVM 가비지 컬렉션, 객체 참조, 박싱, 할당 최적화, 성능 분석.
JVM 가비지 컬렉션
Kotlin/JVM은 GC로 메모리를 자동 관리하며 수동 해제가 필요 없습니다. 도달할 수 없는 객체는 회수됩니다.
객체 참조
Kotlin의 모든 객체는 참조로 접근하며 포인터가 없습니다. 참조 타입이 공유와 도달 가능성을 결정합니다.
inline 함수
inline은 호출 지점에서 함수 본문을 전개해 람다 객체 생성 오버헤드를 제거합니다. reified 제네릭에는 inline이 필요합니다.
할당 최적화
객체 할당 감소는 JVM 성능의 핵심입니다. 객체 재사용, 박싱 회피, 기본 타입 배열 사용.
기본 타입 박싱
non-null 기본 타입 로컬 변수는 원시 타입을 사용하고 null 허용 또는 제네릭에서는 박싱됩니다. value class는 래퍼를 최적화합니다.
성능 튜닝
측정한 다음 최적화하세요. 흔한 최적화 포인트: 자료 구조, 반복 계산, 지연 평가, 알고리즘 복잡도.
객체 풀
고동시성 시나리오에서 객체를 재사용해 잦은 할당을 피합니다. 풀 객체는 스레드 안전과 반환 전 상태 정리가 필요합니다.
성능 분석
JFR, VisualVM 같은 도구로 CPU와 메모리를 분석합니다. 힙 덤프로 메모리 누수를 찾습니다.
10.객체 지향
클래스, 생성자, 속성, 상속, 인터페이스, 제네릭, data class, 봉인 클래스.
클래스 정의
class로 클래스를 선언하며 속성은 주 생성자나 클래스 본문에 둘 수 있습니다. 클래스는 기본이 final이며 상속할 수 없습니다.
생성자
주 생성자는 클래스 헤더에 선언되며 인자를 직접 속성으로 선언할 수 있습니다. init 블록은 주 생성 후 실행됩니다.
속성
속성은 getter/setter를 자동 생성합니다. 접근자를 커스터마이즈할 수 있으며 field는 백킹 필드를 가리킵니다.
상속과 오버라이드
open 클래스는 상속 가능하며 open 멤버는 오버라이드할 수 있습니다. override로 오버라이드를 표시하고 super로 부모에 접근합니다.
인터페이스
인터페이스는 동작 계약을 정의하며 기본 구현과 추상 멤버를 포함할 수 있습니다. 클래스는 여러 인터페이스를 구현할 수 있습니다.
추상 클래스
abstract class는 부분 구현을 정의하고 abstract 멤버는 서브클래스가 구현합니다. 인터페이스와 달리 추상 클래스는 상태를 보관할 수 있습니다.
data class
data class는 equals/hashCode/toString/copy/componentN을 자동 생성해 값 객체에 적합합니다.
봉인 클래스
sealed class는 서브클래스를 같은 패키지/모듈로 제한하며 when 분기를 완전하게 만들 수 있습니다. 제한된 계층 구조를 표현합니다.
싱글톤 객체
object는 싱글톤을 선언하며 스레드 안전하게 지연 초기화됩니다. 프로그램 전체에 인스턴스 하나만 존재합니다.
컴패니언 객체
companion object는 클래스 수준의 멤버를 제공하며 Java static과 비슷합니다. @JvmStatic으로 Java에 노출할 수 있습니다.
제네릭
제네릭은 타입을 매개변수화합니다. in/out은 공변/반공변을 선언하고 제네릭 함수와 타입 제약을 지원합니다.
위임
by 키워드는 인터페이스 위임과 속성 위임을 구현합니다. lazy/observable로 속성을 관리해 합성을 단순화합니다.
11.오류 처리
try 표현식, 커스텀 예외, runCatching, Result, require/check, 리소스 관리.
try 표현식
try는 표현식이며 catch의 값을 반환할 수 있습니다. catch는 예외 타입을 매칭하고 finally는 반드시 실행됩니다.
예외 던지기
throw는 예외 객체를 던집니다. 커스텀 메시지와 예외 체인. require/check는 인자 검증의 관용구입니다.
커스텀 예외
Exception 또는 RuntimeException을 상속해 커스텀 예외를 정의합니다. 추가 필드를 가질 수 있습니다.
runCatching
runCatching은 예외를 잡아 Result를 반환합니다. 함수형 오류 처리로 try-catch를 대체합니다.
Result 타입
Result<T>는 성공 값이나 실패 예외를 캡슐화하며 map/onSuccess 등을 지원합니다. 함수 반환 타입으로 자주 쓰입니다.
리소스 관리
use 확장은 Closeable/AutoCloseable 리소스를 자동으로 닫아 Java의 try-with-resources와 비슷합니다.
require와 check
require는 인자 검증, check는 상태 검증, error는 능동적 실패입니다. 실패 시 예외를 던지고 메시지를 출력합니다.
Nothing과 실패
Nothing은 절대 반환하지 않음을 나타내며 todo/error 같은 미구현 또는 반드시 실패하는 경로에 사용됩니다. 타입 시스템이 제어 흐름을 이해합니다.
12.입출력
파일 읽기/쓰기, Path API, 표준 입출력, JSON 직렬화, 파일 작업.
파일 읽기
readText는 파일 전체를 문자열로 읽고 readBytes는 바이트를 읽습니다. 문자 깨짐 방지를 위해 문자 집합을 지정하세요.
파일 쓰기
writeText는 덮어쓰기, appendText는 추가, writeBytes는 바이트 쓰기입니다. 디렉터리는 먼저 존재해야 합니다.
줄 단위 읽기
readLines는 모든 줄을 읽고 useLines는 지연 스트림으로 대용량 파일을 줄 단위로 처리합니다. forEachLine은 손쉬운 순회입니다.
Path API
java.nio.file.Path는 경로를 다루고 Files는 읽기/쓰기와 디렉터리 작업을 제공합니다. 경로 결합은 크로스 플랫폼입니다.
표준 입력
readln은 한 줄을 읽고 readlnOrNull은 null 허용으로 읽습니다. 읽은 후 원하는 타입으로 직접 변환하세요.
표준 출력
println/print는 표준 출력으로 출력하며 println은 자동으로 줄바꿈합니다. 에러 스트림으로도 출력 가능합니다.
JSON 직렬화
kotlinx.serialization은 공식 직렬화 라이브러리이며 @Serializable 어노테이션이 코덱을 생성합니다. Jackson도 대체로 쓸 수 있습니다.
파일 작업
존재 판정, 삭제, 이름 변경, 크기, 권한을 다룹니다. walkTopDown은 디렉터리를 재귀적으로 순회합니다.
13.흔한 함정
일상적인 Kotlin 개발에서 가장 자주 빠지는 함정과 올바른 작성법, BAD/GOOD 쌍으로 표시.
!! 남용
!!는 null일 때 NPE를 던지므로 피하세요. 안전 호출, 엘비스, 사전 검증으로 대체하세요.
스마트 캐스트 실패
가변 속성이나 위임 속성은 스마트 캐스트가 실패합니다. 대입 후 다시 확인하거나 로컬 변수로 추출하세요.
==와 ===
==는 구조적 동등성, ===는 참조 동일성을 비교합니다. 객체와 기본 타입을 구분하세요.
null 허용 연결
null 허용 값을 문자열 템플릿에 넣으면 null이 "null"로 표시됩니다. null을 명시적으로 처리해야 합니다.
템플릿 null 함정
$a.b는 속성 접근 a.b로 파싱됩니다. null 허용 객체의 속성 접근은 ${a?.b}를 사용하세요.
배열 공변 함정
Array<String>을 Array<Any>에 대입할 수 있어 런타임에 ArrayStoreException이 발생할 수 있습니다. List를 쓰면 더 안전합니다.
lateinit 미초기화
초기화 전에 접근하면 UninitializedPropertyAccessException이 던져집니다. 접근 전에 isInitialized를 확인하세요.
스코프 함수 혼동
let/apply/run의 반환값이 다릅니다. 잘못 쓰면 결과가 아닌 객체를 반환합니다. 용도에 맞게 선택하세요.
컴패니언 객체 혼동
컴패니언 객체의 멤버는 클래스 정적 필드가 아닙니다. Kotlin은 컴패니언 객체로 정적 의미를 구현하며 Java에 노출하려면 @JvmStatic이 필요합니다.
읽기 전용 뷰 오해
읽기 전용 List 인터페이스는 뷰일 뿐이며 기반의 가변 컬렉션은 여전히 수정 가능합니다. 가변 상태를 공유할 때는 복사하세요.
14.동시성과 코루틴
스레드, 코루틴, async/await, Channel, Flow, 상호 배타 락, 타임아웃 제어.
스레드 기본
Thread와 thread{}로 스레드를 만듭니다. join은 종료를 기다립니다. 동시성에서 공유 상태는 동기화가 필요합니다.
코루틴 입문
launch는 경량 코루틴을 시작하고 delay는 스레드를 점유하지 않고 일시 중단합니다. runBlocking은 코루틴이 끝날 때까지 블록 대기합니다.
async와 await
async는 동시 실행되어 Deferred를 반환하고 await는 결과를 가져옵니다. awaitAll은 여러 작업이 끝나기를 기다립니다.
withContext
withContext는 디스패처를 전환해 블로킹 작업을 실행합니다. IO 작업은 Dispatchers.IO, 계산은 Default를 사용하세요.
Channel
Channel은 코루틴 간 데이터를 전달하며 send/receive는 일시 중단 함수입니다. 버퍼링과 종료를 지원합니다.
Flow 데이터 스트림
Flow는 비동기 콜드 스트림으로 collect 시점에 실행됩니다. map/filter 같은 연산자와 배압을 지원합니다.
상호 배타와 동기화
AtomicInteger 클래스는 락 없는 카운터를 제공합니다. 코루틴 내에서는 Mutex로 임계 영역을 보호하고 스레드 내에서는 synchronized를 사용합니다.
타임아웃과 취소
withTimeout은 코루틴 실행 시간을 제한합니다. job.cancel은 협력적 취소이며 isActive 확인이 필요합니다.
15.네트워크 프로그래밍
HTTP 요청, Ktor Client, JSON 파싱, TCP 소켓, HTTP 서버, WebSocket.
URL 간단 요청
URL.readText는 빠른 GET입니다. openConnection으로 타임아웃을 설정할 수 있습니다. 가벼운 작은 응답에 적합합니다.
JDK HttpClient
JDK 11+에는 HTTP 요청을 보내는 HttpClient가 내장되어 있습니다. 비동기 sendAsync와 응답 본문 변환을 지원합니다.
Ktor Client
Ktor Client는 크로스 플랫폼 HTTP 라이브러리로 코루틴과 여러 엔진을 지원합니다. 네트워크 집약적 작업에 적합합니다.
응답 JSON 파싱
HttpClient로 응답을 받은 뒤 kotlinx.serialization으로 JSON을 data class로 역직렬화합니다.
TCP 소켓
ServerSocket은 포트를 리슨하고 accept가 연결을 수락합니다. Socket은 바이트 스트림을 읽고 씁니다. 리소스 닫기를 잊지 마세요.
HTTP 서버
JDK 내장 HttpServer는 가벼운 HTTP 서비스를 만듭니다. createContext로 라우트 핸들러를 등록합니다.
REST 설계 요점
REST는 리소스와 HTTP 메서드로 작업을 표현합니다. data class로 요청/응답을 기술하고 상태 코드의 의미를 정확히 합니다.
WebSocket
OkHttp는 WebSocket 클라이언트를 제공하며 onOpen/onMessage 콜백으로 양방향 메시지를 처리합니다.
16.날짜와 시간
Instant, LocalDate, 포맷, 파싱, Duration, Period, 타임존 포함 시각.
현재 타임스탬프
Instant.now는 순간을 기록합니다. currentTimeMillis는 밀리초를, nanoTime은 간격 측정에 사용합니다.
LocalDate
LocalDate는 연월일을 나타내며 of/now로 생성합니다. 일수 가감, 판정, 성분 접근.
LocalDateTime
LocalDateTime은 날짜와 시간을 포함합니다. withHour로 필드를 조정하고 plusHours로 가감합니다.
포맷 출력
DateTimeFormatter.ofPattern으로 사용자 정의 포맷을 지정합니다. yyyy-MM-dd HH:mm:ss는 흔히 쓰이는 패턴입니다.
날짜 파싱
LocalDate.parse가 문자열을 파싱합니다. 사용자 정의 포맷에는 DateTimeFormatter가 필요하며 실패하면 예외가 던져집니다.
Duration
Duration은 나노초 기반의 시간량을 나타내며 between이 차이를 계산합니다. 경과 시간 측정에 적합합니다.
Period
Period는 연/월/일 차이를 나타내며 between이 나이를 계산합니다. ofWeeks/ofDays로 주기를 구성합니다.
타임존 포함 시각
ZonedDateTime은 타임존을 포함합니다. withZoneSameInstant으로 타임존을 전환합니다. 저장에는 UTC, 표시에는 로컬을 사용하세요.
17.프로세스와 시스템
명령줄 인자, 환경 변수, ProcessBuilder로 외부 명령 실행, 시스템 정보, 종료 훅.
인자와 환경
main의 args가 명령줄 인자를 받습니다. System.getenv는 환경 변수, getProperty는 시스템 속성을 읽습니다.
ProcessBuilder
ProcessBuilder는 외부 명령을 실행하고 directory로 작업 디렉터리를 설정합니다. redirectErrorStream은 에러 스트림을 병합합니다.
종료 코드
waitFor는 자식 프로세스를 블록 대기합니다. 종료 코드 0이 성공이며 exitProcess는 현재 프로세스의 종료 코드를 설정합니다.
자식 프로세스 출력 캡처
inputStream을 읽어 자식 프로세스 출력을 캡처합니다. waitFor는 타임아웃과 함께 멈춤을 방지하고 destroyForcibly는 강제 종료합니다.
시스템 정보
JVM과 OS 속성을 읽습니다. Runtime은 메모리를 확인합니다. 로깅과 진단에 사용됩니다.
종료 훅
addShutdownHook은 JVM 종료 시 실행할 작업을 등록합니다. 리소스 정리와 상태 저장에 사용됩니다.
실시간 출력 읽기
자식 프로세스의 출력 스트림을 줄 단위로 읽어 진행 상황을 실시간 처리합니다. useLines가 스트림을 자동으로 닫습니다.
프로세스 종료
destroy는 부드러운 종료, destroyForcibly는 강제 종료입니다. 타임아웃 내에 끝나지 않으면 강제 종료합니다.
18.정규 표현식
Regex 기본, 매치 검색, 캡처 그룹, 치환/분할, 자주 쓰는 패턴, 플래그 옵션.
Regex 기본
Regex는 정규 표현식 객체를 만듭니다. matches는 전체 매치, containsMatchIn은 포함 판정, matchEntire는 문자열 전체 매치입니다.
리터럴과 옵션
Regex.escape는 특수 문자를 이스케이프합니다. IGNORE_CASE는 대소문자 무시, MULTILINE은 다중 행 모드입니다.
매치 찾기
find는 첫 매치를, findAll은 모든 매치를 반환합니다. MatchResult는 값, 그룹, 범위에 접근할 수 있습니다.
캡처 그룹
괄호는 캡처 그룹을 정의합니다. groupValues는 인덱스로 가져오고 명명 그룹은 groups["name"]을 사용합니다.
정규식 치환
replace는 모든 매치를 치환하고 replaceFirst는 첫 매치만 치환합니다. 치환 클로저는 캡처 그룹에 접근할 수 있습니다.
정규식 분할
split(Regex)는 정규식으로 문자열을 분할합니다. 문자열 분할보다 유연하며 여러 구분자를 지원합니다.
자주 쓰는 정규식
이메일, 휴대폰, IPv4, 중국어 문자, URL의 자주 쓰이는 정규식 템플릿. 필요에 따라 경계를 조정하세요.
플래그 옵션
RegexOption 상수로 매치 동작을 제어합니다. 인라인 플래그 (?i)(?m)(?s)를 패턴 안에 쓸 수 있습니다.
19.빌드와 의존성
Gradle Kotlin DSL, 플러그인, 의존성, 테스트, 코루틴, 직렬화 라이브러리 설정.
Gradle 기본
build.gradle.kts는 Kotlin DSL로 빌드를 설정합니다. mainClass로 실행 진입점을 지정합니다.
Kotlin 플러그인
kotlin("jvm")은 JVM 프로젝트를 선언합니다. jvmToolchain으로 JDK 버전을 지정하고 Wrapper로 Gradle을 고정합니다.
의존성 구성
implementation/testImplementation/compileOnly 같은 구성으로 의존성 스코프를 제어합니다.
실행과 배포
application 플러그인은 run/installDist 태스크를 제공합니다. run --args로 명령줄 인자를 전달합니다.
테스트
kotlin.test가 어서션을 제공합니다. testImplementation으로 테스트 라이브러리를 도입하고 test 태스크가 모든 테스트를 실행합니다.
코루틴 의존성
kotlinx-coroutines-core가 코루틴 코어를 제공합니다. Android/Swing 버전이 메인 스레드 디스패처를 제공합니다.
직렬화 의존성
kotlin plugin.serialization 플러그인과 kotlinx-serialization-json 라이브러리로 JSON 인코드/디코드를 구현합니다.
패키징과 발행
distribution 플러그인이 배포용 압축 파일을 생성합니다. publishToMavenLocal로 로컬 저장소에 발행합니다.
이 치트시트에 대해
이 페이지는 Kotlin 2.0의 자체 포함형 치트시트로, 실제 프로젝트에서 사용의 약 80%를 차지하는 언어 핵심과 가장 자주 쓰는 표준 라이브러리를 다룹니다. 현대적 관용구에 중점을 둡니다: null 안전성(null 허용 타입 ?, 안전 호출 ?., 엘비스 ?:), data class와 sealed class, 스코프 함수, 확장 함수, 그리고 코루틴과 Flow의 비동기 동시성 모델. 권위 있는 레퍼런스는 공식 Kotlin 문서와 『Kotlin in Action』을 참고하세요. 19개 섹션은 각각 하나의 주제를 다룹니다 — 첫 프로그램부터 코루틴, null 안전성, 흔한 함정까지. 각 섹션은 8~14개의 예제 기반 하위 주제(각 5~20줄)로 나뉘며 총 약 160개 주제입니다. 코드 스니펫은 의도적으로 짧고 자명하며 주석은 간체 중국어입니다. 모든 처리는 브라우저에서 이루어집니다 — 업로드도 추적도 없습니다. 이 페이지는 GuruToolkit의 무료 개발자 도구 모음의 일부이며 코드 스니펫은 어떤 보증 없이 자유롭게 사용할 수 있습니다.
버전 2.1.0