fun main() {
println("Hello, World!")
}
변수와 타입 선언
코틀린에서는 val로 불변 값을, var로 가변 변수를 선언한다. 함수 정의에는 fun 키워드를 사용한다. 타입은 콜론 뒤에 위치하며, 초기값이 명확하면 컴파일러가 자동으로 추론한다.
| 구분 | 코틀린 | 스위프트 |
|---|---|---|
| 상수 | val count = 10 또는 val count: Int = 10 |
let count = 10 또는 let count: Int = 10 |
| 변수 | var total = 10 또는 var total: Int = 10 |
var total = 10 또는 var total: Int = 10 |
| 반환값 있는 함수 | fun increment(n: Int): Int { return n + 1 }fun increment(n: Int): Int = n + 1fun increment(n: Int) = n + 1 |
func increment(n: Int) -> Int { return n + 1 } |
| 반환값 없는 함수 | fun display(n: Int): Unit { println(n) }fun display(n: Int) { println(n) }fun display(n: Int): Unit = println(n)fun display(n: Int) = println(n) |
func display(n: Int) -> () { print(n) }func display(n: Int) -> Void { print(n) }func display(n: Int) { print(n) } |
함수 본문이 블록 형태면 반환 타입 생략이 불가능하고, 식 형태면 항상 생략 가능하다.
문자열 처리
문자열 템플릿은 $변수명 또는 ${계산식} 형태로 사용한다. 달러 기호 자체를 표현하려면 ${'$'}를 사용한다. 여러 줄 문자열은 삼중 따옴표로 감싼다.
| 기능 | 코틀린 | 스위프트 | C# | 결과 |
|---|---|---|---|---|
| 문자열 템플릿 | val a = 5; val b = 8 |
let a = 5, b = 8 |
int a = 5, b = 8; |
a=5, b=16 |
| 여러 줄 문자열 | val cost = """ |
var cost = """ |
var cost = @" |
빈 줄 $15.99 빈 줄 |
범위와 순회
| 동작 | 코틀린 | 스위프트 | 출력 |
|---|---|---|---|
| 오름차순 범위 | for (n in 2..5) print(n) |
for n in 2...5 { print(n, terminator: "") } |
2345 |
| 내림차순 (역순) | for (n in (2..5).reversed()) print(n) |
for n in (2...5).reversed() { print(n, terminator: "") } |
5432 |
| 내림차순 (downTo) | for (n in 5 downTo 2) print(n) |
for n in stride(from: 5, through: 2, by: -1) { print(n, terminator: "") } |
5432 |
| 건너뛰기 (step) | for (n in 2..8 step 2) print(n) |
for n in stride(from: 2, through: 8, by: 2) { print(n, terminator: "") } |
2468 |
| 반개방 범위 | for (n in 2 until 6) print(n) |
for n in 2..<6 { print(n, terminator: "") } |
2345 |
| 위 포함 검사 | val v = 4 |
let v = 4 |
4 |
동등성 비교
| 언어 | 값 동등성 | 참조 동등성 |
|---|---|---|
| 코틀린 | p == q, p != q |
p === q, p !== q |
| 스위프트 | p == q, p != q |
p === q, p !== q |
제어 흐름
if-else 식
val x = 7; val y = 12
val smaller: Int
if (x < y) smaller = x else smaller = y
val min = if (x < y) x else y
val result = if (x < y) {
println("x가 더 작음")
x
} else {
println("y가 더 작거나 같음")
y
}
인자 없는 when
fun Int.isPrime() = this > 1 && (2 until this).none { this % it == 0 }
fun Int.isComposite() = this > 1 && !isPrime()
val num = 9
when {
num.isPrime() -> println("소수")
num.isComposite() -> println("합성수")
else -> println("둘 다 아님")
}
인자 있는 when
fun categorize(item: Any): String =
when (item) {
0 -> "영"
1, 2 -> "일 또는 이"
in 3..5 -> "삼에서 오"
"Kotlin" -> "프로그래밍 언어"
is Double -> "실수"
!is String -> "문자열 아님"
else -> "기타"
}
println(categorize(0)) // 영
println(categorize(2)) // 일 또는 이
println(categorize(4)) // 삼에서 오
println(categorize(3.14)) // 실수
println(categorize("Hi")) // 기타
함수 정의와 활용
지역 함수와 변수 캡처
fun outerOperation() {
var counter = 0
fun innerIncrement() {
counter++
}
innerIncrement()
innerIncrement()
println(counter) // 2
}
기본 인자값과 명명 인자
fun multiply(factor: Int = 2, value: Int = 3) = factor * value
println(multiply()) // 6
println(multiply(4)) // 12 (factor=4, value=3)
println(multiply(value = 5)) // 10 (factor=2, value=5)
가변 인자
| 언어 | 선언 방식 |
|---|---|
| 코틀린 | fun sum(vararg values: Int): Int |
| 스위프트 | func sum(values: Int...) -> Int |
| C# | int Sum(params int[] values) |
| 자바 | int sum(int... values) |
함수 타입
| 언어 | 반환 있는 함수 타입 | 반환 없는 함수 타입 |
|---|---|---|
| 코틀린 | (Int, Int) -> Boolean |
(Int, Int) -> Unit |
| 스위프트 | (Int, Int) -> Bool |
(Int, Int) -> Void |
| C# | Func<int, int, bool> |
Action<int, int> |
코틀린에서 함수는 일급 객체로, 매개변수나 반환값이 될 수 있다. 클래스의 함수는 멤버 함수, 기존 클래스에 추가하는 함수는 확장 함수라 부른다. 단일 인자를 받는 멤버 함수나 확장 함수는 infix로 중위 표기법 호출이 가능하다.