[Android Studio] 5장 - 코틀린 문법 정리 (4)

이상협·2022년 9월 3일
2

람다 함수

  • 익명 함수 정의 기법

선언과 호출

  • 람다 함수는 fun 키워드를 이용하지 않고, 함수 이름이 없음
{ 매개변수 -> 함수 본문 }

-> 기준 왼쪽은 매개변수, 오른쪽은 함수 본문을 나타냄
함수의 반환값은 본문의 마지막 표현식

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

선언과 호출을 동시에 할 수 있음

매개변수가 없는 람다 함수

{-> println("...")}
{println("...")}

화살표를 생략 할 수 있음

매개변수가 1개인 람다 함수

val some1 = {no: Int -> println(no)}

val some2 = (Int) -> Unit = {println(it)}

매개변수가 1개일 때는 중괄호 안에서 매개변수 선언을 생략하고 it 키워드를 사용 할 수 있음

람다 함수의 반환

  • 람다 함수는 return 문을 사용 할 수 없음
fun main() {
	val some = {no1: Int, no2: Int ->
    	println("...")
        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를 이용해 정수를 표현하는 새로운 별칭 선언 가능

typealias MyFunType = (Int, Int) -> Boolean

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

위와 같이 함수 타입도 별칭으로 선언하여 사용 가능

매개변수 타입 생략

typealias MyFunType = (Int, Int) -> Boolean
val someFun: MyFunType = {
	no1, no2 -> no1 > no2
}

매개변수의 타입을 유추할 수 있을 경우 선언 생략 가능

val someFun = {
	no1: Int, no2:Int -> no1 > no2
}

위와 같이 함수의 타입도 유추할 수 있으면 생략 가능

고차 함수

  • 함수를 매개변수로 전달받거나 반환하는 함수를 의미
fun hofFun(arg: (Int) -> Boolean): () -> String { 
	val result = if(arg(10)) {
    	"valid"
    } else {
    	"invalid"
    }
    return (result)
}

fun main() {
	val result = hotFun({no -> no > 0})
}

위와 같이 함수를 매개변수로 전달해서 사용 가능


널(null) 안전성

  • 널은 객체가 선언되었지만 초기화되지 않은 상태를 의미함
  • 널은 객체가 주소를 가지지 못한 상태를 나타냄
val data: String = "hello"
val data2: String? = null

data2 변수는 null이기 때문에 아직 주솟값을 가지지 못함
널인 상태의 객체를 이용하게 되면 널 포인트 예외가 발생

  • 널 안전성이란 널 포인트 예외가 발생하지 않도록 코드를 작성하는 것
fun main() {
	var data: String? = null
    val length = if (data == null) {
    	0
    } else {
    	data.length
    }
}

이처럼 널 포인트 예외가 발생하지 않게 작성했지만, 좀 더 효율적인 방법이 필요함

fun main() {
	var data: String? = null
    {data?.length ?: 0} // 0
}

위와 같이 널 안전성 연산자를 이용해서 예외가 발생하지 않게 작성할 수 있음


널 안전성 연산자

널 허용 - ? 연산자

var data: String? = "gildong"

널 안전성 호출 - ?. 연산자

var data: String? = "gildong"
var length = data?.length

만약 data 변수가 null이 아니면 멤버에 접근하고, null이면 멤버에 접근하지 않고 null을 반환

엘비스 - ?: 연산자

var data: String? = "gildong"
{data?.length ?: -1}

엘비스 연산자는 변수가 null이면 null을 반환

예외 발생 - !! 연산자

fun some(data: String?): Int {
	return data!!.length
}

매개변수로 null이 전달되면 예외 메세지가 반환됨


참고

Do it! 깡쌤의 안드로이드 프로그래밍 with 코틀린 (개정판)

0개의 댓글