스코트 함수는 크게 2가지로 분류한다
this = 본인
apply , run
it = 파라미터 (그렇기 때문에 이름 변경 가능)
also, let
package com.bsj0420.ex01kotlinhello
import android.app.AlertDialog
fun main() {
//1. apply
//2. let
//3. run
//4. also
//어떤 객체의 여러개의 멤버를 사용해야 할 때
var member = Member()
member.name = "sam"
member.age = 20
member.address = "busan"
member.show()
//멤버 4개 사용할 때 무조건 객체명. 으로 접근함
//이러한 것을 한번에 하기 위해 등장한 scope(영역) 함수(확장함수)
val member2 = Member()
member2.apply {
// 이 영역 안에서는 this가 member2 객체임
this.name = "robin"
this.age = 50
//this는 생략 가능
address = "서울"
show() //메소드 호출도 가능
}
//위처럼 영역을 묶어관리하면 참조변수명을 잘 못 기입하는 실수를 줄일 수 있고
// 개발자가 볼 때 member2에 대한 설정을
// 하나의 영역에 묶어서 가독성을 개선함
// 스코트 함수는 크게 2가지로 분류
//1) 영역 안에서 this키워드로 본인을 참조하는 스코트 함수
// apply , run => 마지막 리턴값이 다름
//2) 영역 안에서 it 키워드로 본인을 참조하는 스코트 함수
// 마치 람다식 처럼 쓰는 구조
// it 키워드는 생략 불가 -> 그럼에도 쓰는 이유 it 키워드를 다른 키워드로 변경 가능
// also, let
val member3 = Member()
member3.also {
it.name = "hong"
it.age = 50
it.address = "서울"
it.show()
}
member3.let {mem->
mem.name = "lee"
mem.age = 44
mem.address = "인천"
mem.show()
}
////////////////////////////////
//apply와 run의 차이는 리턴값이 다름
//also, let 차이도 리턴값이 다름
///////////////////////////////
//안드로이드에 사용하는 모습 샘플
val builder: AlertDialog.Builder = AlertDialog.Builder(this)
builder.setTitle("aaa")
builder.setMessage("메세지")
builder.setPositiveButton("OK", null)
val dialog = builder.create().show()
//run function 의 마지막 실생문의 결과가 리턴값
val builder2: AlertDialog.Builder = AlertDialog.Builder(this)
val dialog2 = builder2.run {
setTitle("title")
setMessage("메세지")
setPositiveButton("OK", null)
create()// 마지막 값이 리턴되는 것이 run 본인이 다시 리턴 되는 것이 apply
}
dialog2.show()
// apply function의 리턴 값은 this임 ,본인이 리턴됨
val builder3: AlertDialog.Builder = AlertDialog.Builder(this)
val dialog3 = builder2.apply {
setTitle("title")
setMessage("메세지")
setPositiveButton("OK", null)
}.create().show()
}
class Member{
var name:String?=null
var age:Int?=null
var address:String?=null
fun show(){
println("$name $age $address")
}
}
경량 스레드, 비동기