[Java 10] var

나르·2022년 5월 2일
0

JAVA

목록 보기
9/18
post-thumbnail


Java 10에서 도입된 var는 변수를 선언할 때 타입을 생략할 수 있으며, 컴파일러가 타입을 추론합니다.
컴파일 시점에 var를 초기화된 값을 보고 추론에서 바이트코드에 명시적으로 타입이 결정이 되있는 상태라, 타입추론 변수를 읽을 때 마다 타입을 알아내기위한 연산을 하지 않기때문에 런타임 오버헤드가 없습니다.
또한 var로 선언된 변수는 중간에 타입이 절대 변경되지 않습니다.


var 의 특징

  1. var은 초기값이 있는 지역 변수의 타입 추론을 허용합니다.
  2. 메서드의 반환 유형, 멤버 변수, 필드 선언, 생성자 형식 변수 또는 다른 종류의 변수 선언에는 사용할 수 없다.
  3. var 적용 이후로도 Java는 여전히 정적 언어이며 지역 변수 타입 추론하기에 충분한 정보가 있어야 합니다. 그렇지 않으면 컴파일러에서 오류가 발생합니다.
  4. Java 11에서는 람다 표현식에 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
 

Ref.

JEP 286: Local-Variable Type Inference
Java 10 에서 var 재대로 사용하기

profile
💻 + ☕ = </>

0개의 댓글