코틀린 표준 라이브러리는 객체의 컨텍스트 내에서 코드 블럭을 실행하기 위한 목적만을 가진 여러가지 함수를 제공. 이런 함수들을 람다식으로 호출할 때, 이는 임시로 범위(scope)를 형성함. 이 범위 내에서는 객체의 이름이 없어도 객체에 접근할 수 있으며 이러한 함수를 scope functions라고 함
기본적으로, 이 함수들은 동일한 역할: 객체에 코드 블럭을 실행하는 것
자신을 호출한 함수를 this , it으로 대체해서 사용할 수 있음
class Book(var name: String, var price: Int) {
fun discount() {
price - +2000
}
}
fun main() {
var a: String = "초특가" + Book("길동의 코틀린", 4000).name
//이렇게도 가능한데 이렇게 하면 a는 String을 반환+코드드럽
var apply: Book = Book("길동의 자바", 4000).apply {
"초특가"+this.name
this.discount()
}
var apply: Book = Book("길동의 자바", 4000).apply {
"초특가"+name
discount()
}
fun main() {
var price=5000
var apply: Book = Book("자바", 4000).apply {
println($price) //main함수에서 만든 price가 호출됨
}
var also: Book = Book("자바", 4000).also {
println($it.price) //인스턴스의 price호출
}
val run = Book("자바", 4000).run {
this.name = "자바스크립트" //this써도되고 안써도 되고
price = -2000
name + price //마지막구문의 결과값을 return
}
with
run 과 동일하나
a.run{ } 이 아니고 with{a} 요렇게 쓴다.
마지막 식의 결과를 리턴 한다
val s: String = with(StringBuilder("abc")) { append("def ").append("zzz") println("value: $this")toString() } println(s) //value: abcdefzzz //abcdefzzz
val let = Book("자바", 4000).let {
it.name = "스크립트"
it.price = -2000
it.name + it.price //마지막구문의 결과값을 return
}
var also: Book = Book("다빈의 자바", 4000).also { target->
target.name + "초특가"
target.discount()
}
val let = Book("다빈의 자바", 4000).let { item->
item.name = "지태의 자바스크립트"
item.price = -2000
item.name + item.price //마지막구문의 결과값을 return
}
binding.apply {
//apply로 묶으면서 객체 초기화할때 새로운 변수 선언도 당근 가능하구나
val animation = AnimationUtils.loadAnimation(activity, R.anim.fade_in)
val animation2 = AnimationUtils.loadAnimation(activity, R.anim.fade_out)
ivSigninGithub.startAnimation(animation2)
ivSigninGithub.startAnimation(animation)
//binding.ivSigninGithub.startAnimation(animation)
}
with(binding) {
recyclerMemo.adapter = memoAdapter
recyclerMemo.layoutManager = LinearLayoutManager(this@RoomActivity)
//여기서의 this는 바인딩객체 가르켜서..
}
binding.run() {
recyclerMemo.adapter = memoAdapter
recyclerMemo.layoutManager = LinearLayoutManager(this@RoomActivity)
}
binding.apply {
recyclerMemo.adapter = memoAdapter
//마지막 결과값 리턴한거 변수에 담아서 쓰는게 아니니까 객체 초기화하는 스코프 함수 써도 될듯?
binding.recyclerMemo.layoutManager = LinearLayoutManager(this@RoomActivity)
}
안녕하세요ㅎㅎ 저도 코틀린 공부중입니다!