var는 Java10부터 도입된 지역 변수에 대한 타입 추론을 위한 키워드입니다.
var는 컴파일 시점에 컴파일러에 의해 타입이 추론됩니다. 컴파일 타임에 var 키워드를 이미 적절한 타입으로 변경하기 때문에 런타임 시점에는 어떤 추가연산도 하지 않아 성능에 영향을 주지 않습니다.
var a = 10;
a = "w"; // 컴파일 에러. 실행하지 않아도 불가능하다는 걸 알고 있음
// String a = "HelloWorld";
var a = "HelloWorld";
// List<String> lst = new ArrayList<String>();
var lst = new ArrayList<String>();
for(var a : aList) {
System.out.println(a);
}
익명클래스 변수를 var로 선언할 수 있습니다.
var function = new Function<Integer, Boolean>() {
@Override
public Boolean apply(Integer integer) {
return integer > 0;
}
};
하지만 이 익명 클래스를 람다로 변경했을 경우 var사용이 불가능합니다.
// 컴파일 에러
var function = integer -> true;
Function<Integer,Boolean>이 될 수도 있지만 Predicate<Integer>가 될 수도 있기 때문에 var로 타입 추론이 불가능합니다.람다식의 파라미터에 var을 사용할 수 있습니다.
// 가능
Stream.of(1, 2, 3, 4)
.map((@NotNull var a) -> a * 2)
.collect(Collectors.toList());
// 불가능
Stream.of(1, 2, 3, 4)
.map(@NotNull a -> a * 2)
.collect(Collectors.toList());
// 가능
Stream.of(1, 2, 3, 4)
.map((@NotNull Integer a) -> a * 2)
.collect(Collectors.toList());
public class MyClass{
var a = 10; // 불가능
}
var a; // 불가능
var a = null; // 불가능