널이란 객체가 선언되었지만 초기화되지 않은 상태를 의미.
객체는 데이터가 저장된 주소를 참조하므로 흔히 참조 변수라고 한다.
그런데 널은 객체가 주소를 가지지 못한 상태를 나타낸다.
변수가 선언되어도 이용할 수 없는 상태이다.
널인 상태의 객체를 이용하면 널 포인트 예외가 발생한다.
이는 널인 상태의 객체를 이용할 수 없다는 오류이다.
널 안정성이란 널 포인트 예외가 발생하지 않도록 코드를 작성하는 것을 말하는데,
널 포인트 예외는 오류이므로 당연히 발생하지 않게 작성해야 하지만,
중요한 건 이런 노력을 누가 하는가다.
이렇게 짧게 널 안정성을 검토 할 수 있다.
널 불허로 선언한 변수는 NULL을 대입할 경우 얼마든지 널 포인트 예외가 발생할 수 있다.
널 허용으로 선언한 변수의 멤버에 접근할 때는 반드시 ?. 연산자를 이용해야한다.
?. 연산자는 변수가 NULL이 아니면 멤버에 접근하지만 NULL 이면 멤버에 접근하지 않고 NULL을 반환한다.
엘비스 연산자란 ?: 를 말하는데 변수가 널이면 널을 반환한다. 어떤 경우에는 변수가 널일 때 대입해야 하는 값이나 실행해야 하는 구문이 있을 수 있을 때 사용한다.
!!는 객체가 널일 때 예외를 일으키는 연산자이다.
널 포인트 예외를 발생시켜야 할 때도 있다.
● 람다 함수는 익명함수
● 매개변수가 1개인 람다 함수는 함수에서 매개변수를 it 키워드로 이용한다.
● 람다 함수에는 명시적으로 RETURN 문을 사용할 수 없으며 함수의 마지막 실행문의 결과값을 반환한다.
● 함수를 매개변수로 받거나 반환하는 함수를 고차함수라고 한다.
● 널 안정성이란 널 포인트 예외가 발생하지 않게 프로그래밍해야 한다는 의미이며, 코틀린에서 이를 지원하는 ‘?.’ ‘?:’ ‘!!’ 등의 연산자를 제공한다.
{매개변수 선언 -> 함수 내용}(변수)
Val some : (Int) -> Unit = {println(it)}함수를 선언할 때 나타내는 매개변수와 반환 타입을 의미한다.
Fun some( a : Int, b : Int) : Int 를
(Int, Int) -> Int로 표현할 수 있다.
Val some: (Int, Int) -> Int = { no1: Int, no2: Int -> no1 + no2}함수 타입을 typealias를 이용해 선언할 수 있다.
타입의 별칭을 선언하는 키워드로, 함수 타입뿐만 아니라 데이터 타입을 선언할 때도 사용한다.
예를 들어 Int를 myInt로 바꿀 수 있다.
Typealias myfuntype = (Int, Int) -> Boolean
Fun main () {
val somefun : myfuntype = {n1: Int, n2: Int -> n1 > n}
} // 여기서 n1, n2의 타입 선언을 생략할 수 있다. 처럼 바꿀 수 있다. Val some = {n1: Int, n2: Int -> n1 > n2} 처럼 Some 함수의 타입을 생략할 수 있다.
고차 함수란 함수를 매개변수로 전달받거나 반환하는 함수를 의미한다. Hotfun()은 고차함수이다.

