[๐ Error] Variable used in lambda expression should be final or effectively final ์๋ฌ
์๋ฐ์์ 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