fun
키워드를 사용하여 함수를 정의합니다.fun greet(name: String): String {
return "Hello, $name!"
}
// 표현식 함수 (간단한 경우)
fun add(a: Int, b: Int) = a + b
val
: 읽기 전용 변수 (불변)var
: 변경 가능한 변수 (가변)val readOnlyValue = 10 // 읽기 전용, 변경 불가
var mutableValue = 20 // 변경 가능
mutableValue = 30 // OK
// val readOnlyValue = 15 // 컴파일 에러!
문자열 템플릿을 사용하면 문자열 연결 없이도 코드가 간결해집니다.
$
를 붙이거나${}
로 둘러싸면 변수나 식의 값을 문자열에 삽입할 수 있습니다.val name = "코틀린"
val version = 1.8
val message = "안녕하세요, $name 버전 $version입니다!"
// 복잡한 식의 경우
val price = 1000
val tax = 0.1
val total = "총 가격: ${price * (1 + tax)}원"
println(message) // 안녕하세요, 코틀린 버전 1.8입니다!
println(total) // 총 가격: 1100.0원
코틀린에서는 값 객체 클래스를 아주 간결하게 표현할 수 있습니다.
// 기본 데이터 클래스
data class Person(val name: String, var age: Int)
// 사용 예시
val person = Person("홍길동", 25)
println(person.name) // 홍길동
person.age = 26 // var이므로 변경 가능
// 자동으로 제공되는 메소드들
val person2 = Person("홍길동", 26)
println(person == person2) // true (equals 자동 구현)
println(person) // Person(name=홍길동, age=26) (toString 자동 구현)
다른 언어와 달리 코틀린의 if문은 식(expression)이며 값을 반환할 수 있습니다.
val max = if (a > b) a else b
// 복잡한 조건식
val result = if (score >= 90) {
"A학점"
} else if (score >= 80) {
"B학점"
} else {
"C학점"
}
// 삼항 연산자 대신 사용
val status = if (isOnline) "온라인" else "오프라인"
코틀린의 when
은 자바의 switch
와 비슷하지만 훨씬 더 강력합니다.
when (grade) {
'A' -> println("우수")
'B', 'C' -> println("보통") // 여러 값 동시 처리
'D' -> println("미흡")
else -> println("재시험")
}
// 식으로 사용
val description = when (grade) {
'A' -> "우수"
'B', 'C' -> "보통"
else -> "기타"
}
// 범위와 함께 사용
when (score) {
in 90..100 -> "A"
in 80..89 -> "B"
in 70..79 -> "C"
else -> "F"
}
어떤 변수의 타입을 검증하고 나면 굳이 명시적으로 캐스팅하지 않아도 됩니다.
컴파일러가 자동으로 타입 변환을 해줍니다.
fun printLength(obj: Any) {
if (obj is String) {
// obj가 자동으로 String으로 캐스팅됨
println("문자열 길이: ${obj.length}")
}
}
when (x) {
is Int -> println("정수: ${x + 1}") // x는 자동으로 Int
is String -> println("문자열: ${x.uppercase()}") // x는 자동으로 String
is Boolean -> println("불린: ${!x}") // x는 자동으로 Boolean
}
자바의 for문보다 코틀린의 for문이 더 편리합니다.
// 범위 반복
for (i in 1..5) {
println(i) // 1, 2, 3, 4, 5
}
// 컬렉션 반복
val fruits = listOf("사과", "바나나", "오렌지")
for (fruit in fruits) {
println(fruit)
}
// 인덱스와 함께 반복
for ((index, fruit) in fruits.withIndex()) {
println("$index: $fruit")
}
// Map 반복
val map = mapOf("A" to 1, "B" to 2, "C" to 3)
for ((key, value) in map) {
println("$key = $value")
}
var count = 0
while (count < 5) {
println(count)
count++
}
do {
println("최소 한 번은 실행")
} while (false)
1..5
와 같은 식으로 범위를 만들 수 있습니다.
// 기본 범위
val range1 = 1..10 // 1부터 10까지 (10 포함)
val range2 = 1 until 10 // 1부터 9까지 (10 제외)
val range3 = 10 downTo 1 // 10부터 1까지 (역순)
val range4 = 1..10 step 2 // 1, 3, 5, 7, 9 (2씩 증가)
// 포함 여부 검사
val number = 5
if (number in 1..10) {
println("1부터 10 사이의 숫자입니다")
}
if (number !in 11..20) {
println("11부터 20 사이의 숫자가 아닙니다")
}
// 문자 범위
for (c in 'a'..'z') {
print(c) // abcdefghijklmnopqrstuvwxyz
}
코틀린의 예외 처리는 자바와 비슷하지만, 함수가 던질 수 있는 예외를 선언하지 않아도 됩니다.
fun divide(a: Int, b: Int): Int {
if (b == 0) {
throw IllegalArgumentException("0으로 나눌 수 없습니다")
}
return a / b
}
// 예외 처리
try {
val result = divide(10, 0)
println(result)
} catch (e: IllegalArgumentException) {
println("오류: ${e.message}")
} catch (e: Exception) {
println("예상치 못한 오류: ${e.message}")
} finally {
println("정리 작업")
}
// try를 식으로 사용
val result = try {
divide(10, 2)
} catch (e: Exception) {
-1 // 기본값
}