이번 글에서는 Java에서 var와 타입추론에 대해 알아보겠습니다.
Java 10에서 var
Java 10부터 도입된 'var'는 지역 변수의 타입 추론을 가능하게 하는 키워드입니다.
이는 코드를 간결하게 작성할 수 있도록 도와주며, 프로그래머가 변수를 선언할 때
타입을 직접 명시하지 않아도 되게 합니다.
기존의 Java에서는 변수를 선언할 때 반드시 타입을 명시해야 했지만,
'var'를 사용하면 컴파일러가 할당된 값의 타입을 보고 변수의 타입을 추론합니다.
얼마 전에 Scala언어의 장점으로 보았던 '타입추론'입니다.
예를 들어 구문 작성을 확인해 보겠습니다.
String message = "Hello world";
위와 같은 전개가 기존 자바에서의 전개코드입니다.
하지만 var를 사용하면 다음과 같이 작성할 수 있습니다.
var message = "Hello world";
이 코드에서 var는 컴파일러에게 변수 message의 타입을 추론하라고 알려주는 역할을 합니다.
이 경우에 할당된 값이 문자열이므로 컴파일러는 message를 문자열(String)으로 추론합니다.
var의 사용은 가독성을 향상시키고 코드를 간결하게 만들어줄 수 있지만,
남용하면 가독성이 떨어질 수 있습니다. 주로 지역 변수에서 사용되며, 메서드의 매개변수, 리턴 타입, 필드, 클래스, 인터페이스 등에서는 사용할 수 없습니다.
타입추론
타입 추론은 컴파일러가 변수의 타입을 코드 작성자 대신 추론하는 기능입니다.
타입 추론 기능을 제공하는 언어를 살펴보겠습니다.
- Java
Java 10부터 var 키워드를 통해 지역 변수의 타입 추론을 지원 - Kotlin
Kotlin은 변수 선언 시에 타입 추론을 지원하여 코드를 간결하게 만들어줌 - Swift
Swift언어는 변수와 상수에 대한 타입 추론을 제공 - JavaScript
JavaScript는 ES6(2015)부터 let과 const를 통해 타입 추론을 지원 - C#
C# 3.0부터 var키워드를 사용하여 지역변수의 타입 추론 - Scala
Scala언어는 특히 강력한 타입 추론 기능을 보유. 변수 선언 시 명시적 지정을 하지 않아도 됨
이 외에도 다양한 언어들이 타입 추론 기능을 제공하고 있으며, 이러한 기능은 코드를 간결하게 만들어주고 개발자가 더 직관적으로 코드를 작성할 수 있도록 도와줍니다.
JAVA에서의 var
Var는 초기화 없이 사용할 수 없다.
var i; //var 타입은 초기화값을 선언부에 명시해줘야 한다.
위와 같이 변수를 선언하고 초기화하지 않으면 컴파일러는 해당 변수의 타입을 추론할 수 없기 때문에 오류가 발생합니다.
Java에서의 var는 변수를 선언하는 동시에 값을 할당하여 초기화해야만 사용할 수 있습니다.
Var 타입 변수에는 null 값이 들어갈 수 없다.
var i = null; // var 타입의 초기화 값은 'null' 이 될 수 없다.
위와 마찬가지로 초기화 값이 'null'인 경우에도 컴파일러가 해당 변수의 타입을 추론할 수 없기 때문에 타입 추론이 불가능합니다.
Var 타입은 로컬 변수에만 선언이 가능하다.
private var i = "No variable"; // 변수에 사용 x
Java에서 var 키워드는 지역 변수의 타입 추론을 위한 것이므로, 클래스의 멤버 변수로 사용을 할 수 없습니다.
클래스의 필드나 멤버 변수로 선언할 수 없는 이유는 Java 언어의 문법적인 제한 때문입니다.
Lambda Expression에는 명시적인 타입을 지정해줘야 한다.
var p = (String a) -> System.out.println("a = " + a); //x
Consumer<String> p = (String a) -> System.out.println("a = " + a); // (o)
Java에서 Lambda 표현식은 일반적으로 컴파일러가 문맥을 통해 타입을 추론할 수 있어 명시적 타입 지정이 필요하지 않습니다. 하지만 일부 경우에는 명시적인 타입 지정이 필요합니다.
위는 람다 표현식이 받는 매개변수와 반환하는 값의 타입을 나타내는 함수형 인터페이스입니다.
이 경우 명시적으로 매개변수 'a'의 타입이 String 임을 지정해 주어야 합니다.
배열을 선언할 때, var 대신 타입을 명시해줘야 한다.
var aa = {1,2,3}; // 배열 선언할 때 타입을 명시해줘야 한다. (x)
int[] aa = {1,2,3}; // (o)
String[] abc = {"apple","orange","banana"}; // (o)
배열을 선언할 때는 반드시 타입을 명시해주어야 합니다.
배열의 경우에는 컴파일러가 직접적인 값으로 타입을 추론할 수 없기 대문에 var를 사용할 수 없습니다.
이상입니다. 부족한 점은 심심할 때 보충!