์ฝํ๋ฆฐ์ ์ฌ์ฉํ๋ฉด์ ํญ์ ํท๊ฐ๋ ธ๋ Scope functions ์ ๋ํด ์ ๋ฆฌํด ๋ณด๊ณ ์ ํฉ๋๋ค.
์ฝํ๋ฆฐ์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด ๊ต์ฅํ ์์ฃผ ์ ํ๊ณ ์ฌ์ฉํ ๊ฐ๋ ๋ค์ด๊ธฐ์ ์ด๋ฒ ๊ธฐํ์ ํ์คํ ์ ๋ฆฌํ๊ณ , ์ด๋ค ์ํฉ์ ์ด๋ค ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ํฉํ ์ง ์ ํํ ํ์ ํ๋ ๊ฒ์ด ๋ชฉํ์ ๋๋ค.
Scope functions
๊ธฐ๋ณธ์ ์ผ๋ก Scope functions๋, ์ฝ๋ ๋ธ๋ก์ ์คํํ๋ ํน์ ๊ฐ์ฒด์ ๋ํด ๋์ผํ ์์ ์ ์ํํฉ๋๋ค.
์ผ๋ถ๋ ๋๋ค ํํ์์ด ์ ๊ณต๋๊ณ , ๊ฐ์ฒด์ ์ด๋ฆ์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๊ฐ์ฒด์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค. (this, it)
์ฝํ๋ฆฐ์ Scope functions์๋ let, run, with, apply, also 5๊ฐ์ง์ ํจ์๋ค์ด ์กด์ฌํฉ๋๋ค.
์ ๋ ์ฝ๋๋ ๋์ผํ ๋ก์ง์ ์ํํ์ง๋ง, let ์ ์ฌ์ฉํ๋ฉด ๋์ฑ ๊ฐ๋จํ๊ฒ ๊ฐ์ฒด ๋ด๋ถ์ ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
Function Selection
Function | Object reference | Return value | Is extension function |
let | it | Lambda result | O |
run | this | Lambda result | O |
with | this | Lambda result | X |
apply | this | Context object | O |
also | it | Context object | O |
์ ๋ด์ฉ์ ์ฝํ๋ฆฐ์ ๊ณต์ ๋ฌธ์์ ๋์์๋ ๋ด์ฉ์ผ๋ก ์์ธํ ๋ณด๋ฉด ํฌ๊ฒ 2๊ฐ์ง๋ก ๋๋ ์ ์์ต๋๋ค.
- Object reference ๋ฐฉ์์ด it vs this
- Returen value ๊ฐ์ด Lambda result vs Context object
์์ ๋ ๋ถ๋ฅ๋ก ๋๋์ด๋ณด๋ฉด with๋ง ๋ ํนํ๊ฒ ํ์ฅ ํจ์๋ก ์ ์๋์ด ์์ง ์์ต๋๋ค. ๋์ฒดํ ์ ์๋ run ํจ์๋ฅผ ์ฌ์ฉํด๋ ๋ฌด๋ฐฉํ ๊ฒ ๊ฐ์๋ฐ์, ์๋์์ ์กฐ๊ธ ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๋ชฉ์ ์ ๋ฐ๋ผ ์ ํจ์๋ค์ ์ ํํ๋ ๋๋ต์ ์ธ ๊ฐ์ด๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- let: nullable์ด ์๋ ๊ฐ์ฒด์ ๋ํด ๋๋ค ์คํํ๊ธฐ
- let: ๋ก์ปฌ ๋ฒ์์์ ๋ณ์๋ก ํํ์ ๋ํ๋ด๊ธฐ
- apply: Object configuration
- run: Object configuration ๋ฐ ๊ฒฐ๊ณผ ๊ณ์ฐ
- also: ์ถ๊ฐ์ ์ธ ํจ๊ณผ, ์์
- with: object์ ๋ํ ํจ์ ํธ์ถ ๊ทธ๋ฃนํ
Scope functions์ด ์ฝ๋๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ฒ ๋ง๋ค ์ ์์ง๋ง, ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๊ฑฐ๋ ์ค์ฒฉํด์ ์ฌ์ฉํ ๊ฒฝ์ฐ ๋ ๋ณต์กํด์ง ์ ์์ต๋๋ค.
Distinctions (์ฐจ์ด์ )
Scope functions์ ์ฑ๊ฒฉ์ด ๋น์ทํ๊ธฐ์ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํ๋ฐ์, ํฌ๊ฒ ๋ ๊ฐ์ง ์ฃผ์ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
- Context object (์์ ๊ฐ์ฒด)
- Return value
Context Object(์์ ๊ฐ์ฒด)
Scope functions๋ก ์ ๋ฌ๋ ๋๋ค ๋ด๋ถ์์ ์์ ๊ฐ์ฒด๋ ์ค์ ์ด๋ฆ ๋์ ์งง์ ์ฐธ์กฐ(this or it)๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
this
run, with, apply์์๋ this ํค์๋๋ฅผ ์ฐธ์กฐํ๊ธฐ์, ๋๋ค์์ ์ผ๋ฐ ํด๋์ค ํจ์์ ๋ง์ฐฌ๊ฐ์ง๋ก ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์์ ๊ฐ์ฒด์ ์ ๊ทผํ ๋ this ํค์๋๋ฅผ ์๋ตํ ์ ์์ด ์ฝ๋๊ฐ ๋ ์งง์์ง๋ ๋ฐ๋ฉด ์์ ๊ฐ์ฒด์ ์ธ๋ถ ๊ฐ์ฒด์ ๊ธฐ๋ฅ์ ๊ตฌ๋ถํ๊ธฐ ์ด๋ ค์ธ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ ํ๊ฒ ์๋ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
it
let, also๋ ๋๋ค ์ธ์๋ก ์์ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํฉ๋๋ค. ์ธ์ ์ด๋ฆ์ด ์ง์ ๋์ง ์์ ๊ฒฝ์ฐ, ํด๋น ๊ฐ์ฒด๋ ๊ธฐ๋ณธ ์ด๋ฆ์ธ it์ผ๋ก ์ ๊ทผ๋ฉ๋๋ค.
it์ this ๋ณด๋ค ์งง์ผ๋ฉฐ, ์ผ๋ฐ์ ์ผ๋ก ์ฝ๊ธฐ๊ฐ ๋ ์ฝ์ต๋๋ค.
ํ์ง๋ง, ๊ฐ์ฒด์ ํจ์๋ ์์ฑ์ ํธ์ถํ ๋๋ this์ฒ๋ผ ์๋ฌต์ ์ผ๋ก ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
Return value
Scope functions๋ ๋ฐํ๋๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ค๋ฆ ๋๋ค.
- apply์ also๋ ์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํฉ๋๋ค.
- let, run, with๋ ๋๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค.
์ฝ๋์์ ๋ค์์ ์ํํ ์์ ์ ๋ฐ๋ผ ์ํ๋ ๋ฐํ ๊ฐ์ ๊ณ ๋ คํด์ผ ์ต์ ์ Scope functions์ ์ ํํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
apply์ also๋ ์์ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฆฌํดํ๊ธฐ ๋๋ฌธ์, ์ถ๊ฐ ๋จ๊ณ๋ก ๋ฉ์๋ ์ฒด์ด๋์ ํฌํจ๋ ์ ์์ต๋๋ค.
์ฆ, ๋์ผํ ๊ฐ์ฒด์์ ํจ์ ํธ์ถ์ ์ฐจ๋ก๋ก ๊ณ์ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํฉ๋๋ค.
๋ํ ์์ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ํจ์์ ๋ฐํ๋ฌธ์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
let, run, with๋ ๋๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํฉ๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณ์์ ํ ๋นํ๊ฑฐ๋, ๊ฒฐ๊ณผ์ ๋ํ ์ฐ์ฐ์ ์ฐ๊ฒฐํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ๋ฐํ ๊ฐ์ ๋ฌด์ํ๊ณ ์ง์ญ ๋ณ์์ ๋ํ ์์ ๋ฒ์๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
Functions
์ด๋ ์ํฉ์์ ์ด๋ ํ scope functions์ ์ฌ์ฉํด์ผ ํ๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ์ ์ ์ผ๋ก scope functions์ ๋ง์ ๊ฒฝ์ฐ ๊ต์ฒด๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก, ์๋ ์์ ์์๋ ์ฌ์ฉ ์ฌ๋ก์ ๋ํ ๊ท์น๋ค์ ์ค๋ช ํฉ๋๋ค.
let
- let์ ์์ ๊ฐ์ฒด(it)๋ฅผ ์ด์ฉํด ๋ก์ง์ ์ํํ๊ณ , ๋ง์ง๋ง ๋ผ์ธ์ ๋ฐํํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ๋ํ nullable ํ ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํ ๋ let์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ฝ๋ ๋ธ๋ก์ด let์ ์ธ์๋ก ํฌํจ๋ ๋จ์ผ ํจ์์ธ ๊ฒฝ์ฐ, lambda ์ธ์ ๋์ ๋ฉ์๋ ์ฐธ์กฐ(::)๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ์์ ์ฒ๋ผ nullable ํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ค๋ฉด null check ์ฐ์ฐ์์ธ '?'๋ฅผ ์ฌ์ฉํ๊ณ , ๋๋ค์ ์๋ ์์ ๊ณผ ํจ๊ป ํธ์ถํฉ๋๋ค.
'?.let'์ ํตํด let์ block์ ์์ ๊ฐ์ฒด๊ฐ null์ด ์๋ ๋๋ง ์ํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
with
- with๋ ํ์ฅ ํจ์๊ฐ ์๋, ์์ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ฐํ ๊ฐ์ ์ฌ์ฉํ ํ์๊ฐ ์์ ๋, with๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- ์๋ run๊ณผ ๊ฑฐ์ ๋์ผํ์ง๋ง, run์ ํ์ฅ ํจ์๋ก ์ฌ์ฉ๋๋ with๋ ์์ ๊ฐ์ฒด(receiver)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ฌ์ฉํ๋ค๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
์ ์ฝ๋์์ run๊ณผ with์ ๊ฒฐ๊ณผ๋ ๋์ผํฉ๋๋ค.
run
- run์ ์์ ๊ฐ์ฒด๋ก this๋ฅผ ์ฌ์ฉํ๋, ์์ ๊ฐ์ฒด ์์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์์ ๊ฐ์ฒด ๋ช ์ ํ์)
- ๋ํ run์ with์ ๋์ผํ์ง๋ง, run์ ํ์ฅ ํจ์๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
- run์ ๋๋ค๊ฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ณ ๋ฐํ ๊ฐ์ ๊ณ์ฐํ ๋ ์ ์ฉํฉ๋๋ค.
with vs run
์์ ์ฝ๋๋ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋ฉด ๋ ํจ์๋ ๊ฑฐ์ ๋น์ทํ๊ฒ ์ฌ์ฉ์ด ๋๋ ๊ฒ ๊ฐ์๋ฐ์, ์ฐพ์๋ณด๋ ๋๋ต์ ์ผ๋ก ์๋์ ๊ฐ์ ์ฌ์ฉ ์ฌ๋ก, ์ฐจ์ด์ ๋ฑ์ด ์กด์ฌํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
with๋ ๊ฒฐ๊ณผ๊ฐ ํ์ํ์ง ์๋ ๊ฒฝ์ฐ์ ์ฃผ๋ก ์ฌ์ฉํ๋ ๋ฏํ๊ณ , run์ ๊ฒฐ๊ณผ ๊ณ์ฐ ๋ฑ์ ์ฌ์ฉ์ ์ฃผ๋ก ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
๋ํ run์ ํ์ฅ ํจ์๋ก ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ์ฒด์ด๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
apply
- apply๋ ์์ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํ๋ฏ๋ก ์์ ๊ฐ์ฒด ๋ด๋ถ์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
- ๋ ๋ค๋ฅธ ์ ์ฉ ์ฌ๋ก๋ ๋ณต์กํ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ค์์ ์ฒด์ด๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋๋ค์ ์์ ๊ฐ์ฒด๊ฐ apply์ ์์ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ฆฌ์๋ฒ(this)๋ฅผ ์๋ตํ ์ ์์ต๋๋ค.
also
- apply์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๊ฐ์ฒด ์์ ์ ๋ฐํํฉ๋๋ค.
- apply๊ฐ ์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค๋ฉด, also๋ ๊ฐ์ฒด์ ํ๋กํผํฐ ์ค์ ๊ณผ ์ถ๊ฐ ์์ ์ด ํ์ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- block์ ๋๋ค์ ํ๋ผ๋ฏธํฐ๋ก ์์ ๊ฐ์ฒด(T)๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ์์ ์์ ๊ฐ์ฒด๋ it์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ ๋ฆฌ
let
- let์ ์์ ๊ฐ์ฒด(it)๋ฅผ ์ด์ฉํด ๋ก์ง์ ์ํํ๊ณ , ๋ง์ง๋ง ๋ผ์ธ์ ๋ฐํํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ๋ํ nullable ํ ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํ ๋ let์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
with
- with๋ ์์ ๊ฐ์ฒด๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ฌ์ฉํฉ๋๋ค.
- ๋ฐํ ๊ฐ์ ์ฌ์ฉํ ํ์๊ฐ ์์ ๋, with๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- ์๋ run๊ณผ ๊ฑฐ์ ๋์ผํ์ง๋ง, run์ ํ์ฅ ํจ์๋ก ์ฌ์ฉ๋๋ with๋ ์์ ๊ฐ์ฒด(receiver)๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ฌ์ฉํ๋ค๋ ์ฐจ์ด์ ์ด ์์ต๋๋ค.
run
- run์ ์์ ๊ฐ์ฒด๋ก this๋ฅผ ์ฌ์ฉํ๋, ์์ ๊ฐ์ฒด ์์ด๋ ์ฌ์ฉํ ์ ์์ต๋๋ค. (์์ ๊ฐ์ฒด ๋ช ์ ํ์)
- ๋ํ run์ with์ ๋์ผํ์ง๋ง, run์ ํ์ฅ ํจ์๋ก ๊ตฌํ๋์ด ์์ต๋๋ค.
- run์ ๋๋ค๊ฐ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํ๊ณ ๋ฐํ ๊ฐ์ ๊ณ์ฐํ ๋ ์ ์ฉํฉ๋๋ค.
apply
- apply๋ ์์ ๊ฐ์ฒด ์์ฒด๋ฅผ ๋ฐํํ๋ฏ๋ก ์์ ๊ฐ์ฒด ๋ด๋ถ์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํ๊ธฐ ์ํด ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
- ๋ ๋ค๋ฅธ ์ ์ฉ ์ฌ๋ก๋ ๋ณต์กํ ์ฒ๋ฆฌ๋ฅผ ์ํ ๋ค์์ ์ฒด์ด๋์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
also
- apply์ ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๊ฐ์ฒด ์์ ์ ๋ฐํํฉ๋๋ค.
- apply๊ฐ ์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ค์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ค๋ฉด, also๋ ๊ฐ์ฒด์ ํ๋กํผํฐ ์ค์ ๊ณผ ์ถ๊ฐ ์์ ์ด ํ์ํ ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- block์ ๋๋ค์ ํ๋ผ๋ฏธํฐ๋ก ์์ ๊ฐ์ฒด(T)๋ฅผ ์ ๋ ฅ๋ฐ๊ธฐ ๋๋ฌธ์ ๋ด๋ถ์์ ์์ ๊ฐ์ฒด๋ it์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
์ด์์ผ๋ก ์ฝํ๋ฆฐ์ Scope functions์ธ `let, with, run, apply, also` 5๊ฐ์ง ํค์๋์ ๋ํด ์ ๋ฆฌํด ๋ณด์์ต๋๋ค.
๋๋ต์ ์ผ๋ก ์ด๋ ์ํฉ์์ ์ด๋ ํ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์์ง๋ ์ง์ ์ฌ์ฉํด ๋ณด๋ฉฐ ์ตํ์ผ ํ ๊ฒ ๊ฐ์ง๋ง, ๋๋ต์ ์ธ ๋๋์ผ๋ก๋ ์๋์ ๊ฐ์ด ์ฌ์ฉํ๋ฉด ์ข์ ๊ฒ ๊ฐ๋ค์. ๐
- let: nullable ํ ๊ฐ์ ์ฒ๋ฆฌํด์ผ ํ ๋
- with: ๊ฒฐ๊ณผ๊ฐ ํ์ํ์ง ์๋ ๊ฒฝ์ฐ
- run: ๊ฒฐ๊ณผ๊ฐ ํ์ํ ๊ฒฝ์ฐ
- apply: ์์ ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ๋ณ๊ฒฝํด์ผ ํ ๋
- also: ์์ ๊ฐ์ฒด์ ํ๋กํผํฐ ๋ณ๊ฒฝ๊ณผ, ์ถ๊ฐ์ ์ธ ์์ ์ด ํ์ํ ๋
https://kotlinlang.org/docs/scope-functions.html#context-object-this-or-it
'Kotlin' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Kotlin] Slack API๋ก ์ฌ๋ ์ฑ๋์ Message ๋ฐ์กํ๊ธฐ (3) | 2022.03.27 |
---|---|
[Kotlin] - Class(ํด๋์ค) (0) | 2021.10.17 |
๋๊ธ