
Java는 정적 타입 언어로, 변수의 타입을 명시적으로 선언해야 한다.
그러나 Java10부터는 타입 추론(Type Inference) 기능이 되입되어, var 키워드를 사용해
변수 선언 시 타입을 자동으로 추론할 수 있다.
타입 추론 기능은 코드의 가독성을 높이고 불필요한 타입 선언을 줄이며 컴파일 시점에 정확한 타입이 결정되기 때문에 여전히 타입 안정성을 보장한다.
var를 사용하면 우변의 값(리터럴, 메서드 반환값 등)에 의해 타입이 추론된다.
즉, 컴파일러는 변수에 대입된 값을 보고 타입을 추론한다.
var message = "Hello, World!"; // String으로 추론
var number = 10; // int로 추론
var list = new ArrayList<String>; // ArrayList<String>으로 추론
var로 선언된 변수는 런타임이 아닌 컴파일 시점에 타입이 결정된다.
즉, 동적 타입 언어처럼 실행 중에 타입이 변경되지 않는다.
우변에 명확한 타입이 있어야 추론이 가능하다.
추상적인 표현이나 혼동을 줄 수 있는 경우에는 오류가 발생할 수 있다.
컴파일 시점에 var의 초기화된 값을 보고 추론해서 컴파일러가 바이트코드에 명시적으로 타입을 결정하므로 런타임 시점에 추가적인 타입 추론 작업이 일어나지 않으며, 변수의 타입은 컴파일 시점에 고정되어 있다.
var는 지역 변수 선언에서만 사용할 수 있으며,
클래스 필드, 메서드 매개변수, 반환 타입 등에서는 사용할 수 없다.
var는 초기화 없이 선언만 하면 타입을 추론할 수 없기 때문에 컴파일 에러가 발생한다.
따라서 var는 반드시 초기화되어야 한다.
var uninitailized; // 컴파일 오류(초기화 필요)
배열의 초기화 값이 명확하면 var를 사용할 수 있다.
var numbers = new int[]{1,2,3};
그러나 배열을 선언할 때 초기화없이 선언하거나, 초기화값만으로 타입을 추론할 수 없는 경우
var를 사용할 수 없다.
또한 var는 타입을 명시하지 않고 초기화된 값을 기반으로 컴파일러가 타입을 자동으로 추론하게 하는
문법이므로, var뒤에 타입을 명시하는 것은 문법적으로 맞지 않다.
var numbers = new int[10]; // int[]로 추론 가능
var int[] numbers; // 컴팡리 오류(초기화 필요)
타입을 명시적으로 이해해야 하는 상황에서는 가독성을 위해 타입을 명시하는 것이 좋다.
예를 들어, 복잡한 제네릭 타입의 경우 var가 가독성을 해칠 수 있다.
var map = new HashMap<String, List<Integer>>(); // 너무 복잡하면 가독성 저하
var는 모든 타입(기본형, 참조형)을 추론할 수 있지만 null값을 초기화 값으로 사용할 수 없다.
결론적으로, 자바의 타입 추론은 개발자가 타입 선언을 일일이 하지 않고도
타입 안정성을 유지하면서 코드를 간결하게 작성할 수 있게 해준다.
하지만 모든 상황에서 사용하기보다는 가독성 유지와 함께 적절히 활용하는 것이 중요하다.
와 잘 배우고 갑니다