JAVA

new를 언제? 왜 붙여야하는가? (3)

싸블양 2025. 6. 19. 12:47

“배열은 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