Java 10에서 도입된 var
는 변수를 선언할 때 타입을 생략할 수 있으며, 컴파일러가 타입을 추론합니다.
컴파일 시점에 var
를 초기화된 값을 보고 추론에서 바이트코드에 명시적으로 타입이 결정이 되있는 상태라, 타입추론 변수를 읽을 때 마다 타입을 알아내기위한 연산을 하지 않기때문에 런타임 오버헤드가 없습니다.
또한 var
로 선언된 변수는 중간에 타입이 절대 변경되지 않습니다.
var
의 특징var
은 초기값이 있는 지역 변수의 타입 추론을 허용합니다.var
적용 이후로도 Java는 여전히 정적 언어이며 지역 변수 타입 추론하기에 충분한 정보가 있어야 합니다. 그렇지 않으면 컴파일러에서 오류가 발생합니다.var
를 사용할 수 있습니다. 즉 var
타입을 지정함으로 인해, 아래처럼 키워드 앞에만 선언할 수 있는 어노테이션을 추가할 수 있습니다.List<String> list = s -> System.out.println(s);
List<String> list = (var s) -> System.out.println(s);
List<String> list = ((@NotNull var s) -> System.out.println(s);
var
사용 시 주의점 // 지역변수에서만 사용 가능합니다.
class JavaLocalVariable {
public var str = "hello"; // compile error
public var list = new ArrayList<String>(); // error
}
// stream에서 사용시에는 아래와 같은 상황에 주의해야합니다.
var x = list.stream()
.findFirst()
.map(String::length)
.orElse(0);
// 초기화를 하지 않으면 추론이 불가하기 때문에 'var'를 사용할 수 없습니다.
var n; // error
// 또한 어떤 객체든 null이 할당될 수 있어 타입추론이 불가하므로, null 로 초기화를 할 수 없습니다.
var list = null; // error
public var = "hello";
// 람다 표현식에는 명시적인 대상 유형이 필요합니다.
var p = (String s)-> System.out.println(S);
// 배열을 선언할 때 명시적으로 타입을 정해야합니다.
var arr = {1, 2, 3}; // error
JEP 286: Local-Variable Type Inference
Java 10 에서 var 재대로 사용하기