[Day 4 | Java] 생성자

y♡ding·2024년 10월 17일
0

데브코스 TIL

목록 보기
14/163

📌 생성자(Constructor)란?

생성자는 객체가 생성될 때 자동으로 호출되는 특별한 메서드로, 객체의 인스턴스 변수 초기화를 위해 사용된다. 생성자는 인스턴스 생성 시에 필요한 초기 작업을 수행하며, 일반 메서드와는 몇 가지 중요한 차이점이 있다.

🤞🏻 생성자의 특징

  1. 클래스 이름과 동일해야 한다.
  2. 리턴 타입이 없다. (void조차 적지 않음)
  3. 객체가 생성될 때 자동으로 한 번 호출된다.
  4. 오버로딩이 가능하다. 즉, 매개변수의 개수와 타입에 따라 여러 개의 생성자를 정의할 수 있다.
  5. 기본 생성자는 코드에 생성자가 하나도 없을 경우에 한해서 컴파일러가 자동으로 제공한다.
  6. 하지만 명시적으로 하나라도 생성자를 정의하면, 기본 생성자는 자동으로 생성되지 않는다.

✔️ 생성자의 기본 동작

생성자는 객체를 new 키워드를 통해 생성할 때 호출된다. 이때 객체는 메모리에 할당되고, 생성자가 호출되면서 초기화 작업을 수행한다. 생성자는 독립적으로 호출할 수 없으며, 반드시 객체 생성 시 함께 호출된다.

기본 생성자

class Constructor {
    Constructor() {
        System.out.println("생성자 호출");
    }
}

public class ConstructorMainEx01 {
    public static void main(String[] args) {
        Constructor c = new Constructor();  // '생성자 호출' 출력
    }
}

Constructor 클래스는 매개변수가 없는 기본 생성자를 정의하고 있다. new Constructor()를 호출하면, 해당 생성자가 자동으로 호출된다.


🚨 생성자와 기본 생성자(Default Constructor)

  • 기본 생성자는 매개변수가 없는 생성자를 의미한다. 클래스에 생성자가 하나도 정의되어 있지 않으면 컴파일러가 자동으로 기본 생성자를 추가해준다.
  • 하지만 매개변수를 가지는 생성자를 정의하면, 컴파일러는 기본 생성자를 추가하지 않는다. 이 경우, 기본 생성자를 직접 정의하지 않으면, 기본 생성자를 호출하려고 할 때 오류가 발생힌다.

매개변수가 있는 생성자만 있을 때의 오류

class Book {
    String title;
    int price;

    Book(String title, int price) {  // 매개변수가 있는 생성자
        this.title = title;
        this.price = price;
    }
}

public class HelloWorld {
    public static void main(String[] args) {
        Book b1 = new Book();  // 오류 발생: 기본 생성자가 없기 때문
        Book b2 = new Book("국어책", 3000);
    }
}

Book 클래스는 매개변수가 있는 생성자만 정의되어 있어, new Book()처럼 기본 생성자를 호출하려고 하면 오류가 발생한다.

해결 방법: 기본 생성자를 추가

class Book {
    String title;
    int price;

    Book() {}  // 기본 생성자 추가

    Book(String title, int price) {  // 매개변수가 있는 생성자
        this.title = title;
        this.price = price;
    }
}

🌀 생성자의 오버로딩 (Overloading)

생성자도 오버로딩이 가능하다. 즉, 같은 이름의 생성자를 매개변수의 개수나 타입에 따라 여러 개 정의할 수 있다. 따라서, 객체 생성 시 다양한 방법으로 초기화가 가능하다.

class Constructor {
    String name;

    Constructor() {  // 기본 생성자
        this.name = "홍길동";
    }

    Constructor(String name) {  // 매개변수를 받는 생성자
        this.name = name;
    }
}

public class ConstructorMainEx02 {
    public static void main(String[] args) {
        Constructor c1 = new Constructor();  // 기본 생성자 호출
        System.out.println(c1.name);  // 홍길동 출력

        Constructor c2 = new Constructor("박문수");  // 매개변수가 있는 생성자 호출
        System.out.println(c2.name);  // 박문수 출력
    }
}

👌🏻 thisthis()의 사용

  1. this 키워드: 객체 자신을 가리키는 참조 변수로, 인스턴스 변수와 매개변수를 구분할 때 사용된다.
  2. this(): 다른 생성자를 호출할 때 사용한다. 생성자 내부에서 this()를 사용하면, 같은 클래스 내의 다른 생성자를 호출하여 중복 코드를 줄이고, 생성자 간에 초기화 작업을 공유할 수 있다.

this()를 이용한 생성자 호출

class Constructor {
    String name;
    int age;

    Constructor() {
        this("홍길동", 30);  // 매개변수가 있는 생성자 호출
    }

    Constructor(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class ConstructorMainEx03 {
    public static void main(String[] args) {
        Constructor c = new Constructor();
        System.out.println(c.name + " " + c.age);  // 홍길동 30 출력
    }
}

📌 생성자의 역할

  • 객체 초기화: 생성자의 주요 목적은 인스턴스 변수들을 초기화하는 것이다.
  • 자동 호출: new 키워드와 함께 객체가 생성될 때 자동으로 호출된다.
  • 오버로딩 지원: 다양한 방식으로 객체를 초기화할 수 있도록 매개변수에 따라 여러 개의 생성자를 정의할 수 있다
  • 기본 생성자: 생성자를 정의하지 않으면 컴파일러가 자동으로 기본 생성자를 생성하지만, 다른 생성자가 있으면 기본 생성자는 자동으로 생성되지 않으므로 명시적으로 추가해야 할 수 있다.

🙋🏻‍♀️ 생성자도 클래스의 메소드라고 할 수 있나요?

생성자가 메소드라고 말할 수는 없지만, 기능적으로 메소드와 비슷한 역할을 수행한다고 볼 수 있습니다.


✔️ 생성자와 메소드의 공통점

  • 코드 블록: 생성자와 메소드 모두 코드 블록을 실행하는 구조입니다. 즉, 생성자와 메소드는 모두 코드를 실행하는 기능을 가지고 있습니다.
  • 클래스의 멤버: 생성자와 메소드는 모두 클래스의 멤버로 정의됩니다.
  • 오버로딩 가능: 생성자와 메소드는 모두 오버로딩이 가능하여, 동일한 이름을 가지면서 매개변수만 다르게 정의할 수 있습니다.

✔️ 생성자와 메소드의 차이점

  • 이름:
    • 생성자: 클래스의 이름과 동일해야 하며, 반환 타입이 없습니다.
    • 메소드: 개발자가 원하는 이름을 지정할 수 있고, 반환 타입(또는 void)을 명시해야 합니다.
  • 반환 타입:
    • 생성자: 반환 타입이 없으며, 생성자는 객체를 생성할 때 호출되는 특별한 역할을 하기 때문에 값을 반환하지 않습니다.
    • 메소드: 메소드는 명시적으로 값을 반환할 수 있으며, 반환 타입을 지정해야 합니다. 반환값이 없는 경우에는 void로 정의합니다.
  • 호출 방식:
    • 생성자: 객체가 생성될 때 자동으로 호출됩니다. 개발자가 생성자를 직접 호출할 수는 없으며, new키워드를 사용하여 객체를 생성할 때만 호출됩니다.
    • 메소드: 개발자가 직접 호출할 수 있으며, 객체가 생성된 후에도 호출할 수 있습니다.
  • 목적:
    • 생성자: 객체가 생성될 때 호출되며, 객체의 초기화 작업을 수행하는 것이 주된 목적입니다. 생성자는 객체를 만들기 위한 필수적인 요소입니다.
    • 메소드: 메소드는 객체가 생성된 이후, 객체의 동작을 정의하고 특정 작업을 수행하는 데 사용됩니다. 메소드는 객체의 상태를 변경하거나 기능을 수행하기 위해 호출됩니다.
  • 선언 시점:
    • 생성자: 생성자는 반드시 클래스가 정의될 때 포함되며, 명시적으로 정의하지 않으면 기본 생성자가 자동으로 제공됩니다.
    • 메소드: 메소드는 명시적으로 정의해야 하며, 자동으로 생성되지 않습니다.

0개의 댓글

관련 채용 정보