객체를 만들고 나면 곧바로 초기값을 넣어야 하는 경우가 많다. 그런데 매번 메서드를 호출하거나 직접 필드를 채우는 방식은 번거롭고, 실수할 여지가 있다. 이 문제를 해결하는 것이 바로 생성자(Constructor)이다.
생성자가 필요한 이유
MemberInit member1 = new MemberInit();
member1.name = "user1";
member1.age = 15;
member1.grade = 90;
MemberInit member2 = new MemberInit();
member2.name = "user2";
member2.age = 16;
member2.grade = 80;
- 기존의 문제점 ①: 객체 생성 직후에 필드를 일일이 채워야 한다. → 중복 코드가 발생한다.
- 기존의 문제점 ②: 초기화를 빼먹으면 "유령 객체"가 시스템에 존재할 위험이 있다.
this 키워드와 초기화 메서드
class MemberInit {
String name;
int age;
int grade;
void initMember(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
- this : 인스턴스 자기 자신의 참조값을 의미한다.
- 덕분에 매개변수 이름과 필드 이름이 같을 때 구분할 수 있다.
this.name = name;
// 왼쪽 this.name → 필드
// 오른쪽 name → 매개변수
생성자 도입
class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
- 사용 예시
MemberConstruct member1 = new MemberConstruct("user1", 15, 90);
- 객체 생성과 동시에 초기화할 수 있다.
- 필수값 입력을 강제할 수 있다.
기본 생성자
- 매개변수가 없는 생성자를 기본 생성자(default constructor)라고 한다.
- 클래스에 생성자가 하나도 없으면, 자바가 자동으로 만들어준다.
- 하지만 생성자를 하나라도 정의하면, 기본 생성자는 자동 생성되지 않는다.
class MemberDefault {
String name; // 컴파일러가 자동으로 기본 생성자 생성
}
- 필요하면 직접 기본 생성자를 정의할 수도 있다.
생성자 오버로딩과 this()
생성자도 메서드처럼 오버로딩 할 수 있다.
class MemberConstruct {
String name;
int age;
int grade;
MemberConstruct(String name, int age) {
this(name, age, 50); // 다른 생성자 호출
}
MemberConstruct(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
this()
- 생성자 내부에서 다른 생성자를 호출할 수 있다.
- 반드시 첫 줄에만 작성해야 한다.
실습 문제: Book 클래스
class Book {
String title;
String author;
int page;
Book() {
this("", "", 0);
}
Book(String title, String author) {
this(title, author, 0);
}
Book(String title, String author, int page) {
this.title = title;
this.author = author;
this.page = page;
}
void displayInfo() {
System.out.println("제목: " + title + ", 저자: " + author + ", 페이지: " + page);
}
}
- 사용 예시
Book book1 = new Book();
Book book2 = new Book("Hello Java", "Seo");
Book book3 = new Book("JPA 프로그래밍", "Kim", 700);
book1.displayInfo();
book2.displayInfo();
book3.displayInfo();
- 실행 결과
제목: , 저자: , 페이지: 0
제목: Hello Java, 저자: Seo, 페이지: 0
제목: JPA 프로그래밍, 저자: Kim, 페이지: 700
정리하자면...
- 생성자는 객체 생성 직후 필수 초기화를 보장하는 장치이다.
- 기본 생성자는 자동 제공되지만, 생성자를 하나라도 만들면 제공되지 않는다.
- 생성자 오버로딩을 통해 다양한 초기화 방법을 제공할 수 있다.
- this()를 활용해 중복 제거 및 코드 간결화를 할 수 있다.
- 좋은 프로그램 = 적절한 제약 → 생성자를 통해 잘못된 객체 생성을 방지한다.
생성자는 단순한 문법 요소가 아니라,
안전하고 일관된 객체 생성을 보장하는 핵심 도구이다.
'java' 카테고리의 다른 글
| Java 접근 제어자(Access Modifier)와 캡슐화 (1) | 2025.09.14 |
|---|---|
| Java 패키지(Package) 정리 (0) | 2025.09.14 |
| Java 객체 지향 프로그래밍(OOP) 정리 (0) | 2025.09.14 |
| Java 기본형(Primitive) vs 참조형(Reference) 정리 (0) | 2025.09.14 |
| Java 클래스와 데이터 정리 (0) | 2025.09.11 |