“배열은 new 없이 리터럴로 초기화 가능하잖아. 그럼 객체도 생성자를 사용해서 초기화한다면 new 없이 가능해야 되는 거 아니야?”
말이 되는 것 같죠? 🤔 하지만 결론부터 말하자면 안 됩니다.
👉 객체는 생성자로 초기화하더라도 new 없이는 생성 자체가 불가능합니다.
1. 배열은 "리터럴 문법"이 따로 존재함
int[] arr = {1, 2, 3}; // ✅ 가능 (리터럴)
int[] arr = new int[] {1, 2, 3}; // ✅ 이것과 동일함
- 리터럴 문법: {...} 만으로 배열 값을 초기화할 수 있는 특수 문법
- 이건 자바 컴파일러가 자동으로 new int[]를 붙여주는 문법적 예외
👉 이것은 생성자와는 전혀 관계 없습니다!
2. 객체는 "리터럴 문법"이 존재하지 않음
Dog d = new Dog(); // ✅ 정상 (생성자 사용)
Dog d = { "초코", 3 }; // ❌ 문법 오류 (리터럴 지원 안 됨)
Dog d = Dog("초코", 3); // ❌ 함수처럼 호출할 수 없음
- 객체는 반드시 new 클래스명()을 통해 객체를 힙에 생성해야 함
- 자바에서 객체는 리터럴이 존재하지 않기 때문에, new 없이는 메모리 할당 자체가 불가능함
3. “생성자 초기화”와 “리터럴 초기화”는 전혀 다른 개념
| 초기화 | 방식설명 | new 생략 가능? |
| 리터럴 초기화 | {1, 2, 3} | ✅ (배열만) |
| 생성자 초기화 | new Dog("초코", 3) | ❌ (항상 new 필요) |
생성자 초기화 = 객체 생성 + 생성자 호출
이걸 위해서는 반드시 new가 필요함
new Dog() 전체가 "호출"의 개념이고,
그 안에서 Dog()는 "생성자 함수" 자체를 실행(호출)하는 부분입니다.
자바는 정적 타입 언어 → 명확하고 일관된 객체 생성 방식 유지
- 자바는 타입 안정성과 메모리 관리를 위해
모든 객체 생성을 new + 생성자로 강제합니다 - 이는 객체지향적 일관성을 유지하기 위한 철학이기도 합니다.
비교: JavaScript나 Python은 가능
let user = { name: "Tom", age: 3 }; // JS에서는 객체 리터럴 가능
→ 자바스크립트는 동적 타입 언어이고, 객체 리터럴을 허용하는 구조입니다.
→ 하지만 자바는 엄격한 정적 타입 언어이므로 허용되지 않음
❌ new를 생략하면 안 되는 경우
❗ 선언 없이 바로 리턴할 때
return int[] {1, 2}; // ❌ 컴파일 오류 (new 생략 불가)
return new int[] {1, 2}; // ✅ 정상
❗ 메서드 안에서 객체 생성 없이 사용하려 할 때
Dog d; // 선언만
d.bark(); // ❌ NullPointerException
→ 반드시 d = new Dog();처럼 객체를 먼저 생성해야 합니다.
🔑 요약 정리
| 상황 | new 필요 여부 | 이유 |
| 클래스 객체 생성 | ✅ 필요 | 메모리에 객체 생성 |
| 배열 생성 (크기 명시) | ✅ 필요 | 배열도 객체이기 때문 |
| 배열 선언과 동시에 초기화 | ❌ 생략 가능 | 컴파일러가 자동 변환 |
| 배열을 return할 때 | ✅ 필요 | new 없이 리터럴 불가 |
| 리터럴(숫자, 문자 등) 사용 | ❌ 불필요 | 고정된 값 자체이므로 |
new 정리
| 항목 | new |
| 정체 | 연산자(operator) |
| 역할 | 객체를 생성하고, 생성자를 호출한 뒤, 그 주소값을 반환 |
| 함수인가? | ❌ 함수가 아님 (인수, 반환값, 이름 없음) |
| 비유 | "객체를 만들고 초기화하는 도구" |
'JAVA' 카테고리의 다른 글
| Hashmap in java (1) (0) | 2025.06.21 |
|---|---|
| new를 언제? 왜 붙여야하는가? (final) (0) | 2025.06.19 |
| new를 언제? 왜 붙여야하는가? (2) (0) | 2025.06.18 |
| new를 언제? 왜 붙여야하는가? (1) (1) | 2025.06.14 |
| Java 메서드 구조 분석 (0) | 2025.06.14 |