Kotlin - Scope Function(5)

Code_Alpacat·2021년 10월 31일

안드로이드 기초

목록 보기
7/18

Scope Function은 범위 함수라고 불린다.

람다식을 사용해 호출하면, 일시적으로 범위가 형성되고, 람다를 부른 객체나 수신객체에 자유롭게 접근이 가능하게하는 기능이다.

Scope Function에는 다음과 같은 기능이 있다.

  • apply
  • with
  • let
  • also
  • run

이 기능들은 코드를 읽기쉽도록 도와주는 역할을 한다.
람다로 묶인 객체가 무슨 기능을 하는지 한눈에 파악이 가능하다.

1) apply 함수

  • 객체의 확장 함수이다.
  • 내부에서는 this를 통해서 객체에 접근할 수 있도록 해준다.
val person = Person().apply {
	firstName = "Name"
    	lastName = "Last"
        }

위와 같이 표현하면, this를 통해서 접근하므로, this를 생략하고 사용한다. 즉, 자바의 생성자에서 객체를 호출하고 사용하는 것과 유사하다.

2) also 함수

  • 객체가 파라미터를 통해서 전달한다. 람다의 입력값으로 내려오면 그 값은 it으로 쉽게 사용할 수 있다. it을 사용한 경우와 파라미터를 사용한 경우 두 예제이다.
  1. 파라미터 없이 it을 사용한 경우
Random.nextInt(100).also {
	print("getRandomInt() generated value $it")
}
  1. 파라미터를 람다식으로 표기해준 경우
Random.nextInt(100).also { value ->
	print("getRandomInt() generated value $value")
}
  • also 함수는 람다로 입력을 받고 다시 객체를 반환해서 출력 및 디버깅이 가능하다.

Let 함수

  • null이 아닌 객체에서 람다를 실행할 때 사용하는 함수
  • 작업을 수행한 후에 결과값으로 객체가 반환되는 apply, let과 다르게 내부의 코드 수행의 결과가 반환됨.
  • null이면 뒤의 함수가 실행되지 않으므로 null이 아니다.
val number: Int?

val sumNumberStr = number?.let {
"${sum(10, it)}"
} 

Let에서 사용하는 orEmpty 함수

  • String이 nullable한 경우에 사용하는 함수
  • null 값인 String을 빈 값으로 반환해주는 특성
val number: Int?

val sumNumberStr = number?.let {
"${sum(10, it)}"
}.orEmpty()

With 함수

  • with 의 반환값은 람다의 결과값이므로 객체를 실행해 this의 역할도 할 수 있다.
val person = Person()

with(person) {
	work()
    	sleep()
        println(age)
        }
  • 이는 with에서 person 객체안의 work sleep println(age) 함수들을 한 번에 실행하겠다는 의미다.

Run 함수

  • 값을 계산해야하거나 객체 구성과 결과 계산이 한 번에 묶여있을 때 유용하다.
  • ex) 초기화 후 바로 결과 계산
  • with은 this.sleep과 같은 확장함수로 사용이 불가능하다. run은 사용이 가능하다.
val result = service.run {
	port = 8080
    	query()
}

port를 초기화한 후 query의 값을 반환해준 값이 result에 저장된다.

DATA Class

  • 데이터를 저장하는 목적으로 만드는 클래스
  • copy, hashCode, toString, equal 함수가 자동 생성된다.
data class JavaObject(val s: String)

코틀린에서 모델 클래스를 사용할 때, 데이터클래스를 이용한다.

Lambda expression

  • 코틀린에서는 람다를 쉽게 이용이 가능하다. 코틀린은 함수형 언어에 비슷한 특징을 가진다.
  • 자바는 View.OnclickListener를 통해 구현해줘야 한다. 그러나 코틀린은 람다식으로 간단하게 표현이 가능하다.
button.setOnClickListener { v ->
	버튼의 동작
}

lateinit

  • Nullsafe한 코드를 만들기 위해 non-null로 변수를 선언해야한다.
  • lateinit은 전역변수로만 선언이 가능하고 val은 초기값이 없어서 선언이 안될 때 사용한다.
var nullableNumber: Int? = null

//나중에 초기화할 것이니 상관하지 않음
lateinit var lateinitNumber: Int

//뒤늦게 초기화되는 코드
lateinitNumber = 10

//사용할 때
nullableNumber?.add()

lateinitNumber.add()

lazy init

  • 나중에 init을 해서 실제로 사용할 때, 초기화를 시켜줌
var lazynumber :Int by lazy {
	100
}

//사용하기 전까지는 100이 lazynumber 변수에 할당이 되지 않는다.

//사용할 때, 할당
lazynumber.add()
profile
In the future, I'm never gonna regret, cuz I've been trying my best for every single moment.

0개의 댓글