Language/JAVA

2주차 과제 : 타입 추론, var

타입 추론, var

 

타입 추론

 

타입을 미리 선언하지 않고 리터럴 값으로 컴파일러가 이를 추론하게 하는 것

 

개발자가 종종 필요하지 않은 지역 변수 유형의 매니페스트 선언을 제거 할 수 있도록함으로써

정적 유형 안전성에 대한 Java의 노력을 유지하면서 Java 코드 작성과 관련된 의식을 줄임으로써 개발자 경험을 개선하고자 합니다.

이 기능은 예를 들어 다음과 같은 선언을 허용합니다.

중복을 줄여서 가독성 향상이 주요 목적

 

var list = new ArrayList<String>();  // infers ArrayList<String>
var stream = list.stream();          // infers Stream<String>

Var

 

var는 키워드 처럼 보이지만 실은 키워드가 아니다. var는 타입의 이름이다.

var var = "variable";

키워드가 아니기 때문에 위와 같은 코드도 정상적으로 작동을 한다.

즉, 변수, 메서드 또는 패키지 이름으로 var를 사용하는 코드는 영향을 받지 않는다.

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를 사용하여 제거 할 수 있다.

 

특징

 

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

 

사용법

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

 

주의 사항

// 어떤 타입인지 알 수 있는 방법이 없을때는 사용하면 안된다.
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};