Category/Java

[JAVA] var란?

Corinee 2025. 2. 27. 20:37
728x90

var란?

var 키워드는 컴파일러가 변수의 타입을 자동으로 추론해 주는 기능입니다.

var의 장점

- 코드를 간결하게 만들 수 있습니다.
- 타입을 명시할 필요 없이 가독성이 좋아집니다.
- 제네릭 타입이 복잡한 경우 유용합니다.

Map<String, List<Integer>> complexMap = new HashMap<>(); // 명시적 타입 선언 
var complexMap = new HashMap<String, List<Integer>>(); // var로 타입 추론

⚠️ var 사용 시 주의할 점

1. 지역 변수에서만 사용 가능 (class 필드, 메서드 매개변수 X)

public class Example {
    var field = 10; // ❌ 컴파일 오류 (클래스 필드에서는 사용 불가)
}

 

2. null 값으로 초기화 불가능

var value = null; // ❌ 타입을 추론할 수 없어서 오류 발생

 

3. 람다 표현식에서 직접 사용 불가

var lambda = x -> x * 2; // ❌ 컴파일 오류 (타입 명시 필요)
728x90

📌 var의 동작 과정

 (1) 일반적인 변수 선언

String text = "Hello, World!";
int number = 42;

타입(String, int)이 명시적으로 선언됩니다.

 (2) var를 사용한 변수 선언

var text = "Hello, World!"; // `text`는 컴파일 시점에 String으로 결정
var number = 42; // `number`는 컴파일 시점에 int로 결정

컴파일러가 text의 타입을 String, number의 타입을 int로 자동 추론합니다.
➡ 하지만 실행(런타임) 중에는 text가 다른 타입으로 변경되지 않습니다.

📌 var의 컴파일 과정

var message = "Hello, Java!";

➡ 컴파일 시점에서 Java 컴파일러가 아래처럼 변환합니다:

String message = "Hello, Java!";

즉, var를 사용했어도 결과적으로 String 타입이 명확하게 결정됩니다.

📌 var의 런타임 불변성

var로 선언한 변수는 컴파일 시점에 특정 타입으로 고정되며, 실행 중에는 변경할 수 없습니다.

(1) var는 한 번 결정된 타입을 바꿀 수 없다

var value = "Hello"; // 컴파일 시 `value`는 String으로 결정됨
value = 10; // ❌ 컴파일 오류 (String 타입인데 int 값을 할당하려고 함)

➡ 컴파일러가 value를 String으로 결정했기 때문에, int를 넣으면 오류가 발생합니다.

(2) var는 명확한 타입을 추론할 수 있어야 한다

var unknown; // ❌ 오류: 타입을 추론할 수 없음
unknown = "Some text";

➡ var는 초기값이 없으면 타입을 추론할 수 없어오류가 발생하므로, 반드시 초기값을 설정해야 합니다.

📌 var는 컴파일 시점에 타입이 고정된다

var는 실행(런타임) 중에 동적으로 타입이 바뀌지 않으며, 타입이 결정된 후에는 일반적인 변수처럼 사용됩니다.

var number = 42; // `int`로 컴파일 시점에 결정됨
number = 100; // ✅ 정상 (int 타입이므로 변경 가능)
number = "String"; // ❌ 오류 (int 타입이므로 String 할당 불가)

➡ 컴파일러가 int로 확정했기 때문에, 이후 String을 넣을 수 없습니다.

💡var 핵심 내용 정리

타입 추론 var를 사용하면 컴파일러가 타입을 자동으로 결정
컴파일 시점에 타입 결정 var를 사용해도 결과적으로 특정 타입(int, String 등)으로 확정됨
런타임에서 타입 변경 불가 한 번 정해진 타입은 실행 중에 변경할 수 없음
반드시 초기값 필요 초기값이 없으면 타입을 추론할 수 없어 오류 발생

var는 런타임 시에 타입이 동적으로 바뀌는 것이 아니라, 컴파일 시점에서 타입이 결정됨
한 번 결정된 타입은 실행 중에 변경할 수 없음
컴파일러가 자동으로 타입을 추론하지만, 실제 코드 실행 시에는 명확한 타입으로 처리됨 

 

728x90