KOTLIN

[Kotlin] 공부 7일차 (2022-01-19)

HJ39 2022. 1. 19. 01:26

고차 함수

 

 

  • 함수 타입

→ 함수를 선언할 때 나타내는 매개변수와 변환 타입

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