Study/kotlin

[코틀린 프로그래밍] Chapter.02 Java의 개발자를 위한 코틀린 필수 사항

에디개발자 2021. 3. 29. 07:00
반응형

나를 닮았다고 한다...

목표

  • 숫자와 문자열 변수 정의하기
  • 상수 만들기
  • 타입 명시하기
  • 계산 결과를 이용해 문자열 표현식 만들기
  • 멀티라인 문자열 만들기

이번 챕터에서는 자바 개발자들은 코틀린이 가진 뉘앙스를 배우는 동안에는 자바에서 사용하던 버릇을 잊어야합니다.

 

코드량 Java >> Kotlin

세미클론

Kotlin은 자바에 비해 많은 것들이 선택적입니다. 대표적인 예로 모든 표현식이나 명령문 마지막에 세미클론(;)을 생략되었습니다.

// Java
int a = 3 * 6;

// Kotlin
val a = 3 * 6

 

변수타입

코틀린은 정적 타입 언어입니다. 모든 변수를 선언할 때 타입을 지정해야하는 것은 아니지만 일반적으로는 지정을 해야합니다. 타입이 지정된 변수는 컴파일 시점에 검증됩니다.

fun main() {
    val greet = "hello";  // 변수 타입 지정
    
    println(greet)
    
    greet = 0  // String type에 Int 타입을 주입하려하면 에러발생  
}

 

클래스, 함수

자바와는 다르게 코틀린은 명령문이나 표현식이 메소드에 속할 필요가 없고 메소드는 클래스에 속할 필요가 없습니다. 밑의 코드처럼 메소드, 클래스가 없는 파일도 실행이 가능합니다.

package programming.part1.essence

println("hello")

 

try-catch

자바 컴파일러는 명시적 예외(Checked Exception)를 처리(catch)하거나 던져(throw)야한다. 하지만 코틀린은 checked, unchecked 모두 예외처리가 강제되지 않습니다. 만약 예외가 발생하면 자동으로 해당 함수를 호출한 함수 또는 호출한 코드로 전달됩니다. 그리고 예외를 핸들링하지 않았다면 프로그램이 종료됩니다.

println("start")
Thread.sleep(1000)
println("finish")

 

현명한 경고

코틀린 컴파일러는 코드 안의 다양한 잠재적 문제를 찾아냅니다.

fun test(n:Int) = 0  // paramter 'n'을 사용하지 않는다는 경고 발생!

println(test(1))

만약 경고를 오류처럼 다루고 싶다면 옵션을 설정하여 실행하면 됩니다.

kotlinc-jvm -Werror -script test.kts

 

val > var

var와 val의 차이점은 뮤터블이나 이뮤터블이냐입니다. 즉 변경 가능 여부입니다. 자바 코드와 비교하면 아래와 같습니다.

// Java
final int a = 1;
int b = 2;

// Kotlin
val a = 1
var b = 2

변수를 선언할 때는 var(뮤터블) 보다는 val(이뮤터블)을 선언하는게 좋습니다. 

 

동일성 체크

  • 값은 Java에서 equals() 메소드로 비교했다면 Kotlin에서는 '=='로 비교합니다.
  • 참조는 Java에서 '==' 비교했다면 Kotlin에서는 '==='로 비교합니다

여기서 Kotlin의 장점은 Java에서 equals()로 비교할때 비교할 대상이 null이면 NullPointExcetpion을 발생시킵니다. 하지만 Kotlin은 null 일 경우 false를 반환합니다. 코틀린의 연산자는 null을 안전하게 다루고 있습니다.

println("hi" == "hi")  //true
println("hi" == "Hi")  //false
println(null == "hi")  //false
println("hi" == "hi")  //true
println(null == null)  //true

 

문자열 템플릿

이 부분에서도 Kotlin의 강점이 드러납니다. 자바와 비교해보도록 하겠습니다.

// Java
final String message = "Success";

System.print.out("Customer Status is" + message + " !!!")

// Kotlin
val message = "Success"

println("Customer Status is $message !!!

자바에서 + + + ... 할 필요없이 '$'을 작성하고 뒤에 변수 명을 적어주면 됩니다.

 

RAW 문자열

이스케이프 방식을 raw 문자열 방식으로 작성할 수 있게되었습니다.

이스케이프??
  - Bye Bye... (\" |")
RAW 문자열?
  - Hello """ """
val name = "Eve"

val memo = """Dear $name, a quick reminder about the
party we gave scheduled next Tue
'Low Ceredf | Please....
"""

println(memo)

// 이스케이프 바이바이 \" \"
// RAW 문자열 """ """

fun createMemoFor(name: String): String {
    if (name == "eee") {
        val memo = """asdfasfasdfasdfasdf
        asdfasdfasdf
        sadfasdfasdfasdfasdf"""
        return memo
    }
    return ""
}

println(createMemoFor("eee"))

fun createMemoFor2(name: String): String {
    if (name == "eee") {
        val memo = """asdfasfasdfasdfasdf
        | asdfasdfasdf
        | sadfasdfasdfasdfasdf"""
        return memo.trimMargin()
    }
    return ""
}

println(createMemoFor2("eee"))

위 코드처럼 작성이 가능해졌습니다!!

 

표현식 > 명령문

명령문은 아무것도 리턴하지 않고 부작용도 가지고 있습니다. 상태가 변하고, 변수를 변하게 하고, 파일을 작성하고, 데이터베이스를 업데이트를 오염시키는 것 등이 포함되어있습니다. 그리하여 명령문보다는 표현식이 좋습니다. 표현식은 결과를 리턴하고 어떤 상태도 변경하지 않습니다.

// java라면 아래와 같이 명령문으로 작성해아한다.
fun javaType(name: String, age: Int): String {
    var status: String
    if (age < 17) {
        status = "어려"
    } else {
        status = "많아"
    }

    return "$name, $status"
}

println(javaType("날세", 20))

// Kotlin은 if문을 표현식으로 작성한다.
fun kotlinTye(name: String, age: Int): String {
    val status = if (age < 17) "어려" else "많아"
    return "$name, $status"
}

println(kotlinTye("또 날세", 21))

// try catch 도 마찬가지다..
fun kotlinTypeException(status: Boolean): Int {
    return try {
        if (status) {
            throw RuntimeException()
        }
        1
    } catch (e: Exception) {
        2
    }
}

println(kotlinTypeException(true))
println(kotlinTypeException(false))

 

정리

  • 관용적인 코드 대부분을 삭제
  • 같은 작업을 한다면 다른 언어들보다 훨씬 적응 타이핑으로 가능
  • 세미콜론은 Optional, 변수 선언할 때는 타입 추론 사용
  • 오류로부터 개발자를 보호.? 현명한 경고를 해준다.
  • 변수의 이뮤터빌리티와 뮤터빌리티를 미리 선택하기 때문에 안정성 향상
  • 비교할 때 NPE가 발생하지 않는다.
  • 명령문보다는 표현식을 제공
반응형