본문 바로가기

Kotlin

자바 개발자를 위한 코틀린 입문(Java to Kotlin Starter Guide) (2)

1. 코틀린에서 조건문을 다루는 방법

1. if문

if (조건) {
    // if문 조건을 통과했을 때 실행되는 로직
}

 

Java와 같다.

2. Expression과 Statement

if문 문법은 자바와 같지만 한가지 다른 점이 있다. 바로 Java에서 if-else는 Statement이지만, Kotlin에서는 Expression이다.

  • Statement : 프로그램의 문장, 하나의 값으로 도출되지 않는다.
  • Expression : 하나의 값으로 도출되는 문장

즉, Kotlin에서는 아래와 같이 if-else문 전체를 한번에 return 할 수 있다. if-else if-else문도 마찬가지!!

fun getPassOrFail(score: Int): String {
    return if (score >= 50) {
        "P"
    } else {
        "F"
    }
}

 

 

Java의 3항 연산자와 같다. 그렇기 때문에 Kotlin에서는 3항 연산자가 존재하지 않는다.

💡알아두면 좋은 팁
자바에서 사용했던 아래와 같은 조건문을 다음과 같이 쓸 수 있다.
(0 <= score && score <= 100) ----> (score in 0..100)

3. switch와 when

fun getGradeWithSwitch(score: Int): String {
    return when (score / 10) {
        9 -> "A"
        8 -> "B"
        7 -> "C"
        else -> "D"
    }
}

fun getGradeWithSwitch(score: Int): String {
    return when (score) {
        in 90..99 -> "A"
        in 80..89 -> "B"
        in 70..79 -> "C"
        else -> "D"
    }
}

fun startsWithA(obj: Any): Boolean {
    return when (obj) {
        is String -> obj.startsWith("A")
        else -> false
    }
}

 

Kotlin에서는 Java의 switch 대신 when을 사용하며 위와 같이 다양한 방법으로 사용이 가능하다.

2. 코틀린에서 반복문을 다루는 방법

1. for-each문 (향상된 for문)

// Java
List<Long> numbers = Arrays.asList(1L, 2L, 3L);
for (long number : numbers) {
    System.out.println(number);
}
// Kotlin
val numbers = listOf(1L, 2L, 3L)
for (number in numbers) {
    println(number)
}

2. 전통적인 for문

// Java
for (int i = 0; i <= 3; i++) {
    System.out.println(i);
}
// Kotlin
// 올라가는 경우
for (i in 1..3) {
    println(i)
}

// 내려가는 경우
for (i in 3 downTo 1) {
    println(i)
}

// 2씩 증가하는 경우
for (i in 1..5 step 2) {
    println(i)
}

3. while 문

자바의 while과 동일하다.

3. 코틀린에서 예외를 다루는 방법

1. try catch finally 구문

// Java
private int parseIntOrThrow(String str) {
    try {
    	return Integer.parseInt(str);
    } catch (NumberFormatException e) {
        throw new IllegalArgumentException(String.format("주어진 %s는 숫자가 아닙니다", str));
    }
}
// Kotlin
fun parseIntOrThrow(str: String): Int {
    try {
        return str.toInt()
    } catch (e: NumberFormatException) {
        throw IllegalArgumentException("주어진 ${str}는 숫자가 아닙니다")
    }
}

 

Java의 try-catch문과 문법이 같으며 if-else문와 마찬가지로 하나의 Expression으로 간주되기 때문에 try-catch문 자체를 return 할 수 있다. try-catch-finally 역시 문법이 동일하다.

2. Checked Exception과 Unchecked Exception

Kotlin에서는 Checked Exception과 Unchecked Exception을 구분하지 않는다. 모든 Exception은 Unchecked Exception!!

그렇기 때문에 Checked Exception의 경우 반드시 예외처리를 해줘야하는 Java와 달리 Kotlin은 예외처리를 하지 않아도 된다.

3. try with resources

try with resources란 try 구문이 끝났을 때 자동으로 사용한 외부자원을 닫아주는 기능으로 Java에서는 아래와 같이 사용한다.

 

// Java
public void readFile(String path) throws IOException {
    try (BufferedReader reader = new BufferedReader(new FileReader(path))) {
        System.out.println(reader.readLine);
    }
}

 

하지만 Kotlin에서는 이 try with resources 구문이 존재하지 않는다. 대신 아래와 같이 use라는 인라인 확장함수를 사용해야 한다.

 

// Kotlin
fun readLine(path: String) {
    BufferedReader(FileReader(path)).use { reader ->
        println(reader.readLine())
    }
}

4. 코틀린에서 함수를 다루는 방법

1. 함수 선언 문법

// Kotlin 함수
fun max(a: Int, b: Int): Int {
    return if (a > b) {
        a
    } else {
        b
    }
}

// 함수 중괄호 없애고 =을 쓸 수도 있다
fun max(a: Int, b: Int): Int =
    if (a > b) {
        a
    } else {
        b
    }
    
// 이렇게 한 줄로도 작성 가능
fun max(a: Int, b: Int): Int = if (a > b) a else b

 

접근지시어는 public이 디폴트로 생략되어 있으며 return 타입은 선언하지 않으면 unit이 생략되어 있다.

2. default parameter

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

 

만약 repeat 함수를 호출할 때 num와 useNewLine 파라미터를 전달하지 않으면 num에는 3, useNewLine에는 true가 default parameter로 전달된다.

3. named argument (parameter)

fun main() {
    repeat("Hello World", useNewLine = false)
}

 

위와 같이 num 파라미터는 디폴트 값인 3을 쓰고 싶고 useNewLine 파라미터만 false 값을 넘겨주고 싶다면 파라미터 이름을 통해 직접 지정해서 파라미터를 넘겨줄 수 있다.

단, Kotlin에서 Java 함수를 가져다 사용할 때는 named argument를 사용할 수 없다.

4. 같은 타입의 여러 파라미터 받기 (가변인자)

// Java
public static void main(String[] args) {
    String[] array = new String[]{"A", "B", "C"};
    printAll(array);
    printAll("A", "B", "C");
}

public static void printAll(String... strings) {
    for (String str : strings) {
        System.out.println(str);
    }
}
// Kotlin
fun main() {
    val array = arrayOf("A", "B", "C")
    printAll(*array)
    printAll("A", "B", "C")
}

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

 

Kotlin에서는 배열을 파라미터로 넘길 때 앞에 *를 붙여주어야 한다.