๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Kotlin

Kotlin - Scope functions (let, with, run, apply, also)

by ์ฃผ๋ฐœ2 2024. 12. 15.
๋ฐ˜์‘ํ˜•

์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•ญ์ƒ ํ—ท๊ฐˆ๋ ธ๋˜ Scope functions ์— ๋Œ€ํ•ด ์ •๋ฆฌํ•ด ๋ณด๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค.

 

์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๋‹ค ๋ณด๋ฉด ๊ต‰์žฅํžˆ ์ž์ฃผ ์ ‘ํ•˜๊ณ  ์‚ฌ์šฉํ•  ๊ฐœ๋…๋“ค์ด๊ธฐ์— ์ด๋ฒˆ ๊ธฐํšŒ์— ํ™•์‹คํžˆ ์ •๋ฆฌํ•˜๊ณ , ์–ด๋–ค ์ƒํ™ฉ์— ์–ด๋–ค ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ ํ•ฉํ• ์ง€ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.

 

Scope functions

๊ธฐ๋ณธ์ ์œผ๋กœ Scope functions๋Š”, ์ฝ”๋“œ ๋ธ”๋ก์„ ์‹คํ–‰ํ•˜๋Š” ํŠน์ • ๊ฐ์ฒด์— ๋Œ€ํ•ด ๋™์ผํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ถ€๋Š” ๋žŒ๋‹ค ํ‘œํ˜„์‹์ด ์ œ๊ณต๋˜๊ณ , ๊ฐ์ฒด์˜ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ ๊ฐ์ฒด์— ์ ‘๊ทผ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. (this, it)

 

์ฝ”ํ‹€๋ฆฐ์˜ Scope functions์—๋Š” let, run, with, apply, also 5๊ฐ€์ง€์˜ ํ•จ์ˆ˜๋“ค์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

basic vs let

์œ„ ๋‘ ์ฝ”๋“œ๋Š” ๋™์ผํ•œ ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, 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 '?.let'

์œ„ ์˜ˆ์ œ์ฒ˜๋Ÿผ nullable ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด null check ์—ฐ์‚ฐ์ž์ธ '?'๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋žŒ๋‹ค์— ์žˆ๋Š” ์ž‘์—…๊ณผ ํ•จ๊ป˜ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

'?.let'์„ ํ†ตํ•ด let์˜ block์€ ์ˆ˜์‹  ๊ฐ์ฒด๊ฐ€ null์ด ์•„๋‹ ๋•Œ๋งŒ ์ˆ˜ํ–‰๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

 

nullable (not null vs null)

 

with

  • with๋Š” ํ™•์žฅ ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ, ์ˆ˜์‹  ๊ฐ์ฒด๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
  • ๋ฐ˜ํ™˜ ๊ฐ’์„ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์„ ๋•Œ, with๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์•„๋ž˜ run๊ณผ ๊ฑฐ์˜ ๋™์ผํ•˜์ง€๋งŒ, run์€ ํ™•์žฅ ํ•จ์ˆ˜๋กœ ์‚ฌ์šฉ๋˜๋‚˜ with๋Š” ์ˆ˜์‹  ๊ฐ์ฒด(receiver)๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋ฐ›์•„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ฐจ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

run vs with

์œ„ ์ฝ”๋“œ์—์„œ run๊ณผ with์˜ ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•ฉ๋‹ˆ๋‹ค. 

 

run

  • run์€ ์ˆ˜์‹  ๊ฐ์ฒด๋กœ this๋ฅผ ์‚ฌ์šฉํ•˜๋‚˜, ์ˆ˜์‹  ๊ฐ์ฒด ์—†์ด๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (์ˆ˜์‹  ๊ฐ์ฒด ๋ช…์‹œ ํ•„์ˆ˜)
  • ๋˜ํ•œ run์€ with์™€ ๋™์ผํ•˜์ง€๋งŒ, run์€ ํ™•์žฅ ํ•จ์ˆ˜๋กœ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • run์€ ๋žŒ๋‹ค๊ฐ€ ๊ฐ์ฒด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ๋ฐ˜ํ™˜ ๊ฐ’์„ ๊ณ„์‚ฐํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

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

๋Œ“๊ธ€