scope 는 영역, 범위라는 뜻이고 function은 함수인데, 이 뜻을 합쳐보면 영역 함수, 범위 함수를 말한다.
코틀린에서 Scope Function은 람다를 사용해서, 영역을 만들고 코드를 더 간결하게 만들거나 method channing에 활용하는 함수이다.
스코프 함수를 쓰면 main 함수와 별도의 스코프에서 인스턴스의 변수와 함수를 조작하므로 코드가 깔끔해진다.
종류는 5가지가 있다. apply, also, let, run, with
with은 스코프 함수가 아니라고 하지만, with도 스코프함수처럼 사용하기도 한다.
람다의 결과 반환 | 객체 그 자체를 반환 | ||
it 사용 | let | also | with |
this 사용 | run | apply |
1. apply
- 객체를 새로 생성하고 특정 변수에 할당하기 전에 초기화 작업을 하는 Scope를 생성한다.
- 인스턴스를 생성한 후 변수에 담기전에 초기화 과정을 수행 할 때 사용
- apply 함수내에 작업들이 끝나고 나면 그 작업들이 적용되서 새로 생성된 객체를 반환한다.
- 객체 그 자체가 반환된다.
- 객체 설정을 할 때나 객체를 수정하는 로직이 call chain 중간에 필요할 때 사용한다.
- 확장 함수이기 때문에 this를 사용한다.(this 는 생략가능)
위 코드는 book 객체를 생성하면서 book이라는 변수에 할당하기 전에,
title을 "코틀린 마스터2"로 변경하고 책의 가격을 5000원 올려주는 메서드를 실행하고 그 결과 객체를 book에 할당한 코드이다.
이와 같이, 생성되자마자 조작된 인스턴스를 변수에 할당이 가능하다. 즉 객체 자체가 반환되는 것을 알 수 있다.
2. also
- apply와 동일하게 생성된 인스턴스를 반환한다.(객체 그 자체가 반환)
- it을 사용해서 속성에 접근이 가능하다. (it 생략 불가)
- 객체의 속성을 전혀 사용하지 않거나, 변경하지 않으면서 사용하는 경우에 사용한다. (객체의 데이터 유효성 등 확인)
- 람다를 활용해서 it외의 다른이름으로 사용가능
위 코드는 also를 활용해서 book 인스턴스의 title 값만 바꿔주고 출력한 결과이다.
코드 상의 it 부분을 원하는 이름으로 변경해서 사용할 수 있지만 생략 자체는 불가하다.
결과는 apply와 동일하다.
3. run
- 객체 초기화와 반환 값의 계산을 동시에 할 때 사용한다.(예를들면, 객체를 만들어서 DB에 바로 저장하고, 그 인스턴스를 활용하는 경우)
- 생성된 객체의 call chain으로 호출할 때 사용한다.
- 스코프 내에서 실행된 값을 반환한다.
- 람다 함수 안에 객체초기화와 return 값의 계산이 포함될 때 사용한다.
- 확장함수이기 때문에 this로 이용가능하다.
위 코드는 Book 객체를 만들면서 그 값들을 설정하고 testString 메서드를 통해서 필요한 값을 반환받는 코드이다.
run 은 람다의 마지막 실행결과를 반환하기 때문에 testString 메서드의 리턴 값을 받게 되서 아래와 같은 결과가 나오게 된다.
4. let
- run과 동일하게 람다의 최종 실행 결과를 반환한다. 람다의 마지막에 객체 단일로 있으면 그 객체 자체가 반환이 된다.
- it을 사용해서 property에 접근이 가능하다.
- 지정된 값이 null이 아닌 경우에 코드를 실행해야 할 때 사용한다.
위의 run과 동일한 결과가 출력된다. it은 생략불가이며, 다른 이름으로 지정할 수 있다.
5. with
- run과 동일하지만 인스턴스를 파라미터로 받는다.
- 람다 결과를 제공하지 않고 객체의 컨텍스트 안에서 함수를 호출하는 경우 사용한다.
- non-null 인 객체만 사용 가능하다.
6. apply, run vs also와 let
위에서 본 것처럼 this를 사용하는 apply, run이 있고 it을 사용하는 also와 let 이 있다.
this는 생략이 가능하기 때문에, 코드 가독성을 생각하면 apply와 run을 쓰는게 더 좋아보이지만 also나 let을 써야 하는 경우가 있다.
아래 코드를 보면
상단에 price 변수에 5000원을 할당하고, Book 클래스를 생성해서 그 인스턴스를 book에 할당한다.
그리고 아래서 book.run 에서 println으로 출력하면
title은 코틀린 마스터2, price는 15000원이 나와야 할 것 같다.
하지만 book.run 코드 부분을 출력해보면 다음과 같이 나온다. 이는 run 함수가 인스턴스 내의 price속성보다 run이 속해 있는 main 함수의 price변수를 우선시 하기 때문이다.
이 문제를 해결하기 위해서 also 와 let 을 이용해서 다음과 같이 코드를 수정해준다.
이와 같이 수정하면 예상했던 결과대로 잘 나오는 것을 확인 할 수 있다.
특별히 변수나 함수이름이 겹치거나 중첩되지 않는 이상은 apply와 run을 사용하고
중첩되거나 변수 등의 이름이 겹칠 때는 also와 let을 사용하면 될 것 같다.
'Kotlin' 카테고리의 다른 글
[Kotlin] 조건문 (if~else 문, when 문) (0) | 2023.11.04 |
---|---|
[Kotlin] 코틀린 Object, Companion Object (0) | 2023.08.25 |
[Kotlin] Sealed Class (0) | 2023.08.22 |
[Kotlin] 코틀린 Enum Class, 이늄(이넘) 클래스 (0) | 2023.08.21 |
[Kotlin] 코틀린 Data Class, 데이터 클래스 (0) | 2023.08.18 |