[ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ][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 ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ์ ์๋ค.