Spring Framework/๐Ÿ“› ์—๋Ÿฌ ๊ธฐ๋ก

[๐Ÿ“› Error] Variable used in lambda expression should be final or effectively final ์—๋Ÿฌ

soogoori 2023. 8. 31. 16:28

์ž๋ฐ”์—์„œ stream()์„ ์‚ฌ์šฉํ•ด orderProductOption์— ์žˆ๋Š” orderProduct๋ฅผ ์„ค์ •ํ•ด์ฃผ๋Š” ๊ณผ์ •์—์„œ

"Variable used in lambda expression should be final or effectively final" ์—๋Ÿฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋ฉฐ orderProduct์— ๋นจ๊ฐ„ ๋ฐ‘์ค„์ด ๊ทธ์–ด์กŒ๋‹ค.

๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋‚ด์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋ณ€์ˆ˜๊ฐ€ final ๋˜๋Š” effectively final์ด ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.

 

๋”๋ณด๊ธฐ

๐Ÿ‘€ effectively final : ๋ณ€์ˆ˜๊ฐ€ ์‹ค์ œ๋กœ 'final' ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ์ง€ ์•Š๋”๋ผ๋„ ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋‚ด์—์„œ ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์ด๋‹ค.

int x = 10;
Consumer<Integer> consumer = (value) -> {
    // x = x + 5; // ์ปดํŒŒ์ผ ์—๋Ÿฌ: Effectively final ๋ณ€์ˆ˜๋ฅผ ๋ณ€๊ฒฝํ•˜๋ ค๊ณ  ํ•จ
    System.out.println(value);
};

consumer.accept(x);

์œ„์˜ ์ฝ”๋“œ์—์„œ x ๋ณ€์ˆ˜๋Š” ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ 10์ด ํ• ๋‹น๋˜์—ˆ๊ณ  ๋‚˜์ค‘์— ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ effectively final ์ด๋‹ค. (์‚ฌ์šฉํ•œ ์ดํ›„์— ๋ณ€๊ฒฝ๋˜์–ด๋„ ์•ˆ๋จ !)

effectively final์„ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๋™์ž‘์„ ๋ณด์žฅํ•œ๋‹ค.

 

๐Ÿ‘€ ์—๋Ÿฌ ํŒŒ์•…ํ•˜๊ธฐ

๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์™ธ๋ถ€ ๋ฒ”์œ„์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด ๋ณ€์ˆ˜๋Š” final์ฒ˜๋Ÿผ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค.

๊ทธ ์ด์œ ๋Š” "์ฝ”๋“œ ์˜ˆ์ธก์„ฑ ๋ฐ ์•ˆ์ •์„ฑ""์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ", "๋žŒ๋‹ค ์บก์ณ๋ง" ๊ณผ ์—ฐ๊ด€๋˜์–ด์žˆ๋‹ค. 

 

๐Ÿ‘‰ ์Šค๋ ˆ๋“œ ์•ˆ์ •์„ฑ์ด๋ž€ ? 

์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒฝ์šฐ, ๋žŒ๋‹ค ํ‘œํ˜„์‹ ๋‚ด๋ถ€์—์„œ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ๋ณ€์ˆ˜๋ฅผ ๊ณต์œ ํ•˜๋ฉด ๋ณต์žกํ•œ ๋™๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ์Šค๋ ˆ๋“œ ๊ฐ„์— ์ด ๋ณ€์ˆ˜ ๊ฐ’์„ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ณ  ์ˆ˜์ •์ด ์–ธ์ œ ์ผ์–ด๋‚ ์ง€ ์•Œ ์ˆ˜ ์—†๊ฒŒ ๋˜๋ฏ€๋กœ final๋กœ ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค.  

 

๐Ÿ‘‰ ๋žŒ๋‹ค ์บก์ณ๋ง์ด๋ž€ ? 

๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋Š” ํž™์—, ์ง€์—ญ ๋ณ€์ˆ˜๋Š” ์Šคํƒ์— ์ €์žฅ๋œ๋‹ค.

์Šคํƒ ์˜์—ญ์€ ํž™ ์˜์—ญ๊ณผ ๋‹ฌ๋ฆฌ ์Šค๋ ˆ๋“œ๋ผ๋ฆฌ ๊ณต์œ ๋˜์ง€ ์•Š๋Š” ์˜์—ญ์ด๋ฏ€๋กœ ์™ธ๋ถ€ ์Šค๋ ˆ๋“œ์—์„œ ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋žŒ๋‹ค ํ‘œํ˜„์‹์€ ์™ธ๋ถ€ ๋ฒ”์œ„์˜ ๋ณ€์ˆ˜์— ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์Šคํƒ ์˜์—ญ์— ์žˆ๋Š” ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์—ญ ๋ณ€์ˆ˜์˜ ๋ณต์‚ฌ๋ณธ์„ ์ œ๊ณตํ•ด ๋žŒ๋‹ค ํ‘œํ˜„์‹์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ์ค€๋‹ค.>

์ด๊ฒƒ์ด Lambda Capturing ์ด๋‹ค !

 

๐Ÿ‘‰ ์›๋ณธ ๊ฐ’์ด ๋ฐ”๋€Œ๋ฉด ๋ณต์‚ฌ๋ณธ์— ์žˆ๋Š” ๊ฐ’๊ณผ์˜ ๋™๊ธฐํ™”๊ฐ€ ๋ณด์žฅ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๋™์‹œ์„ฑ ์ด์Šˆ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ final๋กœ ์„ค์ •ํ•ด์•ผํ•œ๋‹ค.

 


 

๐Ÿ‘ฉ‍๐Ÿ”ง ์—๋Ÿฌ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

ํ•ด๊ฒฐ๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค.

๋žŒ๋‹ค์‹์„ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— finalOrderProduct ๋ณ€์ˆ˜๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•˜๊ณ  ์ด ๋ณ€์ˆ˜ ๊ฐ’์— ๊ธฐ์กด์— ์‚ฌ์šฉํ•˜๋ ค๋˜ orderProduct ๊ฐ’์„ ํ• ๋‹นํ•œ ํ›„ finalOrderProduct๋กœ setOrderProduct ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

 

 

์ฐธ๊ณ 

https://www.baeldung.com/java-lambda-effectively-final-local-variables

https://bcp0109.tistory.com/319