Chapter6. 코틀린 타입 시스템 (2)

김신영·2022년 10월 20일
0

kotlin-in-action

목록 보기
7/11
post-thumbnail

Primitive Type, Reference Type

  • Kotlin 에서는 Primitive Type, Wrapper Type을 구분하지 않는다.
  • Kotlin에서 Int 는 널이 될 수 없는 타입이므로, Java에서의 int 로 쉽게 컴파일 가능
  • 컬렉션의 타입 파라미터나 제너릭의 경우는, Java에서의 Wrapper 타입 Integer 으로 컴파일된다.

Any, Any? (최상위 타입)

  • toString , equals , hashCode 메소드가 기본 구현 되어있다.
  • Kotlin 내부에서 Any 타입은 java.lang.Object 에 대응
  • Java 메서드에서 Object 인자를 받거나 반환하면, Kotlin에서는 Any 타입으로 취급한다.
  • 더 정확히 말하면 널이 될 수 있는지 여부를 알 수 없는 플랫폼 타입 Any! 로 인식한다.
    ``

Unit (Kotlin의 void)

interface Processor<T> {  
    fun process(): T  
}  
  
class NoResultProcessor: Processor<Unit> {  
    override fun process() {  
	    // ...
    }  
}
  • Unit 타입에 속한 값은 단 하나 뿐이며, 그이름도 Unit 이다.
  • Unit 타입의 함수는 묵시적으로 return Unit 처럼 Unit 값을 반환한다.
  • 컴파일러가 묵시적으로 return Unit 을 넣어준다.

Nothing

  • Nothing 은 함수의 반환 타입이나 반환 타입으로 쓰일 타입 파라미터로만 쓸 수 있다.
  • Nothing이 반환 타입인 함수는 정상 종료되지 않음을 의미한다.
fun fail(message: String): Nothing {  
    throw IllegalStateException(message)  
}  
  
fun main(args: Array<String>) {  
    fail("Error occurred")  
}

// Exception in thread "main" java.lang.IllegalStateException: Error occurred

Kotlin Collection

Nullability & Collection

fun readNumbers(reader: BufferedReader): List<Int?> {  
    val result = ArrayList<Int?>()  
    for (line in reader.lineSequence()) {  
        val number = line.toIntOrNull()  
        result.add(number)  
    }  
    return result  
}

fun addValidNumbers(numbers: List<Int?>) {  
    val validNumbers = numbers.filterNotNull()  
    println("Sum of valid numbers: ${validNumbers.sum()}")  
    println("Invalid numbers: ${numbers.size - validNumbers.size}")  
}

fun main(args: Array<String>) {  
    val reader = BufferedReader(StringReader("1\nabc\n42"))  
    val numbers = readNumbers(reader)  
    addValidNumbers(numbers)  
}

// Sum of valid numbers: 43
// Invalid numbers: 1

Mutable & Immutable Collection

Collection TypeImmutableMutable
ListlistOfmutableListOf, arrayListOf
SetsetOfmutableSetOf, hashSetOf, linkedSetOf, sortedSetOf
MapmapOfmutableMapOf, hashMapOf, linkedMapOf, sortedMapOf
  • 자바 코드에서 정의한 타입을 코틀린 컴파일러는 플랫폼 타입으로 간주한다.

  • 컬렉션 타입이 Signature에 들어간 자바 메소드 구현을 할때, Kotlin에서 사용할 컬렉션 타입을 선택해야 한다.
    1. 컬렉션 자체가 널이 될 수 있는가?
    2. 컬렉션의 원소가 널이 될 수 있는가?
    3. 컬렉션이 Mutable한가?

Array, Primitive Array

fun main(args: Array<String>) {  
    println(arrayOf(1, 2, 3, 4).contentToString())  
    println(arrayOfNulls<Int>(5).contentToString())  
    println(Array(5) { it + 1 }.contentToString())  
  
    println(intArrayOf(1,2,3).contentToString())  
    println(IntArray(4).contentToString())  
    println(IntArray(5) { it * it }.contentToString())  
}

// [1, 2, 3, 4]
// [null, null, null, null, null]
// [1, 2, 3, 4, 5]

// [1, 2, 3]
// [0, 0, 0, 0]
// [0, 1, 4, 9, 16]

Collection to Array toTypedArray()

fun main(args: Array<String>) {  
    val strings = listOf("a", "b", "c")  
    println("%s/%s/%s".format(*strings.toTypedArray()))  
}

가변 인자 함수 vararg

vararg

fun main(args: Array<String>) {  
    println(customList(listOf(2, 3, 4)))  // 10
    println(customVarg(1, 2, 3))          // 7  
}  
  
  
fun customList(list: List<Int>) = customVarg(*list.toIntArray())  
  
fun customVarg(vararg args: Int) = customVararg2(1, *args)  
  
fun customVararg2(vararg args: Int) = args.sum()

Spread Operator *

  • 배열에 들어있는 값들과 다른 여러 값을 함께 인자로 전달해서 함수를 호출할 수 있다.
  • Array<T>, IntArray, LongArray, DoubleArray. ByteArray, CharArray, ShortArray FloatArray, StringArray, BooleanArray
  • 위와 같이 Array 에만 사용 가능
  • List 의 경우 toArray 메서드 적용 후, 사용 가능
fun main(args: Array<String>) {
	val list = listOf("args", *args)
	println(list)
}
profile
Hello velog!

0개의 댓글