var란?
Java10에서 도입된 var는 초기화 값이 있는 지역 변수 선언 시 타입을 생략할 수 있으며, 컴파일러가 타입을 추론한다.
var는 키워드가 아닌 예약된 타입 이름(reserved type name)으로, 식별자로 사용할 수 있다. 즉, 아래와 같이 작성해도 문제가 발생하지 않는다.
var var = "Hello, World!";
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).
var 사용
// Java 9 이하
String str = "Hello, World!";
List<String> oceanCities = List.of("Moalboal", "Dahab", "Aqaba");
// Java 10 이상 - var keyword 사용
var str = "Hello, World!";
var oceanCities = List.of("Moalboal", "Dahab", "Aqaba");
타입 추론에 의해 str는 String 타입을, oceanCities는 List<String> 타입을 갖는다.
주의해야 할 점
1. 지역 변수에서만 사용
public class Foo {
private var str = "Hello, World!"; // 컴파일 에러
}
2. null 초기화 불가능
var str = null; // 컴파일 에러. null은 어떤 객체든 할당될 수 있으므로 타입 추론 불가능
3. 초기화 필요
var str; // 컴파일 에러. 초기화를 하지 않으면 타입 추론이 불가능
4. 배열, 람다식, 메서드 참조에 사용 불가능
// 아래 세 가지는 명시적인 대상 타입을 필요로 하므로 var를 사용할 수 없다.
var k = { 1 , 2 };
var f = () -> { };
var m = this::l;
장단점
장점
개발 생산성 향상
- var를 사용하면 변수의 타입을 명시적으로 선언할 필요가 없으므로 타입 이름을 일일이 작성하는 시간과 노력을 절약할 수 있다.
- 또한, 타입 변경이 필요한 경우에도 var를 사용하면 변수의 타입을 변경해야 하는 번거로움을 줄인다.
코드 가독성 향상
- var를 사용하면 코드가 더 간결해지고 가독성이 향상된다.
- 타입이 긴 경우에는 var를 사용하여 타입 선언을 생략함으로써 코드의 중복성을 줄일 수 있다.
구체적인 변수 이름 작성 유도
- 변수의 타입을 명시적으로 선언하지 않기 때문에 변수 이름이 중요해지는데, 개발자들이 더 구체적인 변수 이름을 작성하도록 유도한다.
단점
가독성 저하
- IDE 이외의 환경, 예를 들어 GitHub에서 코드를 읽을 때 가독성이 저하된다.
- 변수의 의도나 용도를 파악하기가 더 어려울 수 있다.
결론
var를 사용하는 것은 개발 생산성과 코드의 간결성을 향상시킬 수 있지만, 적절하게 사용해야 하며 가독성과 코드의 의도 파악을 위해 신중하게 선택해야 한다.
References
JEP 286: Local-Variable Type Inference
JEP 286: Local-Variable Type Inference Summary Enhance the Java Language to extend type inference to declarations of local variables with initializers. Goals We seek to improve the developer experience by reducing the ceremony associated with writing Java
openjdk.org
https://medium.com/@victorhsr/java-to-var-or-not-to-var-that-is-the-question-10efe4989320
'Coding' 카테고리의 다른 글
[Spring] @JsonInclude와 @JsonIgnore (0) | 2023.07.12 |
---|---|
[AWS S3] 여러 객체 삭제 (0) | 2023.07.10 |
[20230628] 오늘의 삽질 (0) | 2023.06.28 |
[REST API] UrlConnection vs. RestTemplate vs. WebClient (0) | 2023.06.24 |
[JAVA] Objects.isNull vs. object == null (0) | 2023.06.12 |