아래의 내용은 java_grammer 레파지토리 C02MethodClass 디렉터리에 저장되어있는 내용을 정리하였다.
생성자 특징:
new 키워드로 객체 생성 시점에 자동 호출// 객체 생성 시점에 자동 호출
Calendar c2 = new Calendar("2025", "12", "16");
// ↑ 생성자 Calendar(String, String, String) 호출
Calendar c1 = new Calendar(); // 기본 생성자 (숨어있음)
c1.setYear("2025");
c1.setMonth("12");
c1.setDay("16");
문제점:
Calendar c2 = new Calendar("2025", "12", "16"); // 한 번에 초기화
장점:
// 기본 생성자 (명시적으로 선언)
public Calendar() { }
// 매개변수 생성자
public Calendar(String year, String month, String day) {
this.year = year;
this.month = month;
this.day = day;
}
중요: 직접 생성자 1개라도 선언하면 기본 생성자 자동 생성 안됨.
필요시 별도로 추가해야 한다.
객체를 출력할 때 주소값 대신 유의미한 정보를 보여주는 메서드.
@Override
public String toString() {
return "{" +
"year='" + year + '\'' +
", month='" + month + '\'' +
", day='" + day + '\'' +
'}';
}
System.out.println(c2);
// {year='2025', month='12', day='16'}
List<Calendar> c_list = new ArrayList<>();
c_list.add(c1);
c_list.add(new Calendar("2024", "01", "12"));
System.out.println("리스트 : " + c_list);
// 리스트 안에는 Calendar 객체 주소들이 들어있음
<Calendar> 제네릭: List에 Calendar 타입만 저장 보장.
class Calendar {
private String year, month, day;
// 생성자 오버로딩
public Calendar() { }
public Calendar(String year, String month, String day) {
this.year = year;
this.month = month;
this.day = day;
}
// 출력 메서드
public String getNowInfo() {
return "현재 날짜는 " + year + "-" + month + "-" + day + "입니다.";
}
@Override
public String toString() {
return "{" + "year='" + year + '\'' + ", month='" + month + '\'' + ", day='" + day + '\'' + '}';
}
}
public class User {
private final String name;
private final int age;
public User(String name, int age) { // 생성자만으로 초기화
this.name = name;
this.age = age;
}
// setter 없음 → 불변성 보장
}
public class User {
private String name;
private int age;
// setter로 변경 가능 → 안정성 저하
public void setName(String name) { this.name = name; }
}
| 구분 | 특징 | 장점 |
|---|---|---|
| 기본 생성자 | () | 자동 생성 (직접 생성자 없으면) |
| 매개변수 생성자 | (String, String, String) | 초기화 + 불변성 |
| toString() | @Override | 객체 정보 출력 |
생성자는 객체 초기화의 핵심이다.
setter 남발 대신 생성자로 불변 객체를 만드는 것이 객체지향의 정석이다.