Compile 언어의 변수 선언 방식은 보통 Explicit Declaration이다.
Java SE 10 이전 버전까지는 모두 Explicit Declaration을 따랐다.
Explicit Declaration Type Example
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.OutputStreamWriter;
public class Main {
public static void main(String[] args) throws IOException {
// Type variable_name = ~~~
String blogName = "Falcon";
int numberOfRegister = 50;
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
try {
bufferedWriter.write("블로그 이름 : " + blogName);
bufferedWriter.newLine();
bufferedWriter.write("방문자 수 : " + numberOfRegister);
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
bufferedWriter.close();
}
}
}
출력 결과
블로그 이름 : Falcon
방문자 수 : 50
Java SE 10 버전 이후 'var' 를 통한 타입 추론 기능을 제공하여 코드를 다음과 같이 수정할 수 있다.
Implicit Declaration Type Example
// 'var' is not keyword, but it supports type inference
var blogName = "Falcon";
var numberOfRegister = 50;
var bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
출력 결과는 위 예제와 같다.
기대 효과 | 단점 |
코드의 중복성 제거 | 가독성 저해 가능성 有 |
When to use & not to use?
when to use
- 지역 변수 선언시
- type 생략이 중복성을 제거하고 변수의 이름을 읽고 의미를 바로 파악하는 것이 중요할 때
- 타입의 생략이 코드의 가독성(Readability)를 저해하지 않을 때
예제 코드
// ORIGINAL
List<Customer> x = dbconn.executeQuery(query);
// GOOD
var custList = dbconn.executeQuery(query);
not to use
- 클래스 맴버 변수 선언시
- 타입 생략시 가독성을 저해할 가능성이 있을 때
- 메소드 리턴 타입
- 정수 실수 등 정확한 값이 필요한 변수
- 람다식 표현
컬렉션 사용시 선언 방식 (Explicit, Implicit)에 따라 타입이 달라질 수 있다
// ORIGINAL -> 이경우 'List' 타입으로 list가 생성된다.
List<String> list = new ArrayList<>();
// 이 경우 'ArrayList' (Interace) 로 list가 생성된다.
var list = new ArrayList<String>();
Primitive Data Type 중 정확한 값이 필요한 경우 유의해야한다.
// ORIGINAL
byte flags = 0;
short mask = 0x7fff;
long base = 17;
// DANGEROUS: all infer as int
var flags = 0;
var mask = 0x7fff;
var base = 17;
람다식 표현에 사용시 오류 발생.
// error: lambda expression needs an explicit target-type
var p = (String s) -> s.length() > 10;
참고 사항
var 는 키워드가 아니라 타입 이름으로 reserved 된다. (ex. int)
컴파일시에만 타입 추론이 일어나고 컴파일 이후엔 타입이 변하지 않는다. == var 의 타입 추론이 자바를 동적 타입 언어 (ex Javascript 같은 스크립트 언어)로 변경 시키지도 않는다.
∴ ★★★★ 런타임 오버헤드가 없다. ★★★★
Reference
https://docs.oracle.com/en/java/javase/11/language/local-variable-type-inference.html
openjdk.java.net/projects/amber/LVTIstyle.html
www.baeldung.com/java-10-local-variable-type-inference
'JVM > Java' 카테고리의 다른 글
Presentation - Business DTO를 분리시켜라 (0) | 2023.08.06 |
---|---|
[Java] Data Transfer Object (DTO) (0) | 2023.01.27 |
[Java] 입출력 스트림 (0) | 2020.04.03 |
자바 정규식을 활용한 패스워드 정책설정 예제 (0) | 2019.06.01 |
자바 정규식이란? (0) | 2019.06.01 |