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

이진호·2023년 5월 21일
0

logs

목록 보기
3/4
post-thumbnail

코틀린에서 변수와 타입, 연산자를 다루는 방법

코틀린에서 변수를 다루는 방법

  • 모든 변수는 var/val을 붙여 주어야 한다.
    • var: 변경 가능 / val: 변경 불가능 (read-only)
  • 타입을 명시적으로 작성하지 않아도, 타입이 추론된다.
  • Primitive Type과 Reference Type을 구분하지 않아도 된다.
  • Null이 들어갈 수 있는 변수는 타입 뒤에 ?를 붙여주어야 한다.
    • 아예 다른 타입으로 간주된다.
  • 객체를 인스턴스화 할 때 new를 붙이지 않아야 한다.

코틀린에서 null을 다루는 방법

  • 코틀린에서 null이 들어갈 수 있는 타입은 완전히 다르게 간주된다.
    • 한 번 null 검사를 하면 non-null임을 컴파일러가 알 수 있다.
  • null이 아닌 경우에만 호출되는 Safe Call(?.)이 있다.
  • null인 경우에만 호출되는 Elvis 연산자(?:)가 있다.
  • null이 절대 아닐때 사용할 수 있는 널 아님 단언(!!)이 있다.
  • Kotlin에서 Java코드를 사용할 때 플랫폼 타입 사용에 유의해야 한다.
    • Java 코드를 읽으며 널 가능성 확인 / Kotlin으로 wrapping

코틀린에서 Type을 다루는 방법

  • 코틀린의 변수는 초기값을 보고 타입을 추론하며, 기본 타입들 간의 변환은 명시적으로 이루어진다.
  • 코틀린에서는 is, !is, as, as?를 이용해 타입을 확인하고 캐스팅한다.
  • 코틀린의 Any는 Java의 Object와 같은 최상위 타입이다.
  • 코틀린의 Unit은 Java의 void와 동일하다.
  • 코틀린에 있는 Nothing은 정상적으로 끝나지 않는 함수의 반환을 의미한다.
  • 문자열을 가공할때 ${변수}""" """를 사용하면 깔끔한 코딩이 가능하다.
  • 문자열에서 문자를 가져올 때 Java의 배열처럼 []를 사용한다.

코틀린에서 연산자를 다루는 방법

  • 단항연산자, 산술연산자, 산술대입연산자 Java와 똑같다~
  • 비교 연산자 사용버도 Java와 똑같다~
    • 단, 객체끼리도 자동 호출되는 compareTo를 이용해 비교 연산자를 사용할 수 있다.
  • in, !in / a..b / a[i] / a[i] = b와 같이 코틀린에서 새로 생긴 연산자도 있다.
  • 객체끼리의 연산자를 직접 정의할 수 있다.

코틀린에서 코드를 제어하는 방법

코틀린에서 제어문을 다루는 방법

  • if / if -else / if -else if - else 모두 Java와 문법이 동일하다.
  • 단 Kotlin에서는 Expression으로 취급된다.
    • 때문에 Kotlin에서는 삼항 연산자가 없다.
  • Java의 switch는 Kotlin에서 when으로 대체되었고, when은 더 강력한 기능을 갖는다.

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

  • for each 문에서 Java는 : Kotlin은 in 을 사용한다.
  • 전통적인 for문에서 Kotlin은 등차수열과 in을 사용한다.
  • 그 외의 for문 문법은 모두 동일하다.
  • while문과 do while문은 더욱더 놀랍도록 동일하다.

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

  • try catch finally 구문은 문법적으로 완전히 동일하다.
    • Kotlin에서는 try catch가 expression이다.
  • Kotlin에서 모든 예외는 Unchecked Exception이다.
  • Kotlin에서는 try with resources 구문이 없다. 대신 코틀린의 언어적 특징을 활용해 close를 호출해준다.

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

  • 함수의 문법은 Java와 다르다!

    접근지시어 fun 함수이름(파라미터): 반환타입 {
    
    }
  • body가 하나의 값으로 간주되는 경우 block을 없앨 수도 있고, block이 없다면 반환 타입을 없앨 수도 있다.

    fun max(a: Int, b: Int): Int = if (a > b) a else b
    
    fun max(a: Int, b: Int) = if (a > b) a else b
  • 함수 파라미터에 기본값을 설정해줄 수 있다.

  • 함수를 호출할 때 특정 파라미터를 지정해 넣어줄 수 있다.

  • 가변인자에는 vararg 키워드를 사용하며, 가변인자 함수를 배열과 호출할 때는 *를 붙여주어야 한다.

코틀린에서의 OOP

코틀린에서 클래스를 다루는 방법

  • 코틀린에서는 필드를 만들면 getter와 (필요에 따라) setter가 자동으로 생긴다.
    • 때문에 이를 프로퍼티 라고 부른다.
    class Person(
      name: String = "최태현",
      var age: Int = 1
    )
  • 코틀린에서는 주생성자가 필수이다.
  • 코틀린에서는 constructor 키워드를 사용해 부생성자를 추가로 만들 수 있따.
    • 단, default parameter나 정적 팩토리 메소드를 추천한다.
  • 실제 메모리에 존재하는 것과 무관하게 custom getter와 custom setter를 만들 수 있따.
  • custom getter, custom setter에서 무한루프를 막기 위해 field라는 키워드를 사용한다.
    • 이를 backing field 라고 부른다.

코틀린에서 상속을 다루는 방법

  • 상속 또는 구현을 할 때에 : 를 사용해야 한다.
  • 상위 클래스 상속을 구현할 때 생성자를 반드시 호출해야 한다.
  • override를 필수로 붙여야 한다.
  • 추상 멤버가 아니면 기본적으로 오버라이드가 불가능하다.
    • open을 사용해야 한다.
  • 상위 클래스의 생성자 또는 초기화 블록에서 open 프로퍼티를 사용하면 얘기치 못한 버그가 생길 수 있다.

코틀린에서 접근 제어를 다루는 방법

  • Kotlin에서 패키지는 namespace 관리용이기 때문에 protected의 의미가 달라졌다.
  • Kotlin에서는 default의 의미가 사라지고, 모듈간의 접근을 통제하는 internal이 새로 생겼다.
  • 생성자에 접근 지시어를 붙일 때는 constructor를 명시적으로 써주어야 한다.
  • 유틸성 함수를 만들 떄는 파일 최상단을 이용하면 편리하다.
  • 프로퍼티의 custom setter에 접근 지시어를 붙일 수 있다.
  • Java에서 Kotlin 코드를 사용할 때 internal과 protected는 주의해야 한다.

코틀린에서 object 키워드를 다루는 방법

  • Java의 static 변수와 함수를 만드려면, Kotlin에서는 companion object를 사용해야 한다.
  • companion object도 하나의 객체로 간주되기 때문에 이름을 붙일 수 있고, 다른 타입을 상속받을 수도 있다.
  • Kotlin에서 싱글톤 클래스를 만들 때 object 키워드를 사용한다.
  • Kotlin에서 익명 클래스를 만들 때 object : 타입을 사용한다.

코틀린에서 중첩 클래스를 다루는 방법

  • 클래스 안에 클래스가 있는 경우 종류는 두 가지 였다.
    • (Java기준) static을 사용하는 클래스
    • (Java기준) static을 사용하지 않는 클래스
  • 권장되는 클래스는 static을 사용하는 클래스이다.
  • 코틀린에서는 이러한 가이드를 따르기 위해
    • 클래스 안에 기본 클래스를 사용하면 바깥 클래스에 대한 참조가 없고
    • 바깥 클래스를 참조하고 싶다면, inner 키워드를 붙여야 한다.
  • 코틀린 inner class에서 바깥 클래스를 참조하려면 this@바깥클래스를 사용해야 한다.

코틀린에서 다양한 클래스를 다루는 방법

  • Kotlin의 Data class를 사용하면 equals, hashCode, toString을 자동으로 만들어준다.
  • Kotlin의 Enum Class는 Java의 Enum Class와 동일하지만, when과 함께 사용함으로써 큰 장점을 갖게 된다.
  • Enum Class보다 유연하지만, 하위 클래스를 제한하는 Sealed Class 역시 when과 함께 주로 사용된다.

코틀린에서의 FP

코틀린에서 배열과 컬렉션을 다루는 방법

  • 배열의 사용법이 약간 다르다!

    val array = arrayOf(100, 200)
    
    for (i in array.indices) {
      println("${i} ${array[i]}")
    }
    
    for ((idx, value) in array.withIndex()) {
      println("${i} ${value}")
    }
  • 코틀린에서는 컬렉션을 만들 때도 불변/가변을 지정해야 한다.

  • List, Set, Map에 대한 사용법이 변경, 확장되었다.

  • Java와 Kotlin 코드를 섞어 컬렉션을 사용할 때에는 주의해야 한다.

    • Java에서 Kotlin 컬렉션을 가져갈 때는 불변 컬렉션을 수정할 수도 있고, non-nullable 컬렉션에 null을 넣을 수도 있다.
    • Kotlin에서 Java 컬렉션을 가져갈 때는 플랫폼타입을 주의해야 한다.

출처

0개의 댓글