1. 생성자란?
생성자는 객체가 생성되는 시점에 단 한 번 호출되는 특수한 메서드이다. 주 목적은 객체의 초기 상태를 보장하는 것이다.
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
생성자의 특징
- 클래스명과 이름이 같다
- 반환 타입이 없다
- 객체 생성 시 자동 호출
- 개발자가 직접 호출할 수 없다
📌 생성자는 객체 생성 이후에 실행되는 메서드가 아니라 객체 생성 과정의 일부이다!
2. 기본 생성자(Default Constructor)
생성자를 하나도 정의하지 않으면, 컴파일러가 생성자를 자동으로 추가한다.
class A {
int x;
}
⬇ 컴파일러가 내부적으로 추가
class A {
int x;
A() {}
}
주의점
- 생성자를 하나라도 직접 정의하면 기본 생성자는 자동 생성되지 않는다
- 컴파일 오류가 자주 발생하니 주의할 것
3. 왜 사용할까?
잘못된 초기화 방식
Person p = new Person();
p.name = "철수";
p.age = 20;
올바른 방식
Person p = new Person("철수", 20);
- 객체의 일관성 보장
- 불완전한 객체 생성 방지
- 객체의 최소 조건 강제
4. this
this = 현재 메서드를 호출한 객체 자신 !!
class Person {
String name;
Person(String name) {
this.name = name;
}
}
📌 this는 객체 컨텍스트에서만 존재
- static 메서드 ❌
- static 블록 ❌
스코프 충돌 해결을 위해 필요함
5. this() - 생성자에서 다른 생성자 호출
this()는 같은 클래스의 다른 생성자를 호출한다
class Person {
String name;
int age;
Person(String name) {
this(name, 0);
}
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
목적
- 생성자 로직 중복 제거
- 초기화 흐름 통일
- 생성자 체이닝 (Constructor Chaining)
6. this() 사용 규칙
- this(...)는 반드시 생성자의 첫 줄이어야 함
- 생성자 안에서 단 한번만 호출 가능하다
- -> 객체 초기화 순서를 JVM이 명확히 관리해야 하기 때문
Person(String name) {
System.out.println("생성자 호출!");
this(name, 0); // 컴파일 오류
}
Person(String name) {
this(name, 0); // 반드시 첫 번째 줄!!
}
7. 생성자 호출 흐름
- 메모리 할당 (Heap)
- 인스턴스 필드 기본값 초기화
- this()로 연결된 생성자 실행
- 최종 생성자 실행
- 객체 생성
📌 생성자 호출도 메서드 호출과 동일하게 Stack에 사용됨
8. 생성자 vs 일반 메서드 차이
| 구분 | 생성자 | 일반 메서드 |
| 이름 | 클래스명 | User 지정 |
| 반환 타입 | 없음 | 있음 |
| 호출 시점 | 객체 생성 시 | 임의 |
| 목적 | 초기화 | 동작 수행 |
| this() 호출 | 가능 | 불가 |
9. 생성자 설계 원칙
- 생성자는 객체를 완전한 상태로 만들어줘야 함
- 필수 값은 생성자로 강제
- 생성자 로직은 가볍게
- 복잡한 로직은 별도 메서드로 분리
- 생성자 오버로딩 시 반드시 this로 통합
10. 핵심 요약
- 생성자는 객체 초기화를 책임진다
- 생성자는 객체 생성 과정의 일부다
- this는 호출한 객체 자신을 가리킨다
- this()는 생성자 간 호출을 위한 문법이다
- this()는 반드시 첫 줄에 와야 함
- 생성자를 잘 설계하면 객체는 항상 유효한 상태를 유지함
'Java & Spring > Java' 카테고리의 다른 글
| Object 클래스 (0) | 2026.01.06 |
|---|---|
| 상속(Inheritance)이란 (0) | 2026.01.06 |
| 메서드 (0) | 2026.01.06 |
| Static (2) | 2026.01.05 |
| 객체의 상태와 변수의 생명주기 (0) | 2026.01.05 |