Language \ Framework/Kotlin(Android)

[Kotlin] 기본 문법 예제

구로모논 2025. 11. 23. 17:06

1. 함수

fun helloWorld(): Unit { 
 	// Unit -> void 와 같음. 
 	println("Hello World") 
} 

fun add(a: Int, b: Int): Int { 
	return a + b 
} 

// 아래처럼 축약 가능 
fun add(a: Int, b: Int): Int = a + b

 

2. 변수

기본적으로 val, var 변수가 있다.

타입 뒤에 ?를 붙여서 nullable 여부도 지정이 가능하다.

Nullable, NonNull에 대해서는 다른 글에서 설명

fun hi() {
    val a: Int = 10 // val은 변할 수 없음 - 상수
    var b: Int = 10 // var은 재대입 가능

    val c = 100 // type은 써주지 않아도 상관없음 - 자동 추론

    var nullableName: String? = null
    // var name: String = null -> ERROR!
    // 타입을 생략하면 null이 들어올 수 없음

    var nonNullName: String = "Daechan"
}

 

3. 문자열 템플릿

자바는 문자열 변수를 조합할 때, + 를 가지고 조합을 해서 가독성이 조금 떨어지고 오타 발생이 있는 편이었는데, 코틀린은 아래와 같이 사용가능해서 가독성, 사용성이 더 나은 편이다

fun strTemplate() {
    val name = "Daechan"
    val lastName ="Kang"

    val fullName = "$name $lastName" // 이렇게 사용 가능

    println(fullName)
}

 

4. 조건식

if 사용의 경우 자바와 크게 다른 것은 없는데, 더 다양하게 사용이 가능하다.

fun maxBy(a: Int, b: Int): Int {
    return if (a > b) {
        a
    } else {
        b
    }
}
// 위 내용을 아래와 같이 사용할 수 있다

fun maxBy(a: Int, b: Int) = if (a > b) a else b

// 변수에도 적용이 가능하다.
var number = if (true) 0 else 1

 

그리고, 자바에는 switch가 있다면, kotlin에는 when이 있다.

사용은 비슷하게 하는데, 자바는 단순 비교라면 코틀린은 조건 비교를 더 다양하게 할 수 있다.

 

fun checkNum(score: Int) {
    when (score) {
        0 -> println("this is 0")
        1 -> println("this is 1")
        2, 3 -> println("this is 2 or 3")
    }

    // 변수에 대입하여 사용할 경우 else는 필수이다
    var b = when (score) {
        1 -> 1
        2 -> 2
        else -> 3
    }

    // 아래는 범위 조건으로 when을 사용하는 방법이다
    when (score) {
        in 90..100 -> println("Excellent")
        in 10..80 -> println("Not bad")
        else -> println("Good")
    }
}

 

 

5. Array / List

fun array() {
    val array = arrayOf(1, 2, 3) // Array<Int>
    val list = listOf(1, 2, 3) // List<Int>

    // 코틀린의 배열은 다양한 타입이 들어갈 수 있다
    val array2 = arrayOf(1,"d", 2, 3) // Array<Any>
    val list2 = listOf(1, "2", 3L) // List<Any>

    // List 는 add, remove X

    var arrayList = arrayListOf(1, 2, 3)
    arrayList.add(10)
    arrayList.add(20)
    arrayList.remove(10)
    arrayList[0] = 11
}

 

array는 크게 다를것은 없고, List 객체가 조금 다른 점이 add, remove가 불가능하다.

그래서 ArrayList 객체를 사용하는데, 자바에서는 List의 구현체가 ArrayList라면, 코틀린은 아예 다르게 본다.

수정과 삭제가 필요한 배열일 경우 ArrayList를 사용한다.

그런데 보통은 ArrayList 보다 MutableList라는 객체 사용을 권장한다고 한다.

MutableList의 설명은 다른 글에서 설명할 예정

 

 

6. 반복문

반복문도 기본 틀 자체는 비슷하다.

다만 반복을 어떻게 할 것인지에 대한 표현이 다르다.

fun forAndWhile() {
    val students = arrayListOf("A", "B", "C", "D")

    for (name in students) {
        println(name)
    }

    // 아래처럼 구조 분해 가능
    for ((index, value) in students.withIndex()) {
        println("$index: $value")
    }

    var sum = 0
    // step은 건너뛸 수 ex) 1, 3, 5, 7, 9
    for (i in 1..10 step 2) {
        sum += i
    }

    println(sum)

    var index = 0
    while(index < 10) {
        println("current index: $index")
        index++
    }
}

 

7. 스코프 함수

스코프 함수는 객체를 특정 범위 내에서 다루기 쉽게 해주는 함수이다.

사용 시 문법 자체가 간소해진다.

하지만 너무 간소하다보니, 제대로 알지 않으면 조금 헷갈릴 수 있다.

 

아래는 대표적으로 사용되는 함수이고, 실제로는 더 많은 스코프함수가 존재한다.

각 함수별로 명칭의 의미를 가지고 있어서 동작하는 거는 어느정도 비슷해도 사용되는 상황이 다르다.

함수 참조방식 반환값 주용도
let it 블록 마지막 결과 값 변환, null-safe, 임시 범위
also it 원래 객체 부가작업(logging, 디버깅), 체이닝
apply this 원래 객체 객체 초기화, 설정(builder)
run this 블록 마지막 결과 객체 가공 후 결과 반환
with this 블록 마지막 결과 이미 있는 객체를 블록에서 여러 번 다룰 때
data class User(var name: String, var age: Int)

fun main() {
    val user = User("Alice", 20)

    // 1) let - 변환/가공, it 키워드 사용
    val nameLength = user.let {
        println("이름은 ${it.name}")
        it.name.length   // 반환: Int
    }
    println("nameLength = $nameLength")

    // 2) also - 부가작업(side effect), 원래 객체 반환, it 키워드 사용
    val user2 = user.also {
        println("로그: $it")  // 로깅
    }
    println("user2 = $user2")

    // 3) apply - 초기화/설정, 원래 객체 반환, this 사용(생략가능)
    val user3 = User("", 0).apply {
        name = "Bob"
        age = 25
    }
    println("user3 = $user3")

    // 4) run - 가공해서 결과 반환, this 사용(생략가능)
    val intro = user.run {
        "안녕하세요, 제 이름은 $name이고, 나이는 $age살입니다."
    }
    println(intro)

    // 5) with - 이미 있는 객체에 대해 여러 작업, this 사용(생략가능)
    val result = with(user) {
        println("User 이름: $name, 나이: $age")
        age + 10  // 반환: Int
    }
    println("10년 후 나이 = $result")
}

 

8. 코루틴 기본

코루틴은 코틀린에서 비동기처리를 가능하게 해주며, 중단(suspend)과 재개(resume)가 가능하다는 특징이 있다.

suspend fun fetchUser(): User {
    delay(1000)  // 여기서 코루틴이 중단 후 1초 뒤 다시 재개한다.
    return User("Alice", 20)
}

fun main() = runBlocking {
    println("시작")
    val user = fetchUser()   // suspend 함수 호출 가능
    println("결과: $user")
}

 

suspend 함수는 코루틴 스코프 안에서만 실행 가능하며, delay, await 같은 함수를 사용하는 지점이 중단 지점이 된다.