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

๋นˆ ๊ตฌ๋ฉ ์ฑ„์šฐ๊ธฐ

[ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…][Java] ๋Š๊ธ‹ํ•œ ํ‰๊ฐ€ Lazy Evaluation

์ถœ์ฒ˜

ChatGPT

Gemini


Lazy Evaluation(๋Š๊ธ‹ํ•œ ํ‰๊ฐ€)๋ž€?

Lazy evaluation์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์—์„œ ํ‘œํ˜„์‹์˜ ํ‰๊ฐ€๋ฅผ ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ๋ฏธ๋ฃจ๋Š” ๊ธฐ๋ฒ•์„ ๋งํ•œ๋‹ค. ์ฆ‰, ๊ฐ’์ด ์‹ค์ œ๋กœ ์‚ฌ์šฉ๋  ๋•Œ๊นŒ์ง€ ๊ณ„์‚ฐ์„ ์—ฐ๊ธฐํ•˜์—ฌ, ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ์ค„์ด๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. ์ž๋ฐ”์—์„œ Iterator๋Š” ์ด๋Ÿฌํ•œ "๋Š๊ธ‹ํ•œ ํ‰๊ฐ€" ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ์ปฌ๋ ‰์…˜์˜ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์”ฉ ์ ‘๊ทผํ•˜๊ณ , ํ•„์š”ํ•œ ๋•Œ๋งŒ ๋‹ค์Œ ์š”์†Œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜จ๋‹ค.

 

Lazy Evaluation์˜ ์ž‘๋™ ๋ฐฉ์‹

1. ์ง€์—ฐ๋œ ๊ณ„์‚ฐ

ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ณ„์‚ฐ์„ ํ”ผํ•˜๊ณ , ์‹ค์ œ๋กœ ๊ทธ ๊ฐ’์ด ํ•„์š”ํ•  ๋•Œ๊นŒ์ง€ ํ‰๊ฐ€๋ฅผ ์ง€์—ฐํ•œ๋‹ค.

2. ๋ฉ”๋ชจ๋ฆฌ ์ ˆ์•ฝ

๋ชจ๋“  ๊ฐ’์„ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ํฐ ๋ฐ์ดํ„ฐ ์ŠคํŠธ๋ฆผ์ด๋‚˜ ๋ฌดํ•œ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

3. ์„ฑ๋Šฅ ์ตœ์ ํ™”

ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฒƒ์€ ํŠนํžˆ ์„ฑ๋Šฅ์ด ์ค‘์š”ํ•œ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋‚˜ ์‹ค์‹œ๊ฐ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์œ ์šฉํ•˜๋‹ค.

 

์ž๋ฐ”์—์„œ์˜ Lazy Evaluation ์‚ฌ์šฉ ์‚ฌ๋ก€

1. Iterator

Iterator๋Š” ์ปฌ๋ ‰์…˜์˜ ๋ชจ๋“  ์š”์†Œ๋ฅผ ์ฆ‰์‹œ ๊ฐ€์ ธ์˜ค๋Š” ๋Œ€์‹ , hasNexxt()์™€ next() ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์š”์†Œ๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•œ๋‹ค.

2. Stream API

Java 8๋ถ€ํ„ฐ ๋„์ž…๋œ Stream API๋Š” lazy eveluation์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, filter(), map(), sorted()์™€ ๊ฐ™์€ ์ค‘๊ฐ„ ์—ฐ์‚ฐ์€ ์ŠคํŠธ๋ฆผ์˜ ์š”์†Œ๋ฅผ ์ง€์—ฐ ํ‰๊ฐ€ํ•˜์—ฌ, ์ตœ์ข… ์—ฐ์‚ฐ(forEach, collect ๋“ฑ)์ด ํ˜ธ์ถœ๋  ๋•Œ๋งŒ ์‹ค์ œ๋กœ ์ฒ˜๋ฆฌ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ค‘๊ฐ„ ์—ฐ์‚ฐ์˜ ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");

// Lazy evaluation with Stream API
names.stream()
     .filter(name -> {
         System.out.println("Filtering: " + name);
         return name.length() > 3;
     })
     .map(name -> {
         System.out.println("Mapping: " + name);
         return name.toUpperCase();
     })
     .forEach(name -> System.out.println("ForEach: " + name));

 

์œ„ ์ฝ”๋“œ์—์„œ๋Š” filter์™€ map ์—ฐ์‚ฐ์ด forEach๊ฐ€ ํ˜ธ์ถœ๋˜๊ธฐ ์ „๊นŒ์ง€๋Š” ์‹ค์ œ๋กœ ์ˆ˜ํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰, ์ถœ๋ ฅ์€ "ํ•„ํ„ฐ๋ง"๊ณผ "๋งคํ•‘"์ด ๊ฐ๊ฐ์˜ ์š”์†Œ์— ๋Œ€ํ•ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ˆ˜ํ–‰๋˜๋ฉฐ, "๋Š๊ธ‹ํ•œ ํ‰๊ฐ€"๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

3. ๋‹จ์ถ• ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž (&&, ||)

&& ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ, ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ false์ด๋ฉด ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ํ‰๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

|| ์—ฐ์‚ฐ์ž์˜ ๊ฒฝ์šฐ, ์™ผ์ชฝ ํ”ผ์—ฐ์‚ฌ์ž๊ฐ€ true์ด๋ฉด ์˜ค๋ฅธ์ชฝ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ํ‰๊ฐ€ํ•˜์ง€ ์•Š๋Š”๋‹ค.

4. ์‚ผํ•ญ ์—ฐ์‚ฐ์ž (?:)

์กฐ๊ฑด์‹์ด true์ด๋ฉด ์ฒซ ๋ฒˆ์งธ ๊ฐ’์„, false ์ด๋ฉด ๋‘ ๋ฒˆ์งธ ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ํ•„์š”ํ•œ ๊ฐ’๋งŒ ๊ณ„์‚ฐํ•œ๋‹ค.

 

Laxy Evaluation์˜ ์žฅ๋‹จ์ 

์žฅ์ 

์„ฑ๋Šฅ ํ–ฅ์ƒ

ํ•„์š”ํ•  ๋•Œ๋งŒ ๊ณ„์‚ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๊ณ„์‚ฐ์„ ์ค„์—ฌ ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ

๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ์ค„์ด๊ณ , ํŠนํžˆ ํฐ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋‚˜ ๋ฌดํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์—์„œ ์œ ์šฉํ•˜๋‹ค.

์ฆ‰๊ฐ์ ์ธ ํ”ผ๋“œ๋ฐฑ

์ฒ˜๋ฆฌ ์ค‘๊ฐ„์— ํ•„์š”ํ•œ ๊ฐ’์„ ์ฆ‰์‹œ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์–ด ์‹ค์‹œ๊ฐ„ ์‹œ์Šคํ…œ์—์„œ ์œ ๋ฆฌํ•˜๋‹ค.

๋‹จ์ 

๋””๋ฒ„๊น…์ด ์–ด๋ ค์›€

ํ‰๊ฐ€๊ฐ€ ์ง€์—ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ๋ฅผ ์ฐพ๊ณ  ์ˆ˜์ •ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

์ฝ”๋“œ์˜ ๋ณต์žก์„ฑ ์ฆ๊ฐ€

"๋Š๊ธ‹ํ•œ ํ‰๊ฐ€"๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋„๋Š” ์ข…์ข… ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ๋‹ค.

 

๊ฒฐ๋ก 

Java์˜ "๋Š๊ธ‹ํ•œ ํ‰๊ฐ€"๋Š” ํŠนํžˆ Stream API์™€ Iterator์™€ ๊ฐ™์€ API์—์„œ ๋งค์šฐ ์œ ์šฉํ•˜๋ฉฐ, ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ํšจ์œจ์„ฑ ํ–ฅ์ƒ์„ ์œ„ํ•œ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด๋‹ค. ํ”„๋กœ๊ทธ๋ž˜๋จธ๋Š” ์ด ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ์ ์ ˆํžˆ ํ™œ์šฉํ•จ์œผ๋กœ์จ, ๋” ํšจ์œจ์ ์ด๊ณ  ์„ฑ๋Šฅ ์ข‹์€ Java ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ์ˆ˜ ์žˆ๋‹ค.