Lewis's Tech Keep

[Kotlin] 코틀린 적응기 - 제어문, 반복문, 예외, 함수 본문

Kotlin/Kotlin 적응기

[Kotlin] 코틀린 적응기 - 제어문, 반복문, 예외, 함수

Lewis Seo 2024. 9. 30. 12:48

시작

구문에 대해 배우는 파트였다.

java에서 조건문이 statement였다면 kotlin에서는 expression으로 사용되는 점이 closure를 썼던 typesciprt를 떠올리게 했다. 

컨셉이 재밌고 적응하면 코드량이 얼마나 줄어들지 궁금하다.

하지만 줄이기 위해 접근이 쉬워진 부분이라던지 이런 부분들에 대한 궁금증도 생겼다.

 

배우고 있는 것

https://www.inflearn.com/course/java-to-kotlin

 

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) 강의 | 최태현 - 인프런

최태현 | 이 강의를 통해 Kotlin 언어의 특성과 배경, 문법과 동작 원리, 사용 용례, Java와 Kotlin을 함께 사용할 때에 주의할 점 등을 배울 수 있습니다., 요즘 대세인 코틀린을 공부하고 싶다면?⭐ J

www.inflearn.com

 

 

1. 제어문

기본적으로 if를 사용하여 제어를 하는 것은 같다.

fun validateScoreIsNotNegative(score: Int) {
    if (score < 0) {
        throw IllegalArgumentException("error")
    }
}

 

for loop 처럼 사용하기 위해 .. 을 사용하여 범위를 지정 해줄 수 있다. 

범위는 이상 이하로 설정된다.

fun validateScoreNotInRange(score: Int) {
    if (score in 0..100) {
        throw IllegalArgumentException("error")
    }
}

 

 

kotlin에서는 조건문이 expression으로 취급되기 때문에 하나의 반환 값처럼 사용할 수 있다. 

따라서 return 후에 조건문으로 예시와 같이 사용할 수 있다.

// expression
fun getPassOrFail(score: Int): String {
    return if (score > 90) {
        "P"
    } else {
        "F"
    }
}

// expression
fun getGrade(score: Int): String {
    return if (score > 90) {
        "A"
    } else if (score > 80) {
        "B"
    } else {
        "F"
    }
}

 

swtich when 과 같은 구문을 사용하고 싶은 경우에는 when {  else -> } 로 해줄 수 있다.

// switch
fun getGradeWithSwitch(score: Int): String {
    return when (score) {
        in 91..99 -> "A"
        in 81..90 -> "B"
        else -> "F"
    }
}

// when condition
fun judgeNumber(number: Int) {
    when {
        number == 0 -> println("숫자가 0입니다")
        number % 2 == 0 -> println("짝수 입니다.")
        else -> println("홀수 입니다.")
    }
}



2. 반복문

반복문은 in 으로 foreach 와 같이 표현할 수 있다.

fun main() {
    val numbers = listOf(1L, 2L, 3L)
    for (number in numbers) {
        println(number)
    }
}

 

또한 in 1..3 과 같이 범위를 설정하면 index를 이용한 반복문도 표현이 가능하다.

fun main() {
    // index
    for (i in 1..3) {
        println(i)
    }
}

 

역순으로 하고 싶은 경우 downTo 키워드를 .. 대신에 넣어준다.

fun main() {
    // reverse order
    for (i in 3 downTo 1) {
        println(i)
    }
}

 

i를 2개씩 뛰어넘고 싶은 경우에 step 키워드를 넣어준다.

fun main() {
    // multiple steps
    for (i in 1..5 step 2) {
        println(i)
    }
}

 

while 구문은 기존에 알고 있는 것과 거의 동일, 단 변수가 가변하기 때문에 var로 설정해준다.

fun main() {
    // while
    var i = 1
    while (i <= 3) {
        println(i)
        i++
    }
}

 

3. 예외

 

예외처리는 try catch finally 를 활용할 수도 있다.

또한 try with resources를 통해 예외처리를 하는 것도 가능하다.

fun main() {
    parseIntOrThrow("1")
    parseIntOrThrow("")
}

// try catch finally
fun parseIntOrThrow(str: String): Int {
    try {
        return str.toInt()
    } catch (e: NumberFormatException) {
        throw IllegalArgumentException("error")
    } finally {
        println("finally")
    }
}

import java.io.BufferedReader
import java.io.File
import java.io.FileReader

class FilePrinter {

    // no throws
    fun readFile() {
        val currentFile = File(".")
        val file = File(currentFile.absolutePath + "/a.txt")
        val reader = BufferedReader(FileReader(file))
        println(reader.readLine())
        reader.close()
    }

    // try with resources
    fun readFile(path: String) {
        BufferedReader(FileReader(path)).use { reader ->
            println(reader.readLine())
        }
    }
}

 

4. 함수

함수 설정 시 named parameter를 활용하여 builder패턴에서 하던 것을 대체할 수 있다.

fun main() {
    // named parameter
    repeat("hihi", useNewLine = true)

    // named parameter replace builder pattern
    printNameAndGender(name = "a", gender = "M")
}

fun printNameAndGender(
    name: String,
    gender: String
) {
    println(name)
    println(gender)
}

 

함수 중괄호 뿐만 아니라 단일 return 값 일 경우 = 으로 expression으로 사용하는 것도 가능하다.

fun main() {
	max(1, 2)
}

// {} to =
// 하나의 결과 값일 때 가능
// 반환 타입도 추측이 가능하기 떄문에 ㅅ애략 가능
fun max(a: Int, b: Int) = if (a > b) a else b

 

또한 default parameter를 설정하면 생성자 생성 시 값이 없는 경우에 기본 값으로 생성되게 할 수 있다.
(좋은건지는 조금 고민이 되는 부분이다.)

fun main() {
    repeat("hihi")
}

// default parameter
fun repeat(
    str: String,
    num: Int = 3,
    useNewLine: Boolean = true
) {
    for (i in 1..num) {
        if (useNewLine) {
            println(str)
        } else {
            print(str)
        }
    }
}

 

가변 인자를 이용하고 싶다면 vararg를 이용하여 설정해준다 (java 파라메터에 ...과 같음)

fun main() {
    // 가변 인자
    printAll("A", "B", "C")

    val array = arrayOf("A", "B", "C")
    printAll(array)
}

fun printAll(strings: Array<String>) {
    for (str in strings) {
        println(str)
    }
}

fun printAll(vararg strings: String) {
    for (str in strings) {
        println(str)
    }
}

 

 

Comments