출시·고도화 중
Kotlin 안내서 · 2/6
이 장에서는 Kotlin 코드를 읽고 쓰는 데 매일 필요한 문법을 다룹니다. 변수 선언, 함수, 조건과 반복, 문자열 템플릿까지 익히면 간단한 프로그램은 충분히 만들 수 있습니다.
Kotlin의 변수는 두 종류입니다. val은 한 번 값을 넣으면 다시 대입할 수 없는 읽기 전용 변수이고, var는 값을 바꿀 수 있는 변수입니다. val을 기본으로 쓰고 정말 바뀌어야 하는 값에만 var를 쓰는 것이 관례입니다. 타입은 대부분 컴파일러가 추론하므로 생략할 수 있습니다.
const val MAX_USERS = 100 // 컴파일 시점 상수: 최상위나 object 안에서만 씁니다
fun main() {
val language = "Kotlin" // 타입 추론으로 String
var count: Int = 0 // 타입을 직접 적을 수도 있습니다
count += 1
// language = "Java" // 컴파일 오류: val은 다시 대입할 수 없습니다
println("$language $count / $MAX_USERS")
}val은 변수가 가리키는 대상을 바꿀 수 없다는 뜻이지, 그 객체 자체가 불변이라는 뜻은 아닙니다. val list = mutableListOf(1)로 선언해도 list.add(2)는 동작합니다.
함수는 fun으로 선언하고, 매개변수 타입과 반환 타입을 콜론 뒤에 적습니다. 본문이 식 하나뿐이면 중괄호 대신 =로 바로 쓸 수 있고, 이때는 반환 타입도 추론됩니다.
fun add(a: Int, b: Int): Int {
return a + b
}
fun square(x: Int) = x * x // 식 본문: 반환 타입은 Int로 추론
fun greet(name: String, greeting: String = "안녕하세요", mark: Char = '!'): String =
"$greeting, $name$mark"
fun main() {
println(add(2, 3)) // 5
println(square(4)) // 16
println(greet("민수")) // 안녕하세요, 민수!
println(greet("Alice", greeting = "Hello")) // Hello, Alice!
println(greet(mark = '?', name = "지은")) // 안녕하세요, 지은?
}기본값이 있는 매개변수는 호출할 때 생략할 수 있고, 이름 붙인 인자를 쓰면 순서와 상관없이 원하는 매개변수만 지정할 수 있습니다. 덕분에 Java처럼 오버로드를 여러 개 만들 일이 줄어듭니다. 돌려줄 값이 없는 함수의 반환 타입은 Unit이며 보통 생략합니다.
Kotlin에서 if는 값을 돌려주는 식입니다. 그래서 따로 삼항 연산자가 없고, if의 결과를 바로 변수에 넣습니다.
fun describe(score: Int): String {
val passed = if (score >= 60) "합격" else "불합격"
val grade = when {
score >= 90 -> "A"
score >= 80 -> "B"
score >= 70 -> "C"
else -> "F"
}
return "$passed ($grade)"
}
fun kind(x: Any): String = when (x) {
0, 1 -> "0 또는 1"
in 2..9 -> "한 자리 수"
is String -> "문자열, 길이 ${x.length}"
else -> "그 밖의 값"
}when은 Java의 switch를 대신합니다. 괄호 안에 비교 대상을 두면 값 비교, 범위 검사(in), 타입 검사(is)를 할 수 있고, 대상 없이 쓰면 위에서부터 조건을 차례로 검사하는 if-else 사슬처럼 동작합니다. 식으로 쓸 때는 모든 경우를 다뤄야 하므로 보통 else 가지가 필요합니다. is String 가지 안에서 x.length를 바로 쓸 수 있는 것은 스마트 캐스트 덕분이며, 6장에서 자세히 다룹니다.
문자열 안에 $변수나 ${식}을 쓰면 그 값이 그 자리에 들어갑니다. 여러 줄 문자열은 큰따옴표 세 개로 감싸고, trimIndent()로 앞쪽의 공통 들여쓰기를 지웁니다.
fun main() {
val user = "지은"
val items = listOf("사과", "배")
println("$user 님의 장바구니: ${items.size}개")
println("합계: ${items.size * 1500}원")
val json = """
{
"name": "$user",
"count": ${items.size}
}
""".trimIndent()
println(json)
}Kotlin에는 C 스타일의 for (i = 0; i < n; i++)가 없습니다. 대신 범위나 컬렉션을 for ... in으로 순회합니다.
| 표현 | 뜻 | 값 |
|---|---|---|
1..5 | 끝을 포함하는 범위 | 1, 2, 3, 4, 5 |
0..<5 | 끝을 뺀 범위(0 until 5와 같음) | 0, 1, 2, 3, 4 |
10 downTo 0 step 3 | 거꾸로, 3씩 | 10, 7, 4, 1 |
'a'..'e' | 문자 범위 | a, b, c, d, e |
fun main() {
for (i in 1..5) print("$i ")
println()
for (i in 10 downTo 0 step 3) print("$i ")
println()
val fruits = listOf("사과", "배", "포도")
for ((index, fruit) in fruits.withIndex()) {
println("$index: $fruit")
}
var n = 3
while (n > 0) {
println("남은 횟수 $n")
n--
}
repeat(2) { println("반복 $it") }
outer@ for (x in 1..3) {
for (y in 1..3) {
if (x * y == 4) break@outer // 바깥 반복까지 끝냅니다
println("$x x $y")
}
}
}범위는 반복뿐 아니라 if (age in 20..29)처럼 포함 여부를 검사할 때도 씁니다. 중첩된 반복에서 바깥 반복을 끝내려면 outer@처럼 레이블을 붙이고 break@outer를 씁니다.
val은 다시 대입할 수 없는 변수, var는 바꿀 수 있는 변수이며 val을 기본으로 씁니다.=로 줄여 씁니다.if와 when은 값을 돌려주는 식이며, when은 값 · 범위 · 타입을 모두 검사할 수 있습니다.$name, ${식}으로 문자열을 조립합니다.1..5, 0..<n, downTo, step 같은 범위와 컬렉션을 for ... in으로 순회합니다.
댓글 0개
로그인 · 로그인하면 댓글을 남길 수 있습니다.
첫 댓글을 남겨 보세요.