kotlin_android_배움기록_scope함수

이동천·2021년 12월 15일
0

자바로 안드로이드를 개발하다 이제는 코틀린을 배워야 할때라고 생각해 코틀린 안드로이드 개발공부를 시작했다. 패스트 캠퍼스 특강을 수강하며 공부를 진행했는데 결론은 과거에 배운 코틀린 언어를 대부분 까먹었다는 점이였다. 그래서 부분부분 공부를 하며 접했던 어려운 부분을 정리하려 한다.

1. 스코프함수

코틀린 공식페이지에서 설명하는 scope function은 객체의 컨텍스트 내에서 코드블럭을 실행하기 위한 목적을 가지고 있습니다. 이를 통해 객체의 이름 없이도 객체에 접근가능하게 해줍니다. 이러한 기능은 let, run, with, apply, also의 5가지를 통해 실행됩니다.
이 5가지 함수는 기본적으로 객체의 코드 블럭을 실행하는 기능을 가지고 있습니다.
->인스턴스의 속성이나 함수를 좀 더 깔끔하게 불러 쓰게해줌

차이점

*객체의 컨텍스트를 참조하는 방식(this,it)
-this 의 경우 재정의 불가, it은 재정의 가능
-it을 통해 같은 스코프내에 중복된 이름에 따른 혼란을 피할수 있음

val a = b.let{value->
}

와 같은 형태로 it재정의 가능

*리턴값(코드블럭의 마지막값을 반환하느냐 안하느냐의 차이)
-이미 인스턴스가 만들어진 후에 인스턴스의 함수나 속성을
scope내에서 사용해야할때를 기준으로 경우를 달리함

1)run(this,return o)

-마지막 결과값을 반환해줌

fun main(){
    
    var a = Book("배움기록", 10000).apply{
        name = "[for sale]" +name
        discount()
    }
    
    val s = a.run{
    //a.println의 형태를 갖추지 않아도 됨 
        println("상품명:$name, 가격:$price 원")
        //결과값 상품명:[for sale]배움기록, 가격:8000 원
        10
        //10을 s로 리턴해줌 
    }
    println(s)
    //결과값 10 
}

class Book(var name:String, var price:Int){
    fun discount()
    {
        price -= 2000
    }
}

2)let(it,return o)

fun main(){
    var price = 5000
    
    var a = Book("배움기록", 10000).apply{
        name = "[for sale]" +name
        discount()
    }
    
   
   val s = a.let{
        println("상품명: ${it.name}, 가격:${it.price} 원")
        // it을 사용하지 않을 경우 8000원이 아닌 main scope내의 5000원이 들어감 
    }
    println(s)
}


class Book(var name:String, var price:Int){
    fun discount()
    {
        price -= 2000
    }
}

3)also(it,return x(인스턴스 반환))

-it을 통해 중복 해소

4)apply(this,return x(인스턴스 반환))

-기본적으로 인스턴스를 생성한 후 변수에 담기전 초기화 과정을 수행할때 많이 사용한다.

fun main(){
    
    var a = Book("배움기록", 10000).apply{
        name = "[for sale]" +name
        discount()
    }
    
    println(a.price)
}


class Book(var name:String, var price:Int){
    fun discount()
    {
        price -= 2000
    }
}
//결과값 8000

5)with

-run과 동일한 기능
-인스턴스를 참조연산자 대신 패러미터로 받아줌

a.run{...}
with(a){...}
profile
안드개발자

0개의 댓글