본문 바로가기
JAVA

var 키워드, 사용 예제 [코딩백과 with JAVA]

by GangDev 2024. 12. 21.

var 키워드

Java SE 10부터 도입된 var 키워드는 로컬 변수 선언 시 사용할 수 있는 타입 식별자입니다. 이를 통해 개발자는 변수의 실제 타입을 컴파일러에게 결정하게 맡길 수 있습니다. 한 번 생성된 후에는 이 타입을 변경할 수 없습니다.

주요 특징

  1. 타입 추론:
    • var를 사용하면 변수의 타입을 명시적으로 지정할 필요 없이, 할당된 값의 타이을 기반으로 자동으로 타입이 결정됩니다.
    • 예: var message = "Hello world!"; 에서 messageString 타입으로 추론됩니다.
  2. 로컬 변수 전용:
    • var는 메서드 내부의 로컬 변수 선언에만 사용 가능합니다.
    • 클래스 필드나 속성, 매개변수 등에는 사용할 수 없습니다.
  3. 초기화 필수:
    • var로 선언된 변수는 선언과 동시에 초기화해야 합니다.
    • 예: var x;와 같이 선언만 하고 초기화를 하지 않으면 컴파일 오류가 발생합니다.
  4. 재선언 불가능:
    • 이미 선언된 var 변수를 다시 선언할 수 없습니다.
    • 예: var x = 5; var x = "hello";는 컴파일 오류입니다.

사용 예제

// 기본 데이터 타입
var number = 42;
var isTrue = true;

// 컬렉션
var list = new ArrayList<String>();
list.add("Apple");
list.add("Banana");

// 람다 표현식
var calculator = (int x, int y) -> x + y;
System.out.println(calculator.apply(5, 7));

// 스트림 연산
var numbers = List.of(1, 2, 3, 4, 5);
var sum = numbers.stream().reduce(Integer::sum).orElse(0);
System.out.println(sum);

// 제네릭 타입
var map = new HashMap<String, Integer>();
map.put("one", 1);
map.put("two", 2);

// 배열
var array = new String[] {"red", "green", "blue"};

// 메서드 참조
var stringLength = String::length;
System.out.println(stringLength.apply("Hello"));

장점

  1. 코드의 가독성 향상: 특히 복잡한 타입을 다룰 때 변수 선언이 간결해집니다.
  2. 리팩토링 시 유연성: 변수의 타입을 변경할 때 이름만 수정하면 됩니다.
  3. 새로운 타입 사용 시 편리함: 익숙하지 않은 타입을 다룰 때 유용합니다.

주의사항

  1. 오버엔지니어링 피하기: 너무 자주 사용하면 코드의 가독성이 오히려 떨어질 수 있습니다.
  2. 명확성을 위해 적절히 사용: 변수의 타입이 명확하지 않을 경우 명시적 타입 선언을 고려하세요.
  3. 디버깅 어려움: IDE의 도움 없이 변수의 실제 타이을 파악하기 어려울 수 있습니다.

성능 영향

var 키워드는 런타임 성능에 영향을 미치지 않습니다. 컴파일 시점에 실제 타입으로 변환되므로 실행 중에는 차이가 없습니다.

var 키워드 사용 예제

  1. 리스트 처리
var list = List.of("one", "two", "three", "four");
for (var element : list) {
    System.out.println(element);
}

이 예제에서는 두 가지 방법으로 var를 사용했습니다:

  • list 변수 선언:
    • var listList.of() 메서드의 반환값을 기반으로 List<String> 타입으로 추론됩니다.
    • 이렇게 하면 복잡한 제네릭 타입을 직접 입력할 필요가 없어 코드가 간결해집니다.
  • for-each 루프 내부의 element 변수:
    • var element는 리스트의 요소 타입인 String으로 추론됩니다.
    • 이 방식을 사용하면 루프 변수의 타입을 명시적으로 지정할 필요가 없어집니다.
  1. 파일 처리
var path = Path.of("debug.log");
try (var stream = Files.newInputStream(path)) {
    // 파일 처리 로직
}

이 예제에서도 var를 두 가지 상황에서 사용했습니다:

  • path 변수 선언:
    • var pathPath.of() 메서드의 반환값을 기반으로 Path 타입으로 추론됩니다.
    • Path 클래스는 자바의 NIO 패키지에 포함되어 있어 복잡한 경로 작업을 수행할 수 있습니다.
  • try-with-resources 문 내부의 stream 변수:
    • var stream은 Fils.newInputStream()메서드의 반환값을 기반으로InputStream` 타입으로 추론됩니다.
    • try-with-resources 문을 사용하면 자동으로 리소스가 닫혀 안전한 파일 처리가 가능합니다.