1. var란?
2018년 3월에 출시된 Java 10부터 var를 지원합니다.
var i = 1; // int로 추론
var str = "Java"; // String으로 추론
var list = new ArrayList<String>(); // ArrayList<String>으로 추론
var는 지역변수를 선언할 때 초깃값을 통하여 데이터 타입을 추론합니다.
int var = 1; // 식별자로 사용 가능
var는 예약된 타입 이름으로 키워드가 아니기 때문에 식별자로 사용할 수 있습니다.
예제만으로는 이해하기 힘들 것 같아서 아래에 JEP 286: Local-Variable Type Inference에서 가져온 관련 내용을 덧붙입니다.
The identifier var is not a keyword; instead it is a reserved type name. This means that code that uses var as a variable, method, or package name will not be affected; code that uses var as a class or interface name will be affected (but these names are rare in practice, since they violate usual naming conventions).
2. 사용 예제
// 기존 코드
Map<String, List<String>> countryToCity = new HashMap<>();
// ...
for (Map.Entry<String, List<String>> citiesInCountry : countryToCity.entrySet()) {
List<String> cities = citiesInCountry.getValue();
// ...
}
// var를 사용한 코드
var countryToCity = new HashMap<String, List<String>>();
// ...
for (var citiesInCountry : countryToCity.entrySet()) { // for each문에서 사용 가능
var cities = citiesInCountry.getValue();
// ...
}
var를 사용하면 위와 같이 코드 양을 줄일 수 있습니다.
var는 for each문에서도 사용할 수 있으며, C++의 auto와 비슷하게 사용 가능합니다.
Object productInfo = new Object() {
String name = "Apple";
int total = 30;
};
System.out.println("name = " + productInfo.name + ", total = " + productInfo.total);
익명 클래스를 만드는 경우 필드를 추가할 수 있지만, 다른 곳에서 해당 필드를 참조할 수 없으므로, 위의 코드는 5번 라인에서 에러를 발생시킵니다.
하지만, 위의 코드에서 맨 처음 Object를 var로 바꾸면 익명 클래스에 선언된 필드를 사용할 수 있으므로 에러가 나지 않습니다.
3. 주의해야 할 점
public class VarDemo {
// var a = 1; // var는 지역변수에서만 사용 가능
public static void main(String[] args) {
// var x = 1, y = 2; // ,와 함께 사용 불가능
// var str = null; // null은 String에서만 사용할 수 있는 것이 아니므로 타입 추론 불가능
// var err; // var를 사용할 때는 초기화를 바로 해야 함 (타입 추론이 불가능하므로)
// err = 1;
// var l = () -> {} // 람다식에서 사용 불가능
}
// void test(var x) {} // 메소드의 인수타입은 지역변수여도 var 사용 불가
}
위 예제에서 사용한 var는 모두 해당 라인 주석의 이유로 에러를 발생시킵니다.
4. 참고한 사이트
'Java' 카테고리의 다른 글
[Java 14] 개선된 switch 문(Enhanced Switch Expressions) (0) | 2020.11.08 |
---|