Kotlin) 시작해보기

박우영·2023년 10월 23일
1

자바/코틀린/스프링

목록 보기
34/35

왜 코틀린인가?

저는 Python (알고리즘) -> Java 를 거치며 학습했습니다. 파이썬은 간단한 알고리즘을 풀정도로 학습을 하였고 프로젝트나 개발을 Java로 시작하며 Java에 대해서 공부를하는데 Webflux같은 Reactive 프로그래밍을 하면서 주위에서 Kotlin이 좋다.. 코루틴을 써야한다 이런말을 정말 많이 들었습니다.
물론 저는 Java로 시작했기때문에 불편함을 느끼진 못했지만 간단한 코드를 보면 불필요한 코드가 줄고 성능으로도 거의 비슷하며 클린코드에 대해 공부하면서부터 코틀린을 배워보고 싶다는 생각을 하고있었습니다.

같은 JVM 위에서 동작하고, Java와 100퍼센트 호환이 된다는 점 이 시작하게 된 계기인것 같습니다. 물론 자바도 21 부터 문법이 간결해지는 부분도 있고 다양한 개발이 이루어지지만 코틀린, 코루틴을 학습해보며 어떠한 차이가 있는지 직접 사용해보며 비교해보고자 합니다.

변수

Java 에서는 변수는 크게 두가지로 나뉩니다. 기본타입과 참조타입이죠

Java

...생략
String str = "이건문자열";
int num = 1;

다음과 같이 선언을 해줘야 합니다. 물론 lombok 을 사용하면 var val을 사용할 수 있긴합니다.

Kotlin

class Main {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            var id = 1
            var name = "John"
            var num: Int = 10
            var age: Int
            age = 10
            val f = 10.0f
        }
    }
}

Kotlin 을 처음 사용해보기때문에 익숙하지만 낯선 그런느낌이 듭니다.
하지만 차이점을 보면 var 와 val을 앞에 선언해주면 타입추론 을 통해 유연하게 대응이 가능합니다. val은 Java 에서 final 과 유사하다고 생각이 듭니다 초기화 후 재 초기화 불가능 하다는 점 입니다. JavaScript 의 let 과 var 와 비슷한 느낌을 받았습니다.

또한 Kotlin 은 null safety 하기때문에 컴파일 과정에서 잡아줍니다.
nullable 하게 작성하고 싶다면 ? 를 사용하면 됩니다.
기존의 Java로 참조형 변수를 처리할때 NullPointerException 을 자주 겪으신 분이라면 유용할 것 같습니다

조건문

if 같은경우는 문법적으론 크게 다르지 않았지만 statement 와 expression 의 차이가 있습니다.

간단한 코틀린 코드로 예시를 보겠습니다.

Kotlin

class Main {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            var age: Int
            age = 10
//          expression
            val expression = if (age == 20) "Age is 20" else "Age is not 20"
            println(expression)
        }
    }
}

if 가 expression 으로 되어있기 때문에 다음과 같이 변수를 초기화 할때 사용 할 수 있습니다.

저는 이부분을 볼때 삼항연산자와 비슷한 느낌이라고 느껴졌습니다.

다음은 Java 의 Switch 와 코틀린의 when 입니다.

Java

public class Main {
    public static void main(String[] args) {
        Provider provider = Provider.BAEKJOON;
        switch (provider) {
            case GOOGLE -> System.out.println("GOOGLE");
            case NAVER -> System.out.println("NAVER");
            case KAKAO -> System.out.println("KAKAO");
        }

    }
}
enum Provider {
    GOOGLE,
    NAVER,
    KAKAO,
    GITHUB,
    BAEKJOON
}

먼저 Java 의 Enum 을 활용한 Switch 문 입니다. Java 13 이후에 바뀐 람다 표현식을 사용했습니다. 그 이전 Switch 를 사용하면 코틀린을 찬양하는 게시글이 될것 같아서..

Kotlin

class Main {
    companion object{
        @JvmStatic
        fun main(args: Array<String>) {
            var color = Color.RED
            var answer = when (color) {
                Color.RED -> "Richard"
                Color.ORANGE -> "Of"
                Color.YELLOW -> "York"
                Color.GREEN -> "Gave"
                Color.BLUE -> "Battle"
                Color.INDIGO -> "In"
                Color.VIOLET -> "Vain"
            }
            println(answer)
        }
    }
    enum class Color {
        RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET
    }
}

Java 의 Switch 를 람다 표현식으로 사용한다면 크게 차이는 없는 것 같습니다.
하지만 var answer 부분을 보면 알 수 있듯이 expression 으로 되어있네요

크게 차이를 못느끼겠다면 return 타입을 갖는 함수 형태로 다룬다면 차이가 느껴질 겁니다.
여기서 다루진 않겠지만 자바에선 하나하나 return 을 해줘야 하기때문이죠 이 부분이 statement 와 expression 차이라고 생각이 듭니다.

반복문

Kotlin

fun main(args:Array<String>) {
    for(i: Int in 1..10)
        print("$i ")    //output : 1, 2, 3, 4, 5 ... 10

    val len: Int = 5
    for(i in 1..len)
        print("$i ")    //output : 1, 2, 3, 4, 5

    for(i in 1 until len)
        print("$i ")    //output : 1, 2, 3, 4
    for(i: Int in 1..10 step(2))
	    print("$i ")    //output : 1, 3, 5, 7, 9
        
    val arr: IntArray = intArrayOf(10, 20, 30, 40, 50)

    for(i in arr)
        print("$i ")    //output : 10, 20, 30, 40, 50

    for(i in arr.reversed())
        print("$i ")    //output : 50, 40, 30, 20, 10
}

in 이 있어서 그런지 Python과 비슷한 느낌이 들었습니다.

Java

... 생략
for (int i = 0; i < 5; i++){
	System.out.println(i);
}
int[] arr = {1, 2, 3};
for (int a: arr){
	System.out.println(i);
}

약간의 문법적인 차이가 있는것을 제외하면 (... 해당숫자 포함, until, downTo , step) 딱히 다른점은 찾지 못했습니다.

while 은 다른점이 크게 없어 생략하였습니다

Java ? Kotlin?

코틀린 기본문법을 학습해보며 상당히 간단하고 개발할때 유용하겠다 싶은 기능도 물론 있습니다. 하지만 아직 코틀린을 활용하기엔 숙련도도 부족하기때문에 아 코드가 간결해지는 느낌이라고만 받았고 개발을 할때 Java로 하드코딩 하는것이 아닌 Spring Data JPA를 주로 사용하기 때문에 그 간결함도 덜하지 않을까 란 생각이 조금 드는것 같습니다.

Reference


Kotlin vs Java

0개의 댓글