Develop/java,spring

JAVA var 키워드

kudl 2020. 11. 18. 12:44

var 키워드

JAVA 10 에서 var 키워드가 추가되었다. JEP 286 : Local-Variable Type Inference (지역 변수 유형 추론)에 따라 만들어 졌다.
var는 키워드 처럼 보이지만 실은 키워드가 아니다. var는 타입의 이름이다.

var var = "a";

키워드가 아니기 때문에 위와 같은 코드도 정상적으로 작동을 한다. 즉, 변수, 메서드 또는 패키지 이름으로 var를 사용하는 코드는 영향을 받지 않는다. var 키워드는 지역 변수 유형 추론을 허용한다. 즉, 컴파일러가 지역 변수의 유형을 추론한다.

var가 출현하게된 이유

JAVA 8이 출시되고 람다에서 타입 추론(type inference)을 할 수 있었다.

BinaryOperator <Integer> add = (x, y)-> x + y;

이 예제에서 x와 y는 정수이지만 정수로 명시적으로 선언하지 않아도 컴파일러가 이것을 추론한다.
Scala, Kotlin, Go 기타 JAM 언어로 코딩한 경우 일종의 로컬 변수가 있다. JAVA에서 var 예약어를 사용하면 중복을 줄임으로써 코드를 간결하게 만들 수 있다.

// var 미사용
ByteArrayOutputStream bos = new ByteArrayOutputStream ();

// var 사용
var bos = new ByteArrayOutputStream ();


// var 미사용
try (Stream <Book> 데이터 = dbconn.executeQuery (sql)) {
    return data.map (...) .filter (...) .findAny ();
}

// var 사용
try (var books = dbconn.executeQuery (query)) {
    return books.map (...) .filter (...) .findAny ();
}

위 예제에서 ByteArrayOutputStream은 두번 반복 되지만 var를 사용하여 제거 할 수 있다.

var 키워드 특징

  1. var 키워드는 지역 변수 타입 추론을 허용한다.
  2. 형식 변수 선언 및 메서드의 반환 유형, 멤버 변수 또는 필드 선언, 생성자 형식 변수 또는 다른 종류의 변수 선언에는 사용할 수 없다.
  3. var 키워드 적용 이후로도 Java는 여전히 정적 언어이며 지역 변수 타입 추론하기에 충분한 정보가 있어야 한다. 그렇지 않으면 컴파일러에서 오류가 발생한다.
  4. Java 11에서는 람다 표현식에 var를 사용할 수 있다. 즉 var 타입을 지정함으로 인해 어노테이션을 추가할 수 있다.
    list.stream()
     .map((@NotNull var s) -> s.toLowerCase())
     .collect(Collectors.toList());

var 주의사항

// 어떤 타입인지 알 수 있는 방법이 없을때는 사용하면 안된다.
var data = getSomething();

// stream에서 사용시에는 아래와 같은 상황에 주의해야한다.
var x = list.stream()
  .findFirst()
  .map(String::length)
  .orElse(0);

// 초기 값 할당 없이 변수에 'var'를 사용할 수 없다.
var n; 

// null 값은 사용할 수 없다.
var list = null; 

public var = "hello";

// 람다 표현식에는 명시적인 대상 유형이 필요하다. 배열 이니셜 라이저의 경우도 마찬가지이다.
var p = (String s)-> s.length ()> 10; 

// 배열 초기화시 명시적인 대상 유형이 필요하다.
var arr = {1, 2, 3}; 

var 사용법

var str = "Java 10"; // 문자열 추론
var list = new ArrayList (); // ArrayList 추론
var stream = list.stream (); // Stream 추론
var list = List.of (1, 2.0, "3")

기타

지역 변수 또는 최종 변수 val 및 let에 해당하는 불변성은 아직 Java 10에서 지원되지 않는다.

'Develop > java,spring' 카테고리의 다른 글

Java Stream GroupingBy 사용  (0) 2020.11.26
JAVA 버전별 특징  (1) 2020.11.20
JPA 순환 참조 해결 방법  (0) 2020.11.17
Intellij 단축키  (0) 2020.11.12
QueryDsl 설정부터 사용해보기  (0) 2020.11.12