[JAVA] var란?
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; // ❌ 컴파일 오류 (타입 명시 필요)
📌 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는 런타임 시에 타입이 동적으로 바뀌는 것이 아니라, 컴파일 시점에서 타입이 결정됨
✔ 한 번 결정된 타입은 실행 중에 변경할 수 없음
✔ 컴파일러가 자동으로 타입을 추론하지만, 실제 코드 실행 시에는 명확한 타입으로 처리됨