자바/정리

(JAVA)생성자

acid7937 2022. 11. 10. 13:12

생성자... 또 뭘 생성하지...? 나 같은 사람들이 있다면 클래스 파트 들어올 때부터 한숨 쉬며 시작하는 사람들이 있을수 있다고 생각한다.

 

생성자라는 말이 다소 생소하지만 우리는 이미 생성자를 쓰고 있었다. 예제를 보자.

 

public class Calculator3 {

    int left, right;

    public void enter(int left, int right) {
        this.left = left;
        this.right = right;
    }

    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }

    public void sum() {
        System.out.println(this.left + this.right);
    }

    public static void main(String[] args) {

        Calculator3 c1 = new Calculator3();

        c1.enter(10,20);
        c1.sum();
        c1.avg();

        Calculator3 c2 = new Calculator3();
        c2.enter(20,40);
        c2.sum();
        c2.avg();

    }
}

이 코드를 클래스와 인스턴스 포스트에서 본적이 있다. (https://acid7937.tistory.com/13)

 

Calculator3 c1 = new Calculator3(); 부분이 Calculator3 클래스 내용을 가져와서 c1이라는 인스턴스 변수를 선언하여 인스턴스를 만들었다고 말했었다.

 

맞는말이다. 하지만 자세히 이야기 하면 Calculator3라는 메서드를 가져온것이며 Calculator3는 생성자이다. (아니 메서드면 메서드인것이지 뭘또 생성자라고 하냐!!!)

 

맙소사... 무슨 일인지 살펴보자.

 

생성자는 초기화 작업이며 프로그램 시작시 공백으로 시작한다고 생각하면 된다. 그래야 깨끗한 메모리에 우리가 원하는 값을 넣을것이 아닌가? 그런 이유로 하나의 클래스는 반드시 하나의 생성자를 갖는다.

 

여기서 드는 생각이... 우리는 지금까지 생성자 메서드를 따로 만든적 없이 잘만 코딩해 왔는데? 아니다... 사실 자바는 사용자가 생성자를 따로 만들어 주지 않는다면 기본 생성자를 만들어 준다.

 

클래스이름(){};  이렇게 말이다. 자 그럼 생성자를 우리가 건들면 어떨까 예제를 보자.

 

 

public class Calculator3 {

    int left, right;

    public Calculator3(int left, int right) {
        this.left = left;
        this.right = right;
    }

    public void avg() {
        System.out.println((this.left + this.right) / 2);
    }

    public void sum() {
        System.out.println(this.left + this.right);
    }

    public static void main(String[] args) {

        Calculator3 c1 = new Calculator3(10, 20);

        // c1.enter(10,20);
        c1.sum();
        c1.avg();

        Calculator3 c2 = new Calculator3(20, 40);
        //c2.enter(20,40);
        c2.sum();
        c2.avg();

    }
}

 

우리는 바뀐점을 살펴봐야 한다.

 

1. 먼저 기존 enter 메서드의 이름이 Calculator3로 클래스와 동일한 이름으로 변경이 되었고 void가 안보인다.

2. 인자값을 인스턴스 생성자 옆에 붙여 버렸다.

 

살펴보면 앞서 생성자는 초기화라고 언급하였다. 위에서 기본 생성자는 클래스이름(){}; 라고 말하였는데 이걸 우리가 직접 타이핑해서 만들면 생성자를 우리가 설정해 준것이다. 그래서 클래스 이름과 메서드 이름이 같은 것이다.

 

생성자는 인자를 받아서 매개변수에 값을 넣을수 있는데 이는 클래스 메서드에 인자를 입력하고 매개변수에 적용시키는 방식과 거의 같다! https://acid7937.tistory.com/12 하지만 인스턴스는 따로 생성자를 만들어 줘야 한다는 점이 다르다.

 

또한 void 가 안보이는 이유는 void 뜻이 리턴값을 받지 않는다는 것인데, 생성자는 void가 포함되도록 설계 되었다. 따라서 void를 따로 붙여주지 않는다.

 

뭐... 아주 기본적인 내용은 별거 없다... 하지만 생성자는 이게 끝이 아니다. 다른 포스트에서 이어가겠다.