본문 바로가기

자바 언어 & 객체지향 지식

var에 대하여

출처: https://kjhoon0330.tistory.com/entry/Java-var-%ED%82%A4%EC%9B%8C%EB%93%9C%EC%97%90-%EB%8C%80%ED%95%98%EC%97%AC#3.%202.%20var%20%ED%82%A4%EC%9B%8C%EB%93%9C%EC%97%90%20%EA%B4%80%ED%95%9C%20%EC%9D%B4%EC%95%BC%EA%B8%B0%F0%9F%92%AC

정리!!
var 이란?  Type Inference(타입 추론)로 제네릭, 람다식에서도 볼수 있다. 우변, 우측을 보고 타입을 유추하며 컴파일시 타입추론을 한다. 즉, 바이트 코드에서는 추론된 타입이 들어갈 테니 런타임 오버헤드가 발생하지 않는다. 

 

0. 들어가며🚶

Java 10부터 도입된 var에 대해 존재는 알고 있었는데 이를 좀 더 정리해볼 시간을 가지고 싶어 이번 글을 작성하게 되었습니다.

 

var에 대해 찾아보니 이를 반대하는 사람도 있고 장점에 대해 말하는 사람들도 있어 왜 정적 타입 언어인 Java에 var 키워드를 도입했는지, 사용 예시는 어떤게 있는지 등에 대해 알아보도록 하겠습니다.


1. var 사용 예시📚

Java 10부터 지역 변수에 대한 Type Inference가 가능한 var 키워드를 제공해줍니다.

 

Type Inference는 제네릭이나 람다식에서도 찾아볼 수 있는데, 타입을 생략하여도 이를 문맥상 충분히 알 수 있으면 컴파일러가 타입을 추론해주는 것을 말합니다.

 

말로만 설명하면 안와닿을 수 있으니 코드로 살펴보겠습니다.

// var를 쓰지 않은 경우
List<String> cities = List.of("Brussels", "Cardiff", "Cambridge");
HashMap<User, List<String>> userChannels = new HashMap<User, List<String>>();


// var를 쓴 경우
var cities = List.of("Brussels", "Cardiff", "Cambridge");
var userChannels = new HashMap<User, List<String>>();

// var를 사용한 foreach문
for (var city : cities) {
    System.out.println("city = " + city);
}JAVA

위 예시들을 보면 우변만 봐도 충분히 타입이 추측이 가능합니다. 따라서 좌변에 번거롭게 타입을 전부 적어줄 필요 없이 var를 통해 처리할 수 있죠.

 

실제로 코드를 읽는 과정에서 좌변의 타입 이름이 너무 길어지면 가독성이 떨어지는 경우가 있는데 이를 보완할 수 있는 문법인 것 같습니다.

 

또한 foreach문에서도 활용할 수 있는데 이는 IDE의 template을 작성할 때도 유용히 사용할 수 있을 것 같습니다.

 


2. var 키워드에 관한 이야기💬

1) var를 도입한 이유에 대한 생각

Type Inference는 최근 나오는 언어들 대부분에서 갖추고 있는 기능입니다. Java 역시 이에 맞춰 버전을 업그레이드 함에 따라 제공한 기능이라고 생각합니다.

 

선언과 초기화를 하는 경우 좌변보다 우변에 좀 더 집중해야할 경우도 있는데, 이를 위해 좌변 타입을 간략하게 var로 처리하고 우변에 시선을 좀 더 집중시킴으로써 가독성을 향상시킬 수 있으며 많은 경우 좌변과 우변의 타입이 비슷하거나 동일하여 불필요한 중복을 제거하는 기능을 해주기도 합니다.

 

Oracle 글을 살펴보면 새로운 라이브러리들이 점점 더 많은 제네릭을 활용하는데, 이러한 요소는 변수 선언에 오버헤드를 높인다고 생각하는 것 같습니다. 변수 선언이 부담스러워지면 개발자들이 해당 오버헤드를 피하기 위해 다른 방식으로 코드를 작성할 가능성이 생기고 이는 피곤한 일이 될 수 있는 것이죠. 따라서 var가 적절히 사용된다면 긍정적인 효과를 거둘 수 있다고 보는 게 아닌가 싶습니다. 또한 Java 커뮤니티가 var의 좋은 사용 방식을 고민하고, 합리적인 방향으로 의견이 수렴하는 것을 기대하고 있는 것 같습니다.

 


2) Java가 그럼 동적 타입 언어가 되는 것인가?

대답은 아닙니다! Java는 여전히 정적 타입 언어이고 var를 사용한다 해도 이러한 사실은 변하지 않습니다.

 

var는 컴파일시 var에 들어갈 데이터 타입이 추론되어 적용하는 방식을 사용합니다. 코드를 살펴보겠습니다.

위 코드는 인텔리제이에서 써본 코드인데 var 자리에 들어갈 타입을 우변을 참고하여 추론했고 이를 IDE가 표시해준 모습입니다. 즉, 컴파일 타임에 var 키워드를 적절한 타입으로 추론해서 교체한다는 것을 알 수 있습니다. 

 

여기서 생각해볼 수 있는 점은 var를 쓴다고 런타임 오버헤드가 생기진 않는다는 것입니다. 컴파일 시점에 var에 들어갈 타입을 추론하고 바이트 코드에는 추론된 타입이 들어갈 테니 런타임에는 var 키워드의 존재를 모르지 않을까 추측해봅니다.