코틀린 타입 시스템
(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>
'Dev > Kotlin' 카테고리의 다른 글
코틀린 - 연산자 오버로딩과 기타 관례 (요약) (0) | 2018.10.09 |
---|---|
코틀린 - 코틀린 타입 시스템 (요약) (0) | 2018.09.30 |
코틀린 - 람다로 프로그래밍(요약) (0) | 2018.09.27 |
코틀린 - 클래스, 객체, 인터페이스(요약) (0) | 2018.09.25 |
커니의 코틀린 - 3장 (데이터 클래스) (0) | 2018.07.16 |