public class Main {
private int instanceVar; //์ธ์คํด์ค ๋ณ์
private static int classVar; //ํด๋์ค ๋ณ์
public static void main(String[] args) {
method(0);
}
public static void method(int parameter) {
int localVar; //์ง์ญ ๋ณ์
Runnable r = (() -> {
localVar = 1;
instanceVar = 1;
classVar = 1;
parameter = 1;
});
r.run();
}
}์์ ์ฝ๋ ํ
์คํธ ๊ฒฐ๊ณผ, ์ง์ญ๋ณ์์, ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ
"Variable used in lambda expression should be final or effectively final" ์ค๋ฅ ๋ฐ์
์ธ์คํด์ค ๋ณ์์ ๊ฒฝ์ฐ, "Non-static field 'instanceVar' cannot be referenced from a static context" ์ค๋ฅ ๋ฐ์
public class Main {
private String instanceVar; //์ธ์คํด์ค ๋ณ์
private static String classVar; //ํด๋์ค ๋ณ์
public static void main(String[] args) {
method("Hi");
}
public static void method(String parameter) {
String localVar; //์ง์ญ ๋ณ์
Runnable r = (() -> {
localVar = "Hello";
instanceVar = "Hello";
classVar = "Hello";
parameter = "Hello";
});
r.run();
}
}String์ผ๋ก ํ ์คํธ ํ์ ๊ฒฝ์ฐ, intํ๊ณผ ๋์ผํ๊ฒ ์ค๋ฅ ๋ฐ์
public class Main {
private List<String> instanceVar; //์ธ์คํด์ค ๋ณ์
private static List<String> classVar; //ํด๋์ค ๋ณ์
public static void main(String[] args) {
method(Arrays.asList("a", "b", "c"));
}
public static void method(List<String> parameter) {
List<String> localVar; //์ง์ญ ๋ณ์
Runnable r = (() -> {
System.out.println(Thread.currentThread().getName());
localVar.add("d");
instanceVar.add("d");
classVar.add("d");
parameter.add("d");
});
r.run();
}
}List๋ก ํ์์ ๊ฒฝ์ฐ, ์ง์ญ๋ณ์๋ "Variable 'localVar' might not have been initialized" ์ค๋ฅ ๋ฐ์
์ธ์คํด์ค ๋ณ์๋ "Non-static field 'instanceVar' cannot be referenced from a static context" ์ค๋ฅ ๋ฐ์
์ง์ญ๋ณ์์ ๋งค๊ฐ๋ณ์์ ๊ฒฝ์ฐ ๋๋ค ๋ด์์๋ final๋ก ๊ฐ์ฃผ๋์ด ์์ ์ ์ค๋ฅ ๋ฐ์, ๋จ ReferenceType์ ๊ฒฝ์ฐ initialized ๋ ๊ฐ์ด๋ผ๋ฉด ์์ ๊ฐ๋ฅ, ์ค์ value๋ Heap์์ญ์ ์ ์ฅ๋๊ธฐ ๋๋ฌธ
ํ ์คํธ ๊ฒฐ๊ณผ๋ฅผ ํ ๋๋ก ์ถ๋ก ํ ๋ด์ฉ์ด๊ธฐ ๋๋ฌธ์, ์๊ฒฌ์ด๋ ์ด์ ์ฌํญ ์์ผ์๋ค๋ฉด ์์ ๋ถํ๋๋ฆฝ๋๋ค