😉서론
회사 내 모든 프로젝트가 자바8에서 자바11로 올리게 되었다.
그래서 현재 자바8 기준으로 되어 있는 소스코드들이 많았고, 자바 8 이후에 나온 기술들을
하나하나 도입을 준비 중에 있다.
이후 sonarQube(소나큐브) 라는 소스코드 품질을 높여주는 툴을 도입하게 되었고,
여기 이슈에서 var 관련 이슈가 엄청 많이 나왔다.
그래서 도입 전 var가 뭔지 어떻게 쓰면 좋은지에 대해 알아보고 결정해야 하기에 알아보게 되었다.
🤷♂️자바8 이전과 자바10 이후 차이점
// 자바8 이전
String message = "Good bye, Java 9";
Map<Integer, String> map = new HashMap<>();
// 자바10 이후
var message = "Hello Java 10";
var idToNameMap = new HashMap<Integer, String>();
이처럼 var는 오른쪽 초기화 값을 보고 컴파일러단에서 데이터타입을 추론하여 사용이 된다.
컴파일 시 데이터타입을 추론하여 적용하기 때문에
런타임오버헤드 가 존재하지 않으며, 자바를 동적타입언어로 만들지 않는다.
var를 사용하기 위해선 아래와 같은 조건에서만 사용이 가능하다.
- 초기화된 로컬변수 선언 시
- forEach 와 같은 반복문 사용 시
🤦♂️잘못된 사용방식
var n; // error: cannot use 'var' on variable without initializer
var emptyList = null; // error: variable initializer is 'null'
var는 초기화값을 보고 데이터타입을 추론하기 때문에 null이나 값이 없이는 사용될 수 없다.
public var = "hello"; // error: 'var' is not allowed here
로컬이 아닌 변수에서는 사용할 수 없다.
var p = (String s) -> s.length() > 10; // error: lambda expression needs an explicit target-type
var arr = { 1, 2, 3 }; // error: array initializer needs an explicit target-type
람다표현식과 배열에서는 데이터유형이 명시적으로 필요하기 때문에 사용할 수 없다.
var result = obj.prcoess();
이는 에러는 안나지만, prcoess()가 반환하는 유형을 바로 파악할 수 없기 때문에
가독성이 떨어져 사용하면 안된다.
var x = emp.getProjects.stream()
.findFirst()
.map(String::length)
.orElse(0);
이렇게 긴 스트림에서도 가독성면에서도 안 좋을 뿐 아니라 예상치 못한 에러가 발생할 수 있기 때문에
사용해서는 안된다.
var empList = new ArrayList<>(); // 안좋음
var empList = new ArrayList<Employee>(); // 좋음
이처럼 다이아몬드연산자를 사용할 때에는 아래와 같이 사용해야 된다.
🤹♂️결론
잘만 사용한다면 코드길이도 줄 뿐 아니라 가독성 면에서도 좋다고 느껴졌다.
컴파일단에서 처리가 되기 때문에 런타임오버헤드 또한 일어나지 않기 때문에 성능에서도 떨어지지 않는다.
참고, 인용사이트
https://congcoding.tistory.com/60
https://itstory.tk/entry/Java-10-%EC%8B%A0%EA%B7%9C-%EA%B8%B0%EB%8A%A5%ED%8A%B9%EC%A7%95-%EC%A0%95%EB%A6%AC
https://www.baeldung.com/java-10-local-variable-type-inference
'JVM > Java' 카테고리의 다른 글
[Java]for문 List를 Null 체크하는 방법 (0) | 2021.06.06 |
---|---|
[Java] List Null 체크 하는 방법들 (0) | 2021.05.30 |
[Java] Optional – orElse() vs orElseGet() 차이점 알고 쓰자. (0) | 2021.05.16 |
[Java] Map getOrDefault 를 활용하자. (0) | 2021.05.09 |
[Java] ArrayList 조건 삭제 'removeIf' (0) | 2021.05.01 |