[Java] 기초 - 생성자

이지연·2025년 12월 17일

개요

아래의 내용은 java_grammer 레파지토리 C02MethodClass 디렉터리에 저장되어있는 내용을 정리하였다.


1. 생성자란?

생성자 특징:

  • 클래스명과 메서드명이 동일
  • 반환타입 없음 (void도 사용 X)
  • 메서드 오버로딩 가능
  • new 키워드로 객체 생성 시점에 자동 호출
// 객체 생성 시점에 자동 호출
Calendar c2 = new Calendar("2025", "12", "16"); 
// ↑ 생성자 Calendar(String, String, String) 호출

2. 생성자 사용 전후 비교

생성자 없이 setter 사용

Calendar c1 = new Calendar();  // 기본 생성자 (숨어있음)
c1.setYear("2025");
c1.setMonth("12"); 
c1.setDay("16");

문제점:

  • setter를 통해 외부에서 직접 변수 변경 가능 → 데이터 안정성 저하
  • 초기화 코드가 분산되어 가독성 저하

생성자 사용

Calendar c2 = new Calendar("2025", "12", "16"); // 한 번에 초기화

장점:

  • 불변성 보장: 생성 후 변수 변경 불가
  • 초기화 코드 집중: 한 곳에서 관리
  • setter 불필요

3. 생성자 오버로딩

// 기본 생성자 (명시적으로 선언)
public Calendar() { }

// 매개변수 생성자
public Calendar(String year, String month, String day) {
    this.year = year;
    this.month = month;
    this.day = day;
}

중요: 직접 생성자 1개라도 선언하면 기본 생성자 자동 생성 안됨.
필요시 별도로 추가해야 한다.


4. toString() 메서드 오버라이딩

객체를 출력할 때 주소값 대신 유의미한 정보를 보여주는 메서드.

@Override
public String toString() {
    return "{" +
           "year='" + year + '\'' +
           ", month='" + month + '\'' +
           ", day='" + day + '\'' +
           '}';
}
System.out.println(c2); 
// {year='2025', month='12', day='16'}

5. 자료구조에 사용자 정의 객체 저장

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 타입만 저장 보장.


6. 완전한 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 + '\'' + '}';
    }
}

7. 실무에서의 생성자 활용

좋은 설계 (Immutable 객체)

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 남발 대신 생성자로 불변 객체를 만드는 것이 객체지향의 정석이다.

profile
Eazy하게

0개의 댓글