Java 생성자 필요성

자바에서 프로그래밍 도중 생성자가 필요한 시점이 있다. 이 생성자가 왜 필요한지 예시 코드를 살펴보면서 생성자에 대해 알아본다.

먼저 예시 코드부터 살펴보도록 한다.

Student.java

public class Student {
    String name;
    int age;
    int grade;
}

Main.class

public class Main {
    public static void main(String[] args) {
        Student student1 = new Student();
        student1.name = "guest1";
        student1.age = 14;
        student1.grade = 90;

        Student student2 = new Student();
        student2.name = "guest2";
        student2.age = 19;
        student2.grade = 70;

        Student[] students = {student1, student2};

        for (Student s : students) {
            System.out.println("학생이름: " + s.name + ", 학생 나이: " + s.age + ", 학생 점수: " + s.grade);
        }
    }
}

출력 예시

학생이름: guest1, 학생 나이: 14, 학생 점수: 90
학생이름: guest2, 학생 나이: 19, 학생 점수: 70

new 키워드로 회원 객체를 생성하면 name, age, grade 변수에 초기 값을 할당한다.
이는 회원 객체를 다루기 위해서는 객체를 생성하자마자 초기값을 설정이 필요하기 때문이다. 이 코드에서는 초기 값 설정이 반복되는 것을 확인할 수 있다.

메소드를 추가하여 반복을 없애보도록 한다.


예시 코드 - 메소드 추가

Main 클래스에서 initStudent메소드를 추가하여 반복적인 초기 값 설정하는 부분을 없애보도록 한다.

Main.java

public class Main {
    public static void main(String[] args) {
        Student student1 = new Student();
        initStudent(student1, "guest1", 14, 90);
        Student student2 = new Student();
        initStudent(student2, "guest2", 19, 70);


        Student[] students = {student1, student2};

        for (Student s : students) {
            System.out.println("학생이름: " + s.name + ", 학생 나이: " + s.age + ", 학생 점수: " + s.grade);
        }
    }

    static void initStudent(Student s, String name, int age, int grade) {
        s.name = name;
        s.age = age;
        s.grade = grade;
    }
}

initStudent 추가하여 반복적인 초기 설정이 없어지고 정상적으로 출력되는 것을 확인할 수 있다.
그러나 initStudent 메소드의 파라미터 Class s 들어가는 부분이 거슬릴 수 있는데, 개선해보도록 한다.


예시 코드 - this 추가

앞서 설명한 코드를 개선해보도록 한다.
Main 에 분리되어있는 initStudent 기능 메소드를 initStudent 으로 옮겨주었다.

Student.java

public class Student {
    String name;
    int age;
    int grade;

    void initStudent(String name, int age, int grade) {
        this.name = name;
        this.age = age;
        this.grade = grade;
    }
}

Main.java

public class Main {
    public static void main(String[] args) {
        Student student1 = new Student();
        student1.initStudent( "guest1", 14, 90);
        Student student2 = new Student();
        student2.initStudent( "guest2", 19, 70);

        Student[] students = {student1, student2};

        for (Student s : students) {
            System.out.println("학생이름: " + s.name + ", 학생 나이: " + s.age + ", 학생 점수: " + s.grade);
        }
    }
}

프로그래밍 진행 시 앞서 만든 객체의 메소드(initStudent...)처럼 생성하고 바로 초기화하는 작업이 반복된다. 이러한 반복적인 작업을 제거하기 위해 생성자(Construct) 가 추가되었고, 이것은 객체를 생성하자마자 바로 필요한 기능을 수행할 수 있다.