개발일지/Java

Java 생성자(Constructor)

E-room 2022. 9. 8. 22:22
728x90
객체를 생성하는 역할을 하는 클래스의 구성요소
인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드

 

new 키워드를 사용하여 객체를 생성할 때에 호출되는 것이 사실 생성자이다.

 

생성자라는 이름 때문에 생성자가 인스턴스를 생성하는 역할을 한다는 오해가 발생하는데, 사실이 아니다

인스턴스 생성을 담당하는 것은 new 키워드이며, 생성자는 인스턴스 변수들을 초기화하는 데 사용되는 특수한 메서드이다.

 

생성자는 메서드와 비슷한 구조를 가지고 있지만 크게 두 가지 부분에서 큰 차이를 갖는다.

  • 생성자의 이름은 반드시 클래스의 이름과 같아야 한다
  • 생성자는 리턴 타입이 없다. (void 키워드도 사용하지 않는다. 리턴하지 않는다는 의미의 void와는 다르게 아예 리턴 타입 자체가 존재하지 않는다.)
클래스명(매개변수) { // 생성자 기본 구조
    ... 생략 ...
}

 

생성자는 오버로딩이 가능하다

public class ConstructorExample {
    public static void main(String[] args) {
        Constructor constructor1 = new Constructor();
        Constructor constructor2 = new Constructor("Hello World");
        Constructor constructor3 = new Constructor(5,10);
    }
}

class Constructor {
    Constructor() { // (1) 생성자 오버로딩
        System.out.println("1번 생성자");
    }

    Constructor(String str) { // (2) 
        System.out.println("2번 생성자");
    }

    Constructor(int a, int b) { // (3) 
        System.out.println("3번 생성자");
    }
}
// 1번 생성자
// 2번 생성자
// 3번 생성자

 

 

기본 생성자(Default Constructor)

모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 한다. 하지만 만들지 않아도 오류가 발생하지 않는다.

왜냐하면 생성자를 만들지 않을 경우 자바 컴파일러가 기본 생성자를 자동으로 추가해줬기 때문이다.

class 클래스명 {
    클래스명() {}
}

DefaultConst {
    DefaultConst() {} // 만들지 않아도 이렇게 생긴 생성자가 자동으로 생긴다
}

만약에 생성자가 이미 추가되어 있다면 기본 생성자가 아닌 이미 추가되어있는 생성자를 기본으로 사용한다.

 

 

매개변수가 있는 생성자

매개변수가 있는 메서드처럼 매개변수를 통해 호출 시에 해당 값을 받아 인스턴스를 초기화하는 데 사용

고유한 특성을 가진 인스턴스들을 계속 만들어야하는 경우 인스턴스마다 각기 다른 값을 가지고 초기화할 수 있다.

 

매개 변수가 없다면

public class Main {
    public static void main(String[] args) {
        Car c = new Car(); // 객체 생성 후
        c.modelName = "G63Amg"; // 이름 지정
        c.color = "Red"; // 색깔 지정

        c.modelName();
        c.color();
    }
}

class Car {
    String modelName;
    String color;

    void modelName() {
        System.out.println(modelName);
    }

    void color() {
        System.out.println(color);
    }
}

 

매개 변수가 있다면

public class Main {
    public static void main(String[] args) {
        Car c = new Car("G63Amg", "Red"); // 객체 생성과 동시에 매개변수 지정

        c.modelName();
        c.color();
    }
}

class Car {
    String modelName;
    String color;

    Car(String modelName, String color) { // 생성자 매개변수 지정
        this.modelName = modelName;
        this.color = color;
    }

    void modelName() {
        System.out.println(modelName);
    }

    void color() {
        System.out.println(color);
    }
}

 

 

this() vs this

this()

자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용.

  • 반드시 생성자의 내부에서만 사용할 수 있다.
  • 반드시 생성자의 첫 줄에 위치해야한다.
public class Test {
    public static void main(String[] args) {
        Example example = new Example();
        Example example2 = new Example(5);
    }
}

class Example  {
    public Example() {
        System.out.println("Example의 기본 생성자 호출!");
    }

    public Example(int x) {
        this();
        System.out.println("Example의 두 번째 생성자 호출!");
    }
}

// 출력
Example의 기본 생성자 호출!
Example의 기본 생성자 호출!
Example의 두 번째 생성자 호출!

 

this  키워드

인스턴스 변수와 매개변수를 구분해주기 위한 용도로 주로 사용된다

this는 인스턴스 자신을 가리키며, 우리가 참조 변수를 통해 인스턴스의 멤버에 접근할 수 있는 것처럼 this를 통해서 인스턴스 자신의 변수에 접근할 수 있다.

public class Main {
    public static void main(String[] args) {
        Car car = new Car("G63Amg", "Red");
        car.modelName();
        car.color();
    }
}

class Car {
    private String modelName;
    private String color;

    public Car(String modelName, String color) {
        this.modelName = modelName;
        this.color = color;
    }

    public void modelName() {
        System.out.println(modelName);
    }

    public void color() {
        System.out.println(color);
    }
}
// 출력
G63Amg
Red

만약 위의 코드에서, this.modelName = modelName 대신 modelName = modelName이라고 작성하면 둘 다 지역변수로 간주된다.

728x90