Java에서 var
키워드는 Java 10부터 도입된 지역 변수 형식 추론 기능입니다. var
를 사용하면 Java 컴파일러가 변수의 타입을 초기화 식(expression)에서 유추할 수 있게 해줍니다.
var
의 주요 특징지역 변수에만 사용: var
는 오직 지역 변수에서만 사용할 수 있습니다. 클래스의 필드, 메소드의 매개변수, 반환 타입에서는 사용할 수 없습니다.
타입 추론: 변수의 타입은 초기화 시에 컴파일러에 의해 결정됩니다. 변수에 할당된 값의 타입을 기반으로 컴파일러가 타입을 추론합니다.
명확한 초기화 필요: var
로 선언된 변수는 반드시 초기화되어야 합니다. 컴파일러는 초기화 식을 통해 타입을 추론하기 때문에, 초기화 없이는 타입을 결정할 수 없습니다.
불변성이 아님: var
로 선언된 변수는 final
이나 불변(immutable) 타입이 아닙니다. 변수의 값은 변경할 수 있지만, 다른 타입의 객체를 재할당할 수는 없습니다.
var
사용 예시 @Test
void t8() {
// 1
var number = 42;
var message = "Hello, Java!";
// 2
var list = new ArrayList<String>();
list.add("Apple");
list.add("Banana");
// 3
var map = new HashMap<String, Integer>();
map.put("Apple", 5);
map.put("Banana", 10);
//4
int[] arr = new int[]{1,2,3};
for (var i : arr) {
}
}
기존에는 직접 int,List<>등 직접 타입을 명시해주어야 했다면 var를 이용할 경우 컴파일 시점에 알아서 타입을 추론하기에 위와 같이 코드를 적용할 수 있습니다.
1. null 초기화 불가능
var str = null;
var를 사용할 경우 null로 초기화가 불가능합니다.
- 초기화는 필수
var를 사용할 경우 초기화 값을 넣어줘야 합니다. 대입된 값을 보고 타입을 추론하기에 초기화 없이 사용이 불가능합니다.var str;
3.배열에는 사용 불가능
var arr = {1,2,3}; // 불가능 var arr = new int[]{1,2,3}; // 가능
배열에는 직접적으로 사용이 불가능합니다.
아래와 같이 new int[]{}로 생성한 경우에는 사용이 가능합니다.
4.람다에 사용 불가능
var lamda = () => {};
- 코드 가독성 향상?
var를 사용하다고 해서 코드의 가독성이 무조건 좋아지는 것은 아닙니다.(저의 경우에도 익숙치 않아서 그런지 가독성이 좋아졌다는 느낌은 받지 못하였습니다...)
Java에서var
키워드를 사용할 때 가독성이 향상되거나 저하될 수 있는 예시를 들어보겠습니다.가독성이 향상된 예시
// 복잡한 제네릭 타입 사용 예 Map<String, List<Map.Entry<String, Integer>>> complexMap = new HashMap<>(); // 'var' 사용 var complexMap = new HashMap<String, List<Map.Entry<String, Integer>>>();
이 경우,
var
를 사용함으로써 복잡한 제네릭 타입을 간결하게 표현할 수 있습니다.가독성이 저하된 예시
var f2 = f.logic1(i -> { //...로직 }).logic2(i -> { //...로직 }).logic3(i -> { //...로직 });
위와 같이 복잡한 코드가 있다고 가정한 경우
var
를 사용하면 해당 코드의 반환 타입이 무엇인지 코드만으로는 명확하지 않습니다. 이럴때는 직접 타입을 명시적으로 선언하는 것이 오히려 더 좋습니다.
var
는 코드를 간결하게 만들 수 있지만, 항상 그런 것은 아닙니다. 가독성을 유지하면서 var
를 사용하는 것이 중요합니다. 복잡한 타입이나 반복되는 타입 선언에서 var
를 사용하는 것은 유용하지만, 반환 타입이 명확하지 않은 메서드 호출의 결과나, 타입이 코드의 문맥에서 중요한 경우에는 var
사용을 피하는 것이 좋습니다.
var
의 도입으로 Java에서의 타입 선언이 더 유연하고 간결해졌으며, 특히 복잡한 타입 표현을 간단하게 만들어 줍니다. 그러나, 가독성과 명확성을 유지하는 것이 중요하므로 적절한 상황에서 적절하게 사용해야 합니다.