ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 3강. 코틀린에서 Type을 다루는 방법
    BackEnd/Kotlin 2024. 1. 30. 22:00
    반응형
    1. 기본 타입
    2. 타입 캐스팅
    3. Kotlin의 3가지 특이한 타입
    4. String Interpolation, String indexing

     

    기본 타입

      Kotlin에도 Java와 동일하게 다음과 같은 타입들이 존재합니다.

    • Byte, Short, Int, Long Float, Double, 부호 없는 정수들

     

      Kotlin에서는 선언된 기본값을 보고 타입을 추론합니다.

    val number1 = 3    // Int
    val number2 = 3L   // Long
    val number3 = 3.0f // Float
    val number4 = 3.0  // Double

     

      기본 타입간 변환은 Java와 Kotlin이 상이합니다.

    • Java: 암시적
    • Kotlin: 명시적
    // Java
    int number1 = 4;
    long number2 = number1; // 암시적 형변환
    
    // Kotlin
    val number1 = 4;
    // val number2: Long = number1 // Type mismatch
    val number2: Long = number1.toLong() // 명시적 형변환(to기본타입)

     

      변수가 nullable이라면 적절한 처리가 필요합니다. (Safe Call과 Elvis 연산자) 

    val number1: Int? = 3
    val number2: Long = number1?.toLong() ?: 0L

     

    타입 캐스팅

      기본 타입이 아닌 일반 타입에 대한 타입 캐스팅입니다.

    • value is Type: value가 Type이면 true, 아니면 false
    • value !is Type: value가 Type이면 false, 아니면 true
    • value as Type: value가 Type이면 Type으로 타입 캐스팅, 아니면 예외 발생
    • value as? type: value가 Type이면 Type으로 타입 캐스팅, value가 null이거나 Type이 아니면 null

     

      다음은 Java 코드입니다.

      public static void printAgeIfPerson(Object obj) {
        if (obj instanceof Person) {
          Person person = (Person) obj;
          System.out.println(person.getAge());
        }
      }

     

      위의 코드를 Kotlin으로 작성하면 다음과 같습니다.

    fun printAgeIfPerson(obj: Any) {
        if (obj is Person) { // is: Java의 instanceof
            val person = obj // as Person(생략가능): Java의 (Person) obj
            println(person.age)
        }
    }
    
    // 스마트 캐스트
    fun printAgeIfPerson(obj: Any) {
        if (obj is Person) {
            println(obj.age) // 스마트 캐스트: if 절에서 타입 체크를 수행하여 컴파일러가 해당 타입으로 인지
        }
    }

     

      nullable일 경우, 다음과 같이 처리합니다.

    fun printAgeIfPersonNullable(obj: Any?) {
        val person = obj as? Person
        println(person?.age)
    }

     

    Kotlin의 특이한 타입 3가지

    Any

    • Java의 Object 역할(모든 객체의 최상위 타입)
    • 모든 Primitive Type의 최상위 타입도 Any
    • nullable일 경우, Any?로 표현
    • Any에 equals / hashCode / toString 존재

     

    Unit

    • Java의 void와 동일한 역할
    • void와 다르게 Unit은 그 자체로 타입 인자로 사용 가능
    • Unit은 실제 존재하는 타입이라는 것을 표현(함수형 프로그래밍에서 Unit은 단 하나의 인스턴스만 갖는 타입을 의미)

     

    Nothing

    • 함수가 정상적으로 끝나지 않았다는 사실을 표현하는 역할
    • 무조건 예외를 반환하는 함수, 무한 루프 함수 등
    fun fail(message: String): Nothing {
      throw IllegalArgumentException(message)
    }

     

    String interpolation / String indexing

      Java에서는 String.format 또는 StringBuilder의 append를 통해 문자열을 동적으로 가공합니다. Kotlin에서는 ${변수} 를 사용합니다.

        val person = Person("Kotlin", 100)
        // Java: System.out.println(String.format("이름: %s", person.name))
        println("이름: ${person.name}")

     

      변수 이름만 사용하는 경우, 중괄호를 생략할 수 있습니다. 그러나, 1) 가독성, 2) 일괄 변환, 3) 정규식 활용 측면을 고려하여 ${변수} 사용을 권장합니다.

     

    Text Blocks

      여러 문자열을 작성해야 할 경우, 큰따옴표 세 개(""")를 사용하면 됩니다. (Java 15 Text Blocks)

        var str = """
            ABC
            EFG
            
        """.trimIndent()
        println(str)

     

    특정 문자 가져오기

    // Java
    String str = "ABCDE";
    char ch = str.charAt(1);
    
    // Kotlin
    val str = "ABCDE"
    val ch = str[1]

     

     

     

    감사합니다.

    반응형

    댓글

Designed by Tistory.