var number1: Long = 10L
과 같이 지정하는데 이 때 Primitive type 과 Reference type 타입을 구분하지 않는다. 이는, 코틀린이 내부적으로 Primitive를 사용할 지 Reference를 사용할지 정하기 때문이다. 즉, 프로그래머가 boxing/ unboxing을 고려하지 않아도 되도록 Kotlin이 알아서 처리 해준다.
// null이 아닌 경우에만 호출되는 Safe Call (?.) 이 있다
// ?: 연산자를 Elvis 라고 부르는데 이유는 ?:를 우측으로 90도 회전한 모양이
// Elvis라는 사람의 헤어스타일과 닮았기 때문이라고 한다.
// Elvis 연산자를 통해서 null 값일 경우 ?: 우측에 식을 실행시킨다.
// null이 절대 아닐때 사용할 수 있는 널 아님 단언 (!!) 이 있다.
// null일 경우 Exception을 발생한다.
fun startsWithA1(str: String?): Boolean {
return str?.startsWith("A")
?: throw IllegalArgumentException("null이 들어왔습니다.")
}
// null일 경우 null을 리턴 리턴 타입을 자세히 보면 Boolean?으로 되어있다.
fun startsWithA2(str: String?): Boolean? {
return str?.startsWith("A")
}
// null일 경우 false를 리턴
fun startsWithA3(str: String?): Boolean {
return str?.startsWith("A") ?: false
}
// 파라미터에 null을 허용할 수 없어 !!
fun startsWithA4(str: String?): Boolean {
return str!!.startsWith("A")
}
}
Java 기본 타입간의 변환은 암시적으로 이루어질 수 있다.
Kotlin 기본 타입간의 변환은 명시적으로 이루어져야 한다.
int number1 = 4;
long number2 = number1;
System.out.println(number1 + number2);
자바에서는 위와 같이 타입이 다른 두 변수를 연산할 경우 자동 타입 변환을 진행하지만 Kotlin 같은 경우 자동 타입 변환을 지원하지 않는다.
Java에서는 동일성에 == 를 사용, 동등성에 equals를 직접 호출
Kotlin에서는 동일성에 ===를 사용, 동등성에 ==를 사용하면 간접적으로 equals를 호출해준다.
간단하게 === 는 주소비교 == 는 값 비교