Dev/Kotlin

코틀린 - 코틀린 타입 시스템 (정리)

healthyryu 2018. 9. 30. 19:05

코틀린 타입 시스템
(Kotlin In Action)



- 코틀린의 타입 시스템은 코드의 가독성을 향상시키는 데 도움이 되는 몇 가지 특성을 제공한다.

- 널이 될 수 있는 타입, 읽기 전용 컬렉션


?
- fun strLen(s: String) = s.length 일 경우, 해당 함수가 널과 문자열을 인자로 받을 수 있게 하려면 타입 이름 뒤에 물음표를 명시해야 한다.

fun strLen(s: String?)


?.
- 안전한 호출 연산자  -> null 검사메소드 호출을 한 번의 연상으로 수행하게 도와준다.


?:
- 엘비스 연산자 -> null 대신 사용할 디폴트 값을 지정할 때 편리하게 사용

fun foo(s: String?) {
    val t: String = s ?: " "
}


as?
- 안전한 캐스트 -> as 연산자는 지정한 타입으로 캐스팅을 해준다.
as? 연산자는 값을 대상 타입으로 변환할 수 없으면 null을 반환한다.

class DevuRyu {
    override fun equals(o: Any?): Boolean {
        val ob = o as? DevuRyu ?: return false
    }
}

-> equals() 함수로 파라미터의 타입이 DevuRuy 가 아니면 false 를 반환!!!


!!
- 널 아님 단언 -> 널이 아님을 단언하는 연산자를 사용해서 널이 될 수 있는 인자를 널이 될 수 없는 타입으로 변환한다.
파라미터가 null 일 수도 있지만 작성자가 감수하겠다는 의미이다.

fun ignoreNulls(s: String?) {
    val str: String = s!!
}


let 함수
- 안전한 호출 연산자와 함께 사용하면 원하는 식을 평가해서 결과가 널인지 검사한 다음에
그 결과를 변수에 넣는 작업을 같단한 식을 사용해 한꺼번에 처리할 수 있다.

fun sendEmailTo(email: String) {
    println("Sending email to $email")
}

>>> 실행
val email: String = "wlgnsdi@paran.com"
email?.let { sendEmailTo(it) }


플랫폼 타입
- 코틀린이 널 관련 정보를 알 수 없는 타입을 말한다.
해당 타입을 널이 될 수 있는 타입으로 처리해도 되고 널이 될 수 없는 타입으로 처리해도 된다.


원시 타입
- 코틀린은 원시 타입과 래퍼 타입을 구분하지 않고, 항상 같은 타입을 사용한다.


숫자변환
- 코틀린과 자바와 차이점 중 하나가 숫자를 자동으로 변환하지 않는다.

val i = 1
val l: Long = i <- type mismatch 컴파일 오류가 발생

val i = 1
val l: Long = i.toLong()


val x = 1
val list = listOf(1L, 2L, 3L)
x in list
컴파일도 하기전에 IDE 에서 타입에러로 붉게 칠해진다!!


val x = 1
val list = listOf(1L, 2L, 3L)
x.toLong() in list
결과값은 ture

코틀린에서는 타입을 명시적으로 변환해서 같은 타입의 값으로 만든 후 비교해야 한다.


Any
- 코틀린에서 모든 타입의 조상 타입

val answer: Any = 42


Unit
- 자바의 void 와 같은 내용을 반환하지 않는 함수의 타입


Nothing
- '반환 값' 이라는 개념 자체가 의미가 없는 함수!
정상적으로 끝나지 않고 예외를 던져서 실패시키는 역할이기에, 알고 활용해야 한다!


컬렉션

- 컬렉션은 null 이 가능하다. 그러나 컬렉션이 null 인지, 컬렉션의 원소가 null 인지는 다르다.

- 읽기 전용 컬렉션 Collection<T>, 변경 가능한 컬렉션 MutableCollection<T>


반응형