▷ 고차 함수
- 함수 타입
→ 함수를 선언할 때 나타내는 매개변수와 변환 타입
fun some(no1:Int, no2:Int):Int{
return no1+no2
}
val some: (Int, Int) -> Int = { no1: Int, no2: Int -> no1 + no2 }
→ 일반 함수를 함수 타입으로 변경하였다.
- 타입 별칭
→ typealias 키워드를 이용하여 선언
typealias MyInt = Int
fun main(){
val data1: Int = 10
val data2: MyInt = 10
}
→ 함수 타입뿐만 아니라 데이터 타입을 선언할 때도 사용
typealias MyFunType = (Int, Int) -> Boolean
fun main() {
val someFun: MyFunType = { no1: Int, no2: Int -> no1 > no2 }
println(someFun(10, 20))
println(someFun(30, 20))
}
→ 위 코드처럼 변수뿐만 아니라 함수도 별칭으로 만들어서 쓸 수 있다
→ (Int, Int) -> Boolean으로 선언한 경우 해당 타입에 맞게 함수를 대입해야 한다.
- 매개변수 타입 생략
typealias MyFunType = (Int, Int) -> Boolean
fun main() {
val someFun: MyFunType = { no1, no2 -> no1 > no2 }
println(someFun(10, 20))
println(someFun(30, 20))
}
→ 매개변수의 타입을 유추할 수 있다면 타입 선언을 생략 가능하다.
- 고차 함수(High Order Function)
→ 함수를 매개변수로 전달받거나 반환하는 함수
□ 고차 함수 예시
fun hoFun(arg: (Int) -> Boolean): () -> String {
val result = if (arg(10)) {
"valid"
} else {
"invalid"
}
return { "hoFun result : $result" }
}
fun main() {
val result = hoFun({ no -> no > 0 })
println(result())
}
→ main 함수 안에 있는 hoFun({ no -> no > 0 })에서 { no -> no > 0 } 람다 함수를 hoFun의 매개변수로 전달한다.
→ hoFun의 반환 값으로 () -> String을 main함수 내부에 result변수에 저장한다.
상당히 복잡한 것 같다..
- 널 안전성
→ 널이란? 객체가 선언되었지만 초기화되지 않은 상태
→ 널인 상태의 객체를 이용하면 널 포인트 예외(NullPointException)가 발생한다.
□ 널 안전성을 개발자가 직접 고려한 코드 예시
var data: String?= null
val length = if(data == null){
0
}else{
data.length
}
println("data length: $length")
실행결과
data length: 0
→ String의 데이터를 null로 선언
→ data 변수에 대입한 문자열의 개수를 얻고자 length를 이용했는데 data가 null인 상태에서 data.length 코드를 실행하면 널 포인트 예외가 발생한다.(if문을 이용하여 널 안전성 처리)
□ 코틀린이 제공한 널 안전성 연산자를 이용한 코드
var data: String?= null
println("data length: ${data?.length ?: 0}")
→ data가 null이면 0을 반환하고 null이 아니면 length를 이용해 문자열의 개수를 얻는 소스
→ 널 안전성 첫 번째 코드와 똑같이 작동하지만 코드에서 null을 점검하지 않는다.
- 널 허용
→ '?' 연산자 사용
var data1:String ="kkang"
var data2:String? ="kkang"
data1=null //Error!
data2=null //성공
→ 널 허용 연산자 '?'를 사용하지 않으면 에러가 발생한다.
- 널 안전성 호출
→ '?.' 연산자 사용
□ 널 포인트 예외 오류
var data2:String? ="kkang"
var lenght = data2.length
□ 널 포인트 호출 연산자 사용
var data2:String? ="kkang"
var lenght = data2?.length
→ 위 코드들처럼 널을 허용한 경우 안전성을 고려하지 않고 작성하면 오류가 발생한다.
→ '?.' 연산자를 이용하여 널 안전성을 고려해야 한다.
- 엘비스 연산자
→ '?:' 기호를 사용
→ 변수가 널이면 널을 반환
→ 변수가 널일 때 대입해야 하는 값이나 실행해야 하는 구문이 있는 경우 사용
□ 엘비스 연산자 사용 예시
var data: String?= "kkang"
println("data = $data : ${data?.length ?: -1}")
data= null
println("data = $data : ${data?.length ?: -1}")
- 예외 발생 연산자
→ '!!' 기호를 사용
→ 객체가 널일 때 예외를 일으키는 연산자
□ 예외 발생 연산자 예시
fun some(data: String?): Int {
return data!!.length
}
fun main() {
println(some("kkang"))
println(some(null))
}
실행결과
5
Exception in thread "main" java.lang.NullPointerException
→ null이 매개변수로 전달되면 data!!. length 코드로 예외 메시지를 출력한다.
지금까지 공부했던 내용들을 이용하여 백준 문제를 풀어보면서 손에 익혀야 할 것 같다.
'KOTLIN' 카테고리의 다른 글
[Kotlin] 공부 9일차 (2022-01-23) (0) | 2022.01.24 |
---|---|
[Kotlin] 공부 8일차 (2022-01-20) (0) | 2022.01.21 |
[Kotlin] 공부 6일차 (2022-01-18) (0) | 2022.01.18 |
[Kotlin] 공부 5일차 (2022-01-17) (0) | 2022.01.18 |
[Kotlin] 공부 4일차 (2022-01-15) (0) | 2022.01.16 |