• var 키워드란

    • Java 10에서 도입되어 변수를 선언할 때 타입을 생략할 수 있음

    • 컴파일러가 변수에 대입되는 값을 통해 타입추론

    • 컴파일 단계에서 추론하는 것이기 때문에 런타임 환경에서 추가 연산을 하지 않아 성능에 영향을 주지는 않음

    • 지역 변수에만 사용가능하며 컴파일러가 추론하기 어려운 경우 컴파일 에러 발생

    • 예시 코드

      var str = "Hello World";
      
  • var 활용

    • java 10이전에는 변수를 생성할 때 항상 타입을 명시해야 했음

    • java 10부터는 var로 타입 선언 없이 문자열 선언 가능

    • 예시 코드

      // java 10 이전
      String str = "Hello World";
      
      // java 10 이후
      var str = "Hello World";
      if(str instanceof String) {
      	System.out.println("This is a String: " + str);
      }
      
      // 아래와 같이 작성한 경우 List<Object> list = ArrayList<>();와 같음
      var list = new ArrayList<>();
      if(list instanceof ArrayList) {
      	System.out.println("This is a ArrayList");
      }
      
      // 반복문에서의 사용
      int[] arr = {1, 2, 3};
      for(var i : arr) {
      	System.out.println("n: " + i);
      }
      
  • var 제약 사항

    • 지역 변수에만 적용이 가능

      • 기본적으로 지역 변수에만 사용이 가능

      • 클래스의 맴버 변수(클래스 전역 변수)에는 사용할 수 없음

      • 예시 코드

        // 사용 불가능 예시
        public class JavaLocalVariable {
        	private var str = "chobolevel";
        	private var list = new ArrayList<>();
        }
        
    • 초기화 필요

      • 초기화를 하지 않는 경우 타입 추론이 불가능하여 컴파일 에러 발생
      • 즉, 변수 생성 후 다른 라인에서 변수 값 지정 불가능
    • Null 초기화 불가능

      • 어떤 객체든 null이 가능하므로 타입 추론이 불가능하여 null 초기화시 컴파일 에러 발생
    • 배열에 사용 불가능

      • 배열에 사용할 때 배열의 타입을 알 수 없으므로 컴파일 에러 발생

      • 예시 코드

        // 사용 불가능 예시
        var arr = {1, 2, 3};
        
        // 사용 가능 예시
        var arr = new int[]{1, 2, 3};
        
    • 람다에서 적용 불가능

      • 예시 코드

        // 사용 불가능 예시
        // 명시적인 타입을 지정하면 가능하다고 함
        var f = () => {};
        
  • 정리

    • 결과만 보면 되게 애매한 키워드처럼 보임
    • 타입 추론을 통해 왼변보다 오른쪽변에 주목한다? 이건 완전 타입 추론인 자바스크립트에서나 가능한 얘기인듯