공부/전자컴퓨터공학

생성자(Constructor)란? 자바 기초 배우기

AhJustC 2024. 5. 26. 16:49
반응형
생성자(Constructor)란?

생성자는 말 그대로 객체를 생성하는 역할을 하는 클래스의 구성 요소로, 인스턴스가 생성될 때 호출되는 인스턴스 초기화 메서드라 정리할 수 있다. new 키워드를 사용하여 객체를 생성할 때 호출 되는 것이 생성자이다. 인스턴스 생성을 담당하는 것은 new 키워드이며 생성자는 인스턴스 변수들을 초기화하는데 사용되는 특수한 메서드라 할 수 있다.

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

  • 첫 번째, 생성자의 이름은 반드시 클래스의 이름과 같아야 한다.
  • 두 번째, 생성자는 리턴 타입이 없다. 
클래스명(매개변수) { // 생성자 기본 구조
	...생략...
}

 

생성자 생성 예제

 

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번 생성자");
    }
}

 

기본 생성자(Default Constructor)

모든 클래스에는 반드시 하나 이상의 생성자가 존재해야 한다. 지금까지 생성자를 따로 만들지 않아도 정상적으로 인스턴스를 만들 수 있었던 이유는 만약 생성자가 클래스 안에 포함되어 있지 않은 경우에는 자바 컴파일러가 기본 생성자를 자동으로 추가해주기 때문이다. 컴파일러가 자동 추가해주는 기본 생성자에는 매개변수도 없고 바디에 아무런 내용이 없다.

 

매개변수가 있는 생성자

 

매개변수가 있는 생성자는 메서드처럼 매개변수를 통해 호출 시에 해당값을 받아 인스턴스를 초기화 하는데 사용된다. 고유한 특성을 가진 인스턴스를 계속 만들어야 하는 경우 인스턴스마다 각기 다른 값을 가지고 초기화할 수 있어서 매우 유용하다.

public class ConstructorExample {
    public static void main(String[] args) {
        Car c = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + c.getModelName() + "이고, 컬러는 " +  c.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

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

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

위의 예시를 보면 Car 인스턴스를 생성시 매개변수가 있는 생성자를 사용하게 되면 인스턴스를 만든 후에 인스턴스 필드값을 일일이 설정해줄 필요없이 생성과 동시에 원하는 값으로 설정해 줄 수 있다.

또한 생성자의 모양에 따라서 객체를 생성하는 방법도 달라진다. 기본 생성자의 경우 매개변수가 없기 때문에 new 키워드와 생성자를 호줄하면 되지만 매개변수가 있는 경우에는 그 개수와 타입에 알맞게 생성자를 호출해주어야 한다.

반응형
this()

앞서 메서드의 호출 내용에서 같은 클래스 안에 메서드들끼리 서로 호출할 수 있었던 것처럼 생성자도 상호 호출이 가능하다. 그리고 이를 위해 사용하는 것이 this() 메서드 이다. 한마디로 this() 메서드는 자신이 속한 클래스에서 다른 생성자를 호출하는 경우에 사용한다. 예를 들면 클래스명이 Car 라는 Car 클래스의 생성자를 호출하는 것은 Car()가 아니라 this()이고, 그 효과는 Car()생성자를 호출하는 것과 동일하다. this() 메서드를 사용하기 위해서는 크게 두 가지의 문법 요소를 충족 시켜야 한다. 

  • 첫째, 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의 두 번째 생성자 호출!");
    }
}

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

전반적인 실행 흐름을 위주로 살펴보자면 Example 클래스는 두 개의 생성자를 가지고 있다. 하나는 매개변수가 필요하지 않은 기본 생성자이고, 다른 하나는 int 타입의 매개변수를 받고 있는 생성자이다. 그리고 두 번째 생성자 내부의 첫번째 줄에 this() 메서드가 포함되어 있다.

Example 클래스를 기반으로 만들어지는 인스턴스를 생성하면 첫 번째 생성자가 호출되고 그 결과로 Example의 기본 생성자 호출! 이라는 문구가 출력된다. 다음으로 두 번째 생성자를 사용하여 객체를 만드는 과정에서 생성자가 호출되면 먼저 this() 메서드가 출력되어 첫 번째 기본 생성자가 호출되고 그 다음으로 Example의 두 번째 생성자 호출! 이라는 문구가 출력된다.

 

this

앞서 배운 this()메서드와 매우 유사한 생김새를 가지지만 쓰임새는 전혀 다른 this 키워드에 대해 알아보자.

public class ConstructorExample {
    public static void main(String[] args) {
        Car car = new Car("Model X", "빨간색", 250);
        System.out.println("제 차는 " + car.getModelName() + "이고, 컬러는 " +  car.getColor() + "입니다.");
    }
}

class Car {
    private String modelName;
    private String color;
    private int maxSpeed;

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

    public String getModelName() {
        return modelName;
    }

    public String getColor() {
        return color;
    }
}

//Output
제 차는 Model X이고, 컬러는 빨간색입니다.

위의 예제에서 Car 클래스를 한번 살펴보자. 인스턴스 변수로 modelName, color, 그리고 maxSpeed가 선언 되어있다. 동시에 생성자 매개변수로도 정의 되어있다. 이런 경우 인스턴스 변수와 매개변수를 이름만으로 구분하기가 어려워지는 문제가 발생하게 되는데 이를 구분해주기 위한 용도로 주로 사용되는 방법이 바로 this 키워드이다.

만역 위의 코드에서 this.modelName = modelName 대신 modelName = modelName 이라고 작성하면 둘 다 지역 변수로 간주하게 된다. 모든 메서드에는 자신이 포함된 클래스의 객체를 가리키는 this 라는 참조변수가 있는데 일반적인 경우에는 컴파일러가 this.를 추가해주기 때문에 생략하는 경우가 많다.

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

반응형