2026-10-07 코틀린 입문: 기본 타입, 함수, Unit, 파일 구조, if와 when
오늘은 코틀린 입문으로 기본 타입, 함수 작성법, Unit, 파일 구조, if와 when 작성법을 공부했다. 공부한 내용을 정리하면서 예제는 전부 직접 컴파일해 결과를 확인했다.
확인 환경: Kotlin 2.2.20(IntelliJ IDEA 내장
kotlinc), JVM 21. 아래 출력과 에러 메시지는 이 환경에서 실제로 나온 값이다.
1. 기본 타입과 변수
val과 var
val name = "코틀린" // 다시 대입할 수 없다 (Java의 final 변수와 비슷)var count = 0 // 다시 대입할 수 있다count += 1기본은 val로 쓰고, 값이 바뀌어야 할 때만 var를 쓴다.
타입 추론과 기본 타입
타입을 적지 않아도 대입한 값으로 타입이 정해진다. 적고 싶으면 이름: 타입 형태로 쓴다.
val i = 42 // Intval l = 3_000_000_000 // Int 범위를 넘어서 Longval l2 = 10L // L을 붙이면 Longval d = 3.14 // Doubleval f = 2.5f // f를 붙이면 Floatval b = true // Booleanval c = 'A' // Charval s = "코틀린" // Stringval explicit: Int = 42 // 타입을 직접 적는 방법각 값의 타입 이름을 출력해 보면 이렇게 나온다.
Int Long Long Double Float Boolean Char String3_000_000_000처럼 숫자 사이에 _를 넣어 읽기 쉽게 쓸 수 있다. 정수 리터럴은 기본이 Int지만 Int 범위를 넘으면 Long으로 추론된다.
숫자 타입은 자동으로 넓혀지지 않는다
Java에서는 int를 long 변수에 바로 넣을 수 있지만 코틀린은 안 된다.
val i: Int = 1val l: Long = i // 컴파일 에러val ok: Long = i.toLong() // 명시적으로 변환해야 한다error: initializer type mismatch: expected 'Long', actual 'Int'.toLong(), toInt(), toDouble() 같은 변환 함수를 명시적으로 불러야 한다.
문자열 템플릿
문자열 안에서 $변수나 ${식}으로 값을 넣을 수 있다.
val a = 1val b = 2println("$a + $b = ${a + b}") // 1 + 2 = 32. 함수 작성법
기본 형태
fun add(a: Int, b: Int): Int { return a + b}fun키워드로 시작한다.- 매개변수는
이름: 타입순서다. Java(int a)와 반대다. - 반환 타입은 괄호 뒤에
: 타입으로 쓴다.
식 본문(expression body)
본문이 식 하나면 중괄호와 return을 생략하고 =로 쓸 수 있다. 이때는 반환 타입도 추론된다.
fun multiply(a: Int, b: Int) = a * b기본값과 이름 붙인 인자
fun greet(name: String, greeting: String = "안녕"): String = "$greeting, $name!"greet("코틀린") // 안녕, 코틀린!greet(greeting = "Hi", name = "Kim") // Hi, Kim!매개변수에 기본값을 줄 수 있고, 호출할 때 이름을 붙이면 순서를 바꿔 넘길 수 있다. Java처럼 오버로딩을 여러 개 만들지 않아도 된다.
3. Unit
돌려줄 값이 없는 함수의 반환 타입은 Unit이다. Java의 void와 같은 역할이고, 생략할 수 있다.
fun printSum(a: Int, b: Int) { // 반환 타입 생략 = Unit println("$a + $b = ${a + b}")}fun printSumExplicit(a: Int, b: Int): Unit { // 직접 적어도 된다 println("$a + $b = ${a + b}")}void와 다른 점은 Unit이 실제 값(객체)이라는 것이다. 반환값을 변수에 받아 출력해 볼 수 있다.
val r = printSum(1, 2)println(r) // kotlin.Unitprintln(r == Unit) // true1 + 2 = 3kotlin.Unittruevoid는 "값이 없음"이라서 변수에 담을 수 없지만, Unit은 값이 딱 하나뿐인 타입이라 다른 타입과 똑같이 다룰 수 있다.
4. 파일 구조
package study.basicsimport kotlin.math.maxfun main() { println(max(3, 7))}- 맨 위에
package, 그 다음import를 쓴다. - 함수를 클래스 밖, 파일 최상위에 바로 쓸 수 있다. Java처럼
main을 넣을 클래스를 따로 만들 필요가 없다. - 프로그램 시작점은
fun main()이다. 인자가 필요 없으면args를 생략할 수 있다. - 파일 이름과 클래스 이름이 같을 필요가 없고, 한 파일에 클래스나 함수를 여러 개 둘 수 있다.
JVM에서는 최상위 함수도 결국 클래스 안에 들어가야 하므로, 컴파일러가 파일이름Kt 클래스를 만들어 넣는다. Basics.kt를 컴파일했더니 BasicsKt.class가 생겼고, 실행할 때도 이 이름을 썼다.
$ kotlinc Basics.kt -d out$ ls out/study/basicsBasicsKt.class$ kotlin -cp out study.basics.BasicsKt5. if는 식이다
코틀린의 if는 값을 돌려주는 식이다. 그래서 삼항 연산자(a > b ? a : b)가 따로 없다.
fun maxOf2(a: Int, b: Int) = if (a > b) a else b블록을 쓰면 마지막 식의 값이 결과가 된다.
val result = if (count > 0) { println("양수 블록") "positive" // 이 값이 result가 된다} else { "zero"}식으로 쓸 때는 else가 반드시 있어야 한다. 조건이 거짓일 때 돌려줄 값이 없기 때문이다.
val z = if (x > 0) "p" // 컴파일 에러error: 'if' must have both main and 'else' branches when used as an expression.6. when
when은 Java의 switch를 대신한다. break가 필요 없고, 이것도 식으로 쓸 수 있다.
값, 여러 값, 범위
fun grade(score: Int): String = when (score) { 100 -> "만점" in 90..99 -> "A" // 90 이상 99 이하 in 80 until 90 -> "B" // 80 이상 90 미만 else -> "C 이하"}fun dayType(day: String) = when (day) { "토", "일" -> "주말" // 쉼표로 여러 값 else -> "평일"}..는 끝을 포함하고, until은 끝을 포함하지 않는다.
타입 검사와 스마트 캐스트
fun describe(x: Any): String = when (x) { 1 -> "숫자 1" "hello" -> "인사" is Long -> "Long 타입" !is String -> "문자열이 아님" else -> "그 밖의 문자열: ${x.length}"}describe(1) → 숫자 1describe("hello") → 인사describe(5L) → Long 타입describe(2.0) → 문자열이 아님describe("abc") → 그 밖의 문자열: 3마지막 else에서 x는 Any 타입인데 x.length가 컴파일된다. 앞의 !is String 분기에서 문자열이 아닌 값은 이미 걸러졌으므로, 컴파일러가 여기의 x를 String으로 취급한다. 이것을 스마트 캐스트라고 한다. 따로 형변환을 쓰지 않아도 된다.
대상 없는 when
괄호 안에 대상을 넣지 않으면 각 분기에 조건식을 쓸 수 있다. if-else if 사슬을 대신할 때 쓴다.
fun sign(n: Int) = when { n < 0 -> "음수" n == 0 -> "0" else -> "양수"}식으로 쓸 때는 모든 경우를 다뤄야 한다
when을 식으로 쓰면 가능한 모든 경우를 덮어야 한다. 보통 else를 넣는다.
val y = when (x) { 1 -> "one" } // 컴파일 에러error: 'when' expression must be exhaustive. Add an 'else' branch.정리
| 주제 | 기억할 것 |
|---|---|
| 변수 | 기본은 val, 바뀌어야 하면 var |
| 타입 | 대부분 추론된다. 숫자는 자동으로 넓혀지지 않아 toLong() 등으로 변환 |
| 함수 | fun 이름(인자: 타입): 반환타입, 식 하나면 =로 짧게 |
| 함수 인자 | 기본값과 이름 붙인 인자로 오버로딩을 줄인다 |
| Unit | void 역할이지만 실제 값이 하나 있는 타입. 생략 가능 |
| 파일 | 최상위 함수 가능, JVM에서는 파일이름Kt 클래스로 컴파일 |
| if | 값을 돌려주는 식. 삼항 연산자 대신 쓰고, 식이면 else 필수 |
| when | switch 대신. 여러 값·범위·타입 검사 가능, 식이면 모든 경우를 다뤄야 함 |
오류 제보·의견 보내기
글 제목과 주소가 포함된 메일 초안을 엽니다. 내용과 받는 사람을 확인한 뒤 보내주세요.
받는 사람: [email protected]
메일 앱에서 작성메일 앱이 열리지 않으면 아래 내용을 복사해 평소 쓰는 이메일에 붙여 넣으세요.
관련 글
오늘의 공부 2026-10-06 개발자를 위한 Claude Code 추천 명령어
Claude Code를 많이 쓰는 사람들이 공통으로 추천하는 습관과, 그걸 실천하는 명령어·단축키를 기본부터 최근 추가된 기능까지 공식 문서로 확인해 정리했다.