자바의 var 키워드에 대해

최창효·2024년 3월 10일
post-thumbnail

var는 Java10부터 도입된 지역 변수에 대한 타입 추론을 위한 키워드입니다.

var는 컴파일 시점에 컴파일러에 의해 타입이 추론됩니다. 컴파일 타임에 var 키워드를 이미 적절한 타입으로 변경하기 때문에 런타임 시점에는 어떤 추가연산도 하지 않아 성능에 영향을 주지 않습니다.

var a = 10;
a = "w"; // 컴파일 에러. 실행하지 않아도 불가능하다는 걸 알고 있음

사용 예시

0. 기본 사용법

// String a = "HelloWorld";
var a = "HelloWorld";

// List<String> lst = new ArrayList<String>();
var lst = new ArrayList<String>();
  • 우변의 항목들로 타입 추론이 가능할 경우 var을 통해 좌변을 간단하게 표현할 수 있습니다.

1. foreach

for(var a : aList) {
	System.out.println(a);
}
  • foreach문법에서도 var를 사용할 수 있습니다.

2. 익명 클래스

익명클래스 변수를 var로 선언할 수 있습니다.

var function = new Function<Integer, Boolean>() {
	@Override
	public Boolean apply(Integer integer) {
		return integer > 0;
	}
};

하지만 이 익명 클래스를 람다로 변경했을 경우 var사용이 불가능합니다.

// 컴파일 에러
var function = integer -> true;
  • 람다식을 var로 받을 수 없는 이유는 우변의 람다식만으로 정확한 타입 추론이 불가능하기 때문입니다. 위 예시에서 function은 Function<Integer,Boolean>이 될 수도 있지만 Predicate<Integer>가 될 수도 있기 때문에 var로 타입 추론이 불가능합니다.

3. 람다의 파라미터

람다식의 파라미터에 var을 사용할 수 있습니다.

// 가능
Stream.of(1, 2, 3, 4)
        .map((@NotNull var a) -> a * 2)
        .collect(Collectors.toList());
        
// 불가능
Stream.of(1, 2, 3, 4)
        .map(@NotNull a -> a * 2)
        .collect(Collectors.toList());

// 가능
Stream.of(1, 2, 3, 4)
        .map((@NotNull Integer a) -> a * 2)
        .collect(Collectors.toList());
  • 원래 람다식의 파라미터에는 타입을 선언하지 않는게 일반적이었고, 이때는 어노테이션을 사용할 수 없었습니다.
  • (어노테이션 var 파라미터)에서 괄호는 필수입니다.

4. 전역변수로 사용 불가능

public class MyClass{
	var a = 10; // 불가능
}

5. 초기화 없이 사용 불가능

var a; // 불가능

6. null로 선언 불가능

var a = null; // 불가능

References

profile
기록하고 정리하는 걸 좋아하는 백엔드 개발자입니다.

0개의 댓글