타입 이름 뒤에 물음표(?) -> null 참조를 저장할 수 있다는 뜻
타입: 어떤 값들이 가능한지와 그 타입에 대해 수행할 수 있는 연산의 종류를 결정
?. : null 검사와 메소드 호출을 한 번의 연산으로 수행
s?.toUpperCase() // if (s != null) s.toUpperCase() else null 과 같음
엘비스 연산자(?:) : null 대신 사용할 디폴트 값을 지정할 때 사용하는 연산자
fun foo(s: String?) {
val t: String = s ?: "" // "s"가 null이면 결과는 빈 문자열
}
// 엘비스 연산자를 활용해 널 값 다루기
fun strLenSafe(s: String?) : Int = s?.length ?: 0
println(strLenSafe("abc")) // 3
println(strLenSafe(null)) // 0
as?: - 어떤 값을 지정한 타입으로 캐스트하는데, 값을 대상 타입으로 변환할 수 없으면 null을 반환
!! : null이면 NullPointerException 발생, 어떤 값이든 널이 될 수 없는 타입으로 강제로 바꿈
foo?.let { ...it... }
1) foo != null => it은 람다 안에서 널이 아니다.
2) foo == null => 아무 일도 일어나지 않는다.
// let을 사용해 null이 아닌 인자로 함수 호출하기
fun sendEmailTo(email: String) {
println("Sending email to $email")
}
var email: String? = "yole@example.com"
email?.let { sendEmailTo(it) } // Sending email to yole@example.com
email = null
email?.let { sendEmailTo(it) } // 아무일도 x
lateinit 변경자 : 프로퍼티를 나중에 초기화할 수 있음, 해당 프로퍼티는 항상 var이어야 함.
@Nullable + Type = Type?
@NotNull + Type = Type
[플랫폼 타입]
: 널 관련 정보를 알 수 없는 타입 => 널이 될 수 있는 타입으로 처리해도 되고, 널이 될 수 없는 타입으로 처리해도 됨
[상속]
코틀린에서 자바 메소드를 오버라이드할 때 그 메소드의 파라미터와 반환 타입을 널이 될 수 있는 타입으로 선언할지 널이 될 수 없는 타입으로 선언할지 결정해야 함
코틀린은 원시 타입과 래퍼 타입을 구분하지 않음
코틀린은 한 타입의 숫자를 다른 타입의 숫자로 자동 변환하지 x
val i = 1
val l: Long = i // 컴파일 오류 발생
val i = 1
val l: Long = i.toLong() // 변환 함수 사용
=> 명시적 변환이 필요
fun foo(l: Long) = println(l)
val b: Byle = l
val l = b + 1L
foo(42) // 42
Any 타입 : 모든 널이 될 수 없는 타입의 조상 타입(원시 타입을 포함한 모든 타입의 조상 타입)
Unit 타입: 자바 void와 같은 기능
Nothing 타입 - 아무 값도 포함하지 않음
fun fail(message: String) : Nothing {
throw IllegalStateException(message)
}
val address = company.address ?: fail("No address")
println(address.city)
List<Int?> : 리스트 안의 각 값이 널이 될 수 있음
List<Int>? : 전체 리스트가 널이 될 수 있음
컬렉션.filterNotNull() : 널이 될 수 있는 값으로 이뤄진 컬렉션에서 널 값을 걸러내는 함수
Collection : 읽기 전용 컬렉션
MutableCollection : 변경 가능한 컬렉션
[컬렉션 생성 함수]
컬렉션 타입 | 읽기 전용 타입 | 변경 가능 타입 |
List | listOf | mutableListOf, arrayListOf |
Set | setOf | mutableSetOf, hashSetOf, linkedSetOf, sortedSetOf |
Map | mapOf | mutableMapOf, hashMapOf, linkedMapOf, sortedMapOf |
코틀린에서 배열을 만드는 방법
val letters = Array<String>(26) { i -> ('a' + i ).toString() }
println(letters.joinToString(""))
toTypedArray() : 컬렉션을 배열로 바꿔줌
[원시 타입의 배열을 만드는 방법]