배열을 return할 때는
return {1, 2, 3}; ❌ 불가능한데,
왜 new 없이 리터럴을 사용할 수 없는 걸까?
먼저 결론부터
{1, 2, 3}은 "배열 리터럴"로서, 오직 배열을 "선언 + 초기화"하는 경우에만 허용되는 특수 문법입니다.
그래서 return처럼 선언이 아닌 문맥에서는 반드시 new가 필요합니다.
🔍 상황별 비교
| 코드 | 의미 | 가능여부 |
| int[] nums = {1, 2, 3}; | 선언 + 리터럴 초기화 | ✅ 가능 |
| return new int[] {1, 2, 3}; | 리턴문에서 배열 생성 | ✅ 가능 |
| return {1, 2, 3}; | 리터럴만으로 리턴 | ❌ 불가능 |
| return int[] {1, 2, 3}; | 타입까지 명시했지만 선언 아님 | ❌ 불가능 |
왜 안 되는가?
📌 1. {} 문법은 오직 "선언 시 초기화"에만 허용된 예외 문법
int[] arr = {1, 2, 3}; // OK
이건 자바가 특별히 허용한 배열 리터럴 축약 문법입니다.
컴파일러가 자동으로 이렇게 바꿔줘요:
int[] arr = new int[] {1, 2, 3};
그런데 return문에서는 선언이 없습니다!
return {1, 2, 3}; // 누구한테 넣는 건데? 타입은 뭔데? 선언이 없어!❌ 불가능
- 이건 변수 선언이 아니라 **표현식(Expression)**이기 때문에,
- 자바 컴파일러는 new 없이 배열 객체를 만드는 문법을 허용하지 않습니다.
📌 2. 자바는 정적 타입 언어 → 문맥을 명확히 해야 함
- 자바는 컴파일러가 모든 타입과 메모리 구조를 명시적으로 알아야만 작동합니다
- {1, 2, 3}만 덜렁 있으면 컴파일러가 타입, 크기, 위치, 메모리 할당 방법을 알 수 없음
→ 그래서 자바는 **"return하려면 네가 명확하게 new int[] 붙여서 말해!"**라고 강제하는 거예요
결론 요약
| 배열을 return할 때 왜 {1, 2, 3}만 쓸 수 없나요? | 자바는 {}를 오직 선언 + 초기화에서만 허용하는 문법적 예외로 보기 때문입니다 |
| 그럼 return할 때는 어떻게 해야 하나요? | return new int[] {1, 2, 3};처럼 명확하게 써야 합니다 |
| 이유는? | return은 변수 선언이 아니고, 자바는 정적 타입 언어이기 때문에 문맥이 불명확하면 허용하지 않음 |
그러니까 쉽게 이야기하면 자바는 { 1, 2, 3 } 이렇게있으면 못알아듣는다 이말입니다.
'JAVA' 카테고리의 다른 글
| 스택 메모리 (Stack Memory) (0) | 2025.07.08 |
|---|---|
| Hashmap in java (1) (0) | 2025.06.21 |
| new를 언제? 왜 붙여야하는가? (3) (0) | 2025.06.19 |
| new를 언제? 왜 붙여야하는가? (2) (0) | 2025.06.18 |
| new를 언제? 왜 붙여야하는가? (1) (1) | 2025.06.14 |