Kotlin 톺아보기

KangWook·2025년 7월 27일
0

kotlin

목록 보기
1/2

1. 함수 정의와 변수 선언

함수 정의

  • 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     // 컴파일 에러!

2. 문자열 템플릿

문자열 템플릿을 사용하면 문자열 연결 없이도 코드가 간결해집니다.

  • 변수 이름 앞에 $를 붙이거나
  • 식을 ${}로 둘러싸면 변수나 식의 값을 문자열에 삽입할 수 있습니다.
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원

3. 데이터 클래스 (값 객체 클래스)

코틀린에서는 값 객체 클래스를 아주 간결하게 표현할 수 있습니다.

// 기본 데이터 클래스
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 자동 구현)

4. if문 (식으로서의 if)

다른 언어와 달리 코틀린의 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 "오프라인"

5. when문 (강력한 switch)

코틀린의 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"
}

6. 스마트 캐스팅 (Smart Casting)

어떤 변수의 타입을 검증하고 나면 굳이 명시적으로 캐스팅하지 않아도 됩니다.
컴파일러가 자동으로 타입 변환을 해줍니다.

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
}

7. 반복문 (for, while, do-while)

for문

자바의 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")
}

while과 do-while

var count = 0
while (count < 5) {
    println(count)
    count++
}

do {
    println("최소 한 번은 실행")
} while (false)

8. 범위 (Range)

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
}

9. 예외 처리

코틀린의 예외 처리는 자바와 비슷하지만, 함수가 던질 수 있는 예외를 선언하지 않아도 됩니다.

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  // 기본값
}
profile
꾸준히 성장하는 개발자

0개의 댓글