![](https://blog.kakaocdn.net/dn/edEWdK/btsEmOsnGRn/Cw7dAeGApuXqZKHcaJECsk/img.png)
var가 타입을 추론해 준다는 것은 알고 있었지만 부정적인 의견들이 많아 정적 언어인 자바에서는 자주 안 쓰는구나 하고 말았었는데 최근 코드 리뷰를 받으면서 이야기가 나오게 되었고 알고 안 쓰는 거랑 잘 모르는데 안 쓰는 건 차이가 있다고 생각이 들어 정리해 보고자 작성하게 되었습니다.
지역 변수 타입 추론
Java 10부터 지역 변수에 대한 Type Inference가 가능한 var 키워드를 제공해줍니다.
- var는 변수를 선언과 초기화가 동시에 일어날 때 타입을 생략할 수 있으며, 컴파일러가 타입을 추론합니다.
![](https://blog.kakaocdn.net/dn/b66uP8/btsEf1ApiR8/l7oKaRayXZDa998x0t5pdk/img.png)
문자열 변수에 정수를 할당하니 컴파일 에러가 나오는것을 볼 수 있었습니다.
- 컴파일 시점에 var에 들어갈 타입을 추론하고 바이트 코드에는 추론된 타입이 들어가기 때문에 런타임 오버헤드가 생기지 않습니다.
var는 키워드가 아니다.
어떠한 타입도 아니고 클래스에서 사용할 수 있는 예약어가 아니다.
![](https://blog.kakaocdn.net/dn/cG0dEA/btsEhGJkoGs/0yQftQaefowmLUAtO3F5s0/img.png)
- int를 변수 이름으로 만들 수는 없지만, var 라는 문자를 변수로 사용할 수 있다.
제약 사항
클래스의 멤버 변수를 선언할 때 사용할 수 없습니다. (지역 변수만 가능)
![](https://blog.kakaocdn.net/dn/bU6kAJ/btsEhWZwpcX/tA5TVvbWEcCKJ6lZ21ibIK/img.png)
초기화를 하지 않으면 어떤 타입인지 추론할 수 없기 때문에 컴파일 에러가 발생합니다.
![](https://blog.kakaocdn.net/dn/XUhi4/btsEeLR7JES/2zzNKJOhivMpt4VSzUedak/img.png)
즉, 컴파일 시점에 어떤 타입인지 추론할 수 없으면 컴파일 에러가 발생하게 되는데 null, 배열, 람다 표현식에서도 사용할 수 없습니다.
![](https://blog.kakaocdn.net/dn/diOUOT/btsEf6V2iUl/zWvUlekTwYznCK2d6TR77K/img.png)
- 어떤 객체든 null이 할당될 수 있기 때문에, 타입 추론을 할 수 없으며 컴파일 에러가 발생합니다
- 배열을 사용할 때도 타입 추론을 못하기 때문에 명시적으로 타입을 정해줘야 합니다.
![](https://blog.kakaocdn.net/dn/OpEkn/btsEkfKHWuT/pPEdKNQTK0yJ5k9BAjKWw0/img.png)
- 람다 표현식도 동일한 메서드 시그니처를 추론할 수 없기 때문에 명시적으로 정해줘야 합니다.
추가적으로 메소드의 파라미터, 리턴 타입으로 사용이 불가능합니다.
var를 어떻게 사용할 수 있을까?
for-each문에서 사용 가능하다.
- Intellij에서 Live Template로 활용할 수 있다.
![](https://blog.kakaocdn.net/dn/ed2Syh/btsEhJzjgAA/tcOVJZP8zSlV3AJPYIqeK1/img.png)
좌변 타입을 간략하게 var로 처리하고 우변에 시선을 좀 더 집중시킴으로써 가독성을 향상시킬 수 있다.
![](https://blog.kakaocdn.net/dn/cv6yrK/btsEkAnG0nu/gw3i94xlpnMsbZBfSMxz91/img.png)
![](https://blog.kakaocdn.net/dn/dPvZtZ/btsEhBacXZx/diqOHYlN5wZ0iKmTcJZcmK/img.png)
- 우변에 시선을 좀 더 집중시킬 수 있는건 사실이지만 이 가독성을 더 살리기 위해서는 변수명을 신경써야 한다.
람다에서 var 사용하기
키워드 앞에만 사용할 수 있는 어노테이션을 사용할 수 있다는 장점이 있다.
![](https://blog.kakaocdn.net/dn/bORFUD/btsElIZWLHR/kkQkzZOckIOksFthmtFXB0/img.png)
새로운 라이브러리들이 점점 더 많은 제네릭을 활용하면서 이러한 요소가 변수 선언에 오버헤드를 높이고 있어 var를 사용해서 좌변보다 우변에 좀 더 집중시킬 수 있다.
코드 리뷰를 받으면서 왜 var에 대해서 언급하셨는지 알거 같았다.
![](https://blog.kakaocdn.net/dn/1wnwo/btsEhJF2u3g/yW6h5NDuqnRlFz3DtGJ3rK/img.png)
- 제네릭이 길어져서 변수 선언에 오버헤드가 높은 코드
![](https://blog.kakaocdn.net/dn/mMijc/btsEhsq3qKg/7znvKg5VwkPw9WWbTxkbq1/img.png)
![](https://blog.kakaocdn.net/dn/olNAe/btsEhKdVUg6/fd2rKiNZv2ajqIRhynLqr0/img.png)
- 변수명으로 이해 가능한 코드(우변에 집중 시키는게 좋은 코드)
![](https://blog.kakaocdn.net/dn/besRQF/btsEkhWGktj/78bKROILDCn8MxP4XlRSW1/img.png)
var로 인해서 interface 대신 구현 타입을 무심하게 써버릴 수 있기 때문에 조심해서 사용하면 정적 언어인 자바에서도 var를 적절히 사용한다면 좋겠다는 생각이 들었습니다.
참조
Var keyword in Java
With Java 10 or +, we can use var keyword for declaration. At initialization, a type is going to be inferred by the compiler. What happens when the class I instantiate and assign to the variable de...
stackoverflow.com
[Java] var 키워드에 대하여.
0. 들어가며🚶 Java 10부터 도입된 var에 대해 존재는 알고 있었는데 이를 좀 더 정리해볼 시간을 가지고 싶어 이번 글을 작성하게 되었습니다. var에 대해 찾아보니 이를 반대하는 사람도 있고 장
kjhoon0330.tistory.com
[Java-11]타입추론 var
Java var type-inference 자바에서도 타입추론을 지원한다는걸 오늘 처음 알았다. 그도 그럴만도 한게, 평소 jdk8만 사용을 하던지라, 타입추론이 가능한지 몰랐다. 결론은 자바 10 부터 type - inference(타
catch-me-java.tistory.com
Java 10 - var 키워드로 변수 선언 (지역 변수 타입 추론)
Java 10에서 도입된 `var`는 변수를 선언할 때 타입을 생략할 수 있으며, 컴파일러가 타입을 추론합니다. 컴파일 타임에 추론하는 것이기 때문에, Runtime에 추가 연산을 하지 않아 성능에 영향을 주
codechacha.com
'Java' 카테고리의 다른 글
default 메서드에서 왜 Obejct 메서드를 재정의하지 못할까? (0) | 2024.04.02 |
---|---|
Enum에서 어떻게 비교할까? (Objects.equals(), equals(), == 비교 연산자) (0) | 2024.02.17 |
JVM의 개념 및 구조(JDK, JRE, JIT 컴파일러) (0) | 2024.02.04 |
추상 클래스와 인터페이스 (0) | 2023.08.17 |