Constructor (생성자)

2025. 4. 14. 17:09JAVA/JAVA 기초 문법

💻 Construcotr(생성자)란?

컨스트럭터는 객체를 만들 때 자동으로 호출되는 특별한 메서드다.

주로 객체의 초기값을 설정하거나 준비 작업을 수행한다.

클래스를 만들고 객체를 생성 하게 되면, 그 객체에 초기값을 넣는 작업이 필요한데,

이걸 일일이 나중에 하면 번거롭고, 실수할 가능성이 크다.

그래서 자바는 객체가 생성될 때 자동으로 초기화되는 코드를 만들 수 있도록 컨스트럭터 라는 특별한 메서드를 제공해준다.

 

💿 생성자의 역할

  • 객체 생성 시 자동 호출
  • 초기값 설정 (필드 초기화)
  • 객체 생성과 동시에 유효성 검사 수행 가능
  • 강제적인 초기화 → 실수 방지

💿 생성자와 new 키워드

new 키워드 객체를 생성할 때 사용하는 키워드
생성자 new 키워드에 의해 호출되는 초기화 함수 역할

 

new 키워드는 생성자를 호출하는 주체이고, 생성자 안에서는 다른 객체를 만들기 위해 new를 또 사용할 수 있다.

 

예제

Person person = new Person();
  • new Person()에서
    → new가 메모리에 객체 생성
    → 생성자 Person() 호출
    → 필드 초기화 등 수행됨

❌ 생성자 안에서 자기 자신을 new로 만들면?

public class Person {
    public Person() {
        Person person = new Person(); // ❌ 무한 루프 발생!! StackOverflowError
    }
}
  • 생성자 내부에서 다시 new Person() 호출
    → 다시 생성자 호출
    → 다시 new Person()
    → 무한 반복
    → 💥 StackOverflowError

💿 생성자 종류

📀 Default Constructor(기본 생성자)

파라미터가 없고, 클래스 이름과 동일하며 리턴값이 없는 생성자를 디폴트 생성자라한다.

public class Person {
    public Person() {} // Person : 메서드 이름 + () :파라미터 리스트
}

 

  • 파라미터(매개 변수)가 없음
  • 리턴값 없음
  • 클래스 이름과 동일
  • 직접 작성했기 때문에 명시적 Default Constructor

암시적 Default Constructor

public class Person {
    // 디포틀 컨스트럭터가 없음 > 컴파일 시 생성자가 자동 추가됨 
    // 디폴트 컨스트럭터는 우리가 작성하는 소스코드에는 전혀보이지 않지만
    // 바이트 코드 상에서는 
    // 부모 클래스의 디폴트 컨스트럭터를 호출한다!!
    // public Person() {}  
}
  • 클래스 내부에 생성자를 하나도 작성하지 않으면, 컴파일러가 자동 생성 → 하나의 생성자라도 있음 생성되지 않는다
  • 이 생성자는 아무 코드도 포함하지 않음 (빈 생성자)

❓ 기본 생성자 미 작성시 생기는 오류 예시 ❓

Person 클래스
public class Person {
    private String name;
    public Person(String name) {
        this.name = name;
        }
}

Main 클래스
public class Main {
	public static void main(String[] args) {		
		Person person = new Person(); // The constructor Test() is undefined 
	}                                     // 기본 생성자가 없어 생기는 컴파일 오류
}

 

‼️ Default Constructor을 작성하는 습관 들이기 

 

📀 Parameter Constructor(파라미터 생성자)

객체를 생성 시 값을 전달받아 멤버 변수를 초기화하는 생성자

public class Person {
    private int age;
    private String name;
    public Person() {}
    // 파라미터 생성자
    public Person(int age, String name) {
        this.age = age;
        this.name = name;
    }
}

 

💥 주의: 쉐도잉 문제 💥

❓ 쉐도잉 예제

public class Person {
    private String name;
    
    public Person(String name) {
        name = name;  // 💥 쉐도잉 발생! 멤버 변수에 값이 들어가지 않음
    }
}
  • 이 코드는 생성자 파라미터 name이 클래스 필드 name을 가린다.
  • 해결법 this 키워드 사용

올바른 코드 사용

public class Person {
    private String name;
    
    public Person(String name) {
        this.name = name; // ✅ this로 멤버 변수 명확히 지정
    }
}

 

 

📀 Constructor Overloading(오버로딩 생성자)

같은 클래스 안에서 이름은 같지만, 매개변수의 수나 타입이 다른 여러 생성자를 만드는 생성자

 

 예제

public class Person {
    String name;
    int age;

    // 기본 생성자
    public Person() {
        this("이름없음", 0); // 다른 생성자 호출
    }

    // 이름만 받는 생성자
    public Person(String name) {
        this(name, 0);
    }

    // 이름 + 나이 모두 받는 생성자
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

 

💥 주의: 오버로딩만 하고 기본 생성자 안 만들면?

public class Person{
    public Person(String name) { }
}

// Person person = new Person(); // ❌ 컴파일 오류! 기본 생성자 없음

💥 주의 : 오버로딩 생성자에서도 쉐도잉 문제가 발생할수 있다.

오버로딩 생성자에서도 생기는 쉐도잉 문제도 this 키워드를 통해 해결할 수 있다.

 

💿 생성자와 초기화의

생성자와 초기화는 서로 다른 개념이다.

하지만 생성자는 초기화를 수행할 수 있는 도구 중 하나

개념 정의 키워드
생성자 객체를 생성할 때 자동 호출되는 특수 메서드 객체 생성, 상태 설정
초기화 변수나 객체를 처음 사용할 수 있게 값 설정 값 세팅, 준비

 

 예제

ublic class Person {
    // 1. 생성자 초기화
    public Person(String name) {
        this.name = name;
        System.out.println("생성자 실행");
    }
   
    // 2. 명시적 초기화
    String name = "Unknown";

    // 3. 인스턴스 초기화 블록
    {
        System.out.println("초기화 블록 실행");
    }

    // 4. static 초기화 블록
    static {
        System.out.println("static 초기화 블록 실행");
    }
}

 

💿 생성자와 메서드의 차이점

생성자는 메서드와 다르게 return 타입이 없다

→ 생성자는 객체 생성 시 자동 실행되는 블록이기 때문에 리턴 타입이 없다.

항목 생성자 일반 메서드
이름 클래스명과 동일 개발자가 설정
리턴타입 없음 있음 (void, int 등)
호출 객체 생성 시 자동 호출 명시적 호출
목적 객체 초기화 특정 동작 실행

 

 

🎯 정리 🎯

자바에서 생성자는 객체를 의미 있는 상태로 태어나게 만들어주는 특수한 메서드이며,

객체 생성과 동시에 자동실행되어 초기화를 담당한다.

'JAVA > JAVA 기초 문법' 카테고리의 다른 글

Array(배열)  (0) 2025.04.23
자바에서 This  (0) 2025.04.15
Access Modifier(접근 제어자)  (0) 2025.04.04
변수(Variable) 필드(Field) 객체(Object)  (0) 2025.04.04
Parameter와 Argument  (0) 2025.04.02