[안드로이드 공부]/코틀린

코틀린 Scope; apply, also, run, with, let

코코모아 2020. 7. 23. 16:02

아래는 코모스튜디오가 직접 만든 무료 앱이에요
(한 번만 봐주세요 ^^)

01

02

03

정각알림 만들기(말하는시계)

말하는 시계 (취침, 자전거) 

말하는 타이머 음성 스톱워치 

Scope 함수는

  • 인스턴스의 속성, 함수를 영역내에서 분리해서 사용 할 수 있다.

  • 깔끔하고, 가독성을 높여 준다. 

apply / also

  • 인스턴스 반환

run(with) /let

  • 최종값 반환

apply

  • 인스턴스(클래스)를 생성한 후 변수에 담기 전 초기화 과정을 수행 할 때

  • 인스턴스 생성 후 .apply{ }

  • 스코프 내에서 인스턴스의 .이름 없이 바로 사용 가능

  • 즉, 인스턴스 생성 하고, 변수에 변경되거나 초기화 값을 넣은 다음 할당 하게 된다.

class Book(var title: String, var number:Int){}
var a = Book("a", 5).apply{ title = "abcde" + name}
  • 인스턴스가 그대로 반환 된다

run

  • apply  와 같으나, 마지막 구문이 반환 된다

  • 초기화 이후 해야 할 작업들이 있을 경우 스코프 내에서 할 때

 

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

 

also / let

  • apply / run 과 다른 점은 it을 통해 접근 한다는 것.

    • 이유는 같은 이름의 변수/함수가 스코프 밖에 있다면 현재 클래스 내의 변수가 더 우선 되기 때문에 also 또는 let을 사용하면 스코프 내의 인스턴스의 값이 우선 적용 된다.

class a (){
	var title;
    var bbb = b(“타이틀”).apply{
    	name = 123 + tittle
    } 
    
    a.run { 
    	println(${title})//b의 타이틀이 아닌 a의 타이틀이 나온다
    } 
    
    b.let { 
    	println(${it.title})//a의 타이틀이 아닌, b의 타이틀이 나온다}
    }
 
 class b(var title){}

 

let

  • scope  내에서 it을 사용해서 인스턴스에 접근 한다.

a.let{  it.title, it.number}
  • b?.let{} 

    • 요렇게 널 체크 후 스코프에서 사용하게 할 수도 있다

 

also 

  • it을 통해 접근

let은 내부 결과를 변화 시킬 수 있으나, also 는 변화 시킬 수 없다. 

모든 게시물은 코모스튜디오의 소유이며, 무단 복제 수정은 절대 불가입니다.
퍼가실 경우 댓글과 블로그 주소를 남기고 해당 게시물에 출처를 명확히 밝히세요.