코틀린_Scope function

소정·2023년 3월 22일
0

Kotlin

목록 보기
7/27

[1] Scope function

  • 객체 생성한 클래스의 멤버를 영역으로 관리
  • 영역을 묶어관리하면 참조변수명을 잘 못 기입하는 실수를 줄일 수 있고 가독성이 좋아짐

스코트 함수는 크게 2가지로 분류한다

1) 영역 안에서 this키워드로 본인을 참조하는 스코트 함수

this = 본인
apply , run

2) 영역 안에서 it 키워드로 본인을 참조하는 스코트 함수

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")
    }

}

[2] Coroutine

경량 스레드, 비동기

profile
보조기억장치

0개의 댓글