Java - Var 키워드
java의 var 키워드는 java 10 부터 도입된 키워드 이다.
해당 키워드는, 지역 변수의 타입 추론을 위한 키워드 이다. 변수 선언시, 타입을 생략 가능하게 한다.
var 키워드의 경우 Compile 시점에 타입을 추론하게 된다. 즉 Compile 시점에 타입이 이미 결정된다.
이때 컴파일러가 타입을 추론할 수 없을 경우, Compile Error 가 발생하게 된다.
즉 이걸 반대로 생각한다면, RunTime 시점에 타입에 대한 연산이 일어나지 않는다는 말이다.
var 키워드의 장단점
장점
- 가독성 향상: 코드가 간결해지고, 중복된 타입 선언을 제거하여 가독성이 향상된다.
- 유지 보수성 증가: 코드의 변경이 있을때, 변수의 타입을 모두 변경하지 않아도 되어, 유지보수성이 증가한다.
- 컴파일 시점에 검증: 컴파일 시점에 에러를 잡아낼 수 있어, 실수를 줄일수있다.
- 코드 간소화: 타입을 모두 적지 않기 때문에 코드가 간소화됨.
단점
- 잘못된 타입 추론: 개발자가 의도한 타입대로 추론 하지 않을 수 있으며, 크리티컬한 에러 발생으로 이어질 수 있다.
- 코드 분석의 어려움: 코드의 간소화로 가독성은 향상될 수 있으나, 분석에는 번거로움이 발생 할 수 있다.
java 공식 문서상
which can help you write code that’s easier to read.
이라는 설명이 존재한다. (읽기 쉬운 코드를 작성할 수 있다. -> 가독성이 좋아진다?)
물론 가독성 자체는 굉장히 좋아질 수 있다고 생각한다.
// 변경 전
List<Map<String,Object>> list = service.getAll();
// 변경 후
var list = service.getAll();
위의 예제와 같이 타입이 길면 길수록 읽기에는 조금의 불편함이 있을수 있다고 생각한다.
var 키워드를 사용함으로서 굉장히 복잡한 코드 사이 쉽게 읽힐수 있다는 장점은 있지만,
반대로 이 코드를 처음 분석하고, 읽고 있다면? 어떤 데이터 타입을 return 해주는지 하나씩 타고 분석을 해야할수도 있다
이는 곧 분석의 시간을 증가시키고, 유지 보수시 잘못된 코드를 작성할수도 있다고 생각한다.
var 키워드 사용방법
우선 var 키워드가 사용 가능한곳은 '지역변수'로 한정 되어 있다.
(전역변수에는 사용이 불가하다.)
public class Example {
// var instanceVar = "test"; // 인스턴스 변수는 사용이 불가 하다.
public void test() {
var localVar = "test"; // 지역변수에는 사용 가능하다.
}
}
1. var 키워드가 사용이 가능한 예제는 아래와 같다.
public static void main(String[] args) {
/**
* 1. var 키워드 사용 예제
*/
// String 타입 추론
var test1 = "this is first"; //String
if(test1 instanceof String) {
System.out.println("test1 = " + test1);
}
// 다양한 타입 추론 가능
var testArrayList = new ArrayList<String>();
if(testArrayList instanceof ArrayList) {
System.out.println("testArrayList = " + testArrayList);
}
List<String> list = List.of("a", "b", "c");
// for문 에서도 var 키워드 사용 가능
for(var str : list) {
System.out.println("str = " + str);
}
// 예제 : 컴파일 시점에 list의 타입을 알 수 있으니, var 키워드에 사용가능.
var testList = list;
System.out.println("testList = " + testList);
}
2. var 키워드가 사용 불가능한 경우
public static void main(String[] args) {
/**
* 2. var 키워드 사용 불가능한 경우
*/
var test2; // 컴파일 에러 발생 -> var 키워드는 반드시 초기화가 필요하다.
var test3 = null; // 컴파일 에러 발생 -> null 은 타입을 추론할 수 없다.
var test4 = {1,2,3}; // 컴파일 에러 발생 -> 배열은 타입을 추론할 수 없다.
var test5 = () -> {}; // 컴파일 에러 발생 -> 람다식은 타입을 추론할 수 없다.
}
var 키워드 실사용 간단 예제
- Spring 프레임워크에서 Service -> Controller 로 데이터를 전달하는 예제이다.
@GetMapping("board/v2/findAll")
@ResponseBody
public ResponseEntity<List<Board>> findAll2() {
var result = boardService.test();
if(result == null){
throw new NullPointerException("result is null");
}
return new ResponseEntity<>(result, HttpStatus.OK);
}
- 해당 코드를 보고 먼저 간단하게 분석을 해보자(잠깐의 생각)
단순히 var result 만 봤을때는 어떤 타입인지 알 수 없다. 다만 코드가 간결하다. (null 체크 제외)
해당 예제에서는 메서드의 return type 을 보고 var 키워드의 타입을 유추해볼수 있다.
(여기서 생각해보자, 주변 코드를 보고 해당 변수가 어떤 타입인지 유추가 불가능하다면,,?)
- 변경전 코드는 이러하다.
@GetMapping("board/v2/findAll")
@ResponseBody
public ResponseEntity<List<Board>> findAll2() {
List<Board> result = boardService.test();
if(result == null){
throw new NullPointerException("result is null");
}
return new ResponseEntity<>(result, HttpStatus.OK);
}
result 의 타입 하나가 바뀌었을 뿐이다. 코드가 많고 복잡하다면 var 키워드로 가독성을 해결하는것은 좋은 방법일수 있다.
하지만, 가독성 하나를 잡으려 사용하려 한다면 꼭 다른 단점들을 생각해보고 적용 하기를 바란다.
'Language > Java' 카테고리의 다른 글
[Java & Spring] Version 비교 방법 - version4j (2) | 2024.06.25 |
---|---|
[Java] ThreadLocal이란? - (ThreadLocal, InheritableThreadLocal) 설명 및 예제(테스트) (0) | 2023.03.07 |
[Java] Java 메모리 영역(stack, heap, static), JVM, JAVA 변수 종류 (2) | 2023.02.07 |
[Java] Java 컬렉션(Collection) (0) | 2023.02.01 |
[Java] Multi Thread를 이용한 간단 게임 구현(구구단) (0) | 2023.01.26 |
댓글