05. [코틀린의 유용한 기법]

728x90

[05. 코틀린 유용한 기법]

[05-1. 람다 함수와 고차 함수]

[람다 함수] : 익명 함수

-주로 함수를 간단하게 정의할 때 사용

-코틀린에서는 고차함수를 지원함. 고차함수는 매개변수나 반환값에 함수를 이용함.

-, 람다함수는 고차함수를 이해하기 위해 알아야 함.

[람다 함수 선언과 호출] : { 매개변수 -> 함수 본문 }

-{} 중괄호 사용, ( fun 키워드 사용X)

-함수 이름 없기 때문에, 함수명으로는 호출 X

   1) 람다함수를 변수에 대입해서 사용

val sum = { no1: Int, no2: Int -> no1 + no2}

   2)람다함수 선언과 동시에 호출해서 사용바로 뒤에서 소괄호()로 호출

{no1: Int, no2 : Int -> no1 + no2 } (10, 20)

   3) 람다함수 선언 이후, 따로 호출해서 사용 : 호출 시 소괄호() 호출

람다함수 선언 : val sum = {no1 : Int, no2 : Int -> no1 + no2 }
람다함수 호출 : sum(10, 20)

[매개변수 없는 람다 함수]

-매개변수 없을 경우 {} 화살표 왼쪽 부분을 비워두면 됨

-( -> )화살표도 생략 가능 O

{ -> println(“function call”) }
{ println(“function call”) }

[매개변수 1개인 람다 함수]

-매개변수가 1개일 때는 매개변수 선언하지 않아도 함수로 전달된 값을 쉽게 이용 O

(1) val some = { no: Int -> println(no) }
(2) val some: (Int) -> Unit = {println( it ) }  // <it 키워드로 매개변수 이용>

 -매개변수 1개일 때는 중괄호 안에서 매개변수 선언 생략하고 it키워드로 매개변수 이용 O

-단 람다함수에서 it 이용하려면 해당 매개변수 타입 식별 가능할 수 있어야 함

[람다함수의 반환]

-람다함수도 자신을 호출한 곳에 결괏값을 반환해야 하는데, return문은 사용 X

-람다함수의 반환값은 { }본문의 마지막 실행 결과가 된다.

[함수 타입과 고차함수]

-코틀린에서는 함수를 변수에 대입해서 사용 가능

-변수에 함수를 대입하려면, 변수를 함수 타입으로 선언해야 함

[함수 타입 선언]

-함수 타입 변수 선언: 함수를 선언할 때 나타내는 매개변수와 반환타입 정의한 변수

       ex. (Int, Int) -> Int 타입 변수에는 이 함수 타입에 맞는 함수를 대입해야 함

val some: (Int , Int) -> (Int) = {no1: Int, no2 :Int -> no1 + no2 }
                 //함수 타입               //함수 내용

[타입 별칭] : typealias 키워드

-typealias 키워드 : 타입 별칭을 선언하는 키워드
-함수 타입, 데이터 타입 모두에 사용 o

-새로운 별칭으로 타입 지정 가능

//새 별칭으로 함수 타입 선언

typealias MyFunType = (Int, Int) -> Boolean

//이제 이 변수에는 해당 타입에 맞는 함수만 대입 가능 O 

fun main() {
   val someFun: MyFunType = {no1: Int, no2:Int -> no1 > no2}
      . . .
}

[매개변수 타입 생략]

-일반적으로 매개변수의 타입 유추 가능하면 타입 선언 생략 O

-‘타입 유추에 따른 타입 생략 기법은 타입만 유추가능하면 어디든 통한다.

[고차 함수]

-고차함수 : 함수를 매개변수로 전달 or 반환하는 함수를 의미

-고차함수 호출 시 인자로 함수를 전달하고, 반환 받는 결과 역시 함수이다

fun hofFun(arg: (Int) -> Boolean) : () -> String {  
               //매개변수 타입, 반환 타입 모두 람다함수 형태이다. 
    val result = if(arg(10)) {
        “valid”
    } else {
         “invalid”
    }
    return {“hofFun result : $result ” } //람다함수를 반환 
}

fun main() {
    val rsult = hotFun( {no -> no > 0 } ) //람다함수를 인자로 넣고 호출 
    println(result() )
}

[05-2. 널 안정성]

[널 안정성]

-NUll () : 객체가 선언되었지만 초기값 할당되지 않아서 주소 갖지 못한 상태

                -, 변수가 선언되없으나 이용할 수는 없는 상태

                -널 객체 이용 시 -> 널 포인트 예외가 발생한다.

-널 안정성 : 널 포인트 예외가 발생하지 않도록 코드 작성하는 것 의미

-코틀린은 널 안정성을 지원한다. , 객체가 널일 때 예외 발생하지 않도록 기법 제공한다.

[널 안정성 연산자]

[널 허용 연산자] ? 연산자

-변수 타입에는 널 허용/부허용 구분

-변수 선언 시, 변수 타입 뒤에 ? 연산자 붙이면 널 허용 변수가 된다.

val data2: String? = “kkang”
data2 = null

[널 안정성 호출] ?. 연산자

-널 허용으로 선언한 변수의 멤버에 접근 시 반드시 (.? 연산자 사용)

-이 연산자는 변수가 null 아닐 때만 멤버에 접근

val data: String? = “kkang”
val length = data?.length

변수가 null이면 null 반환

[엘비스] ?: 연산자

-변수가 널이면 널을 반환하는 연산자

[예외 발생] !! 연산자

-객체가 널일 때 예외를 일으키는 연산자

[참고] : Do It 안드로이드 앱 프로그래밍 with 코틀린 

728x90