타입 추론 var
타입추론은 개발자가 변수의 타입을 명시적으로 적어주지 않고도, 컴파일러가 알아서 이 변수의 타입을 대입된 리터롤로 추론하는 것.
JDK 10에서 type-inference(타입 추론)이 적용되었다.
JDK 10 이전과 이후의 차이를 한 번 살펴보자
String str = "Hello";
// JDK 10 이후의 var 적용
var str = "Hello";
그리고 컴파일러는 var을 String으로 컴파일 단계에서 타입 추론을 해준다. 하지만 var은 아무때나 사용 할 수 있는 것은 아니다.
💡 Var은 초기화 값이 있는 지역변수로만 선언이 가능하다.
즉, var은 멤버변수, 파라미터, 리턴 타입으로는 사용이 불가능하다는 것이다. 혹시나 멤버변수를 final을 사용해서 var을 적용하면 해당 멤버 변수도 타입 추론이 가능하지 않을까? 란 생각을 했는데, 적용이 되지 않는 것 같다.
💡 Var은 키워드(Keyword)가 아니다.
var 자체도 10부터 도입 된 예약어라고 생각할 수 있으나 var은 예약어가 아니다. 즉 다음과 같은 코드의 사용이 가능하다는 것이다.
String var = "sss";
var var = "sss";
var를 사용하면 타입이 동적으로 추론이 되어야 한다고 생각해서 런타임 오버헤드가 발생한다고 생각 할 수 있다. 하지만 var의 타입 추론은 컴파일 당시에 이루어지기 때문에 런타임 오버헤드가 발생하지 않는다. 다음과 같은 상황을 살펴보자.
var str = "1";
str = 1;
사실 위와 같은 형태의 코드는 자바스크립트, 파이썬에서는 가능하나 자바에서는 이를 허락하지 않는다.
Var 사용 조건
1. var는 초기화 없이 사용할 수 없다.
var i; // 컴파일 오류
var i = 1; // O
2. Var 타입 변수에는 null 값이 들어갈 수 없다.
var i = null; // 컴파일 오류
3. var 타입은 로컬 변수에만 선언이 가능하다.
4.Lambda Expression에는 명시적인 타입을 지정해주어야 한다.
var var = (String str) -> System.out.println("str = " + str);
Consumer<String> test = str -> System.out.println("str = " + str); // 우리가 자주 써오던 형태이다.
이렇게만 보면 그냥 아래꺼를 사용하는 것이 좋아보인다. 하지만 var를 사용했을 때의 장점이 있다.
Consumer<String> test = (@Nonnull var str) -> System.out.println("str = " + str);
즉 위와 같이 키워드 앞에서만 사용 할 수 있는 애노테이션을 사용 할 수 있게 된다.
5. 배열을 선언할 때에는 var 대신 타입을 명시해주어야 한다.이는 Generic과 같은 맥락이다. Generic 또한 타입추론으로 명시적인 배열 선언은 불가능하다.
var arr = {1, 2, 3}; // 컴파일 오류
참고 자료
https://codechacha.com/ko/java-local-variable-type-inference/
'프로그래머스 데브코스' 카테고리의 다른 글
프로그래머스 백엔드 데브코스 1달차 회고 (0) | 2023.07.07 |
---|---|
프로그래머스 데브코스 18일차 - 예외처리 트러블 슈팅 (0) | 2023.06.20 |
프로그래머스 데브코스 2주차 회고 (0) | 2023.06.19 |
프로그래머스 데브코스 12일차 - 테코톡 발표 & EC2 spot Instance 구매 옵션 (0) | 2023.06.16 |
프로그래머스 데브코스 11일차 - 싱글톤 패턴 (0) | 2023.06.16 |