[JAVA 객체지향프로그래밍] 생성자 (constructor)

    반응형

     

    이 글은 패스트 캠퍼스 한번에 끝내는 Java/Spring 웹 개발 마스터 초격차 패키지 강의를 듣고 공부한 내용을 바탕으로 정리한 글입니다.


     

    1. 생성자

    생성자는 객체를 생성할 때 호출되는 메서드입니다. 생성자는 힙 메모리에 인스턴스를 생성하는 역할을 합니다. 

    public className(parameter) {
    	// statements;
    }
    • 기본문법은 <class name>(<argument_list>) {<statements>} 입니다.
    • 객체를 생성할 때 new 키워드와 함께 사용됩니다. ex. new Student();
    • 객체가 생성될 때 변수나 상수를 초기과하거나 다른 초기화 기능을 수행하는 메서드를 호출합니다.
    • 생성자는 클래스 이름과 동일하고 반환값이 없습니다.
    • 대부분의 생성자는 외부에서 접근이 가능(외부에서 객체를 만들려면 당연히 생성자에 접근이 가능해야합니다)하지만, 필요에 의해 private으로 선언되는 경우도 있습니다.

     

    2. Default Constructor

    public className() {}

    하나의 클래스 안에는 반드시 하나 이상의 생성자가 존재해야 합니다. 하지만 클래스 내에 생성자를 따로 구현하지 않아도 new 키워드와 함께 생성자를 호출할 수 있습니다. 왜냐하면 클래스 안에 생성자를 하나도 구현하지 않으면 컴파일러가 자동으로 생성자 코드를 넣어주기 때문입니다. 이때 넣어지는 생성자 코드가 default constructor(기본생성자)입니다. 기본생성자는 매개 변수가 없고, 구현부도 없습니다.

    (하지만, 매개변수를 가지는 생성자를 하나라도 정의했다면, 기본 생성자는 자동으로 생성되지 않음에 주의해야 합니다.)

    예시로, Student 클래스를 다시 살펴보도록 하겠습니다.

     

    3. 생성자 구현

    그럼 이제 생성자를 직접 만들어보겠습니다. 클래스 이름인 Student와 같은 이름으로 public Student를 정의하고 매개변수로는 초기화할 멤버변수의 값들을 넘겨주겠습니다. 메서드의 body 부분에는 파라미터 값들로 멤버변수를 초기화하는 코드를 작성해주었습니다. 

    public class Student {
        public int studentId;
        public String studentName;
        public int grade;
    
        public Student(int studentId, String studentName, int grade) {
            this.studentId = studentId;
            this.studentName = studentName;
            this.grade = grade;
        }
    
        public String showStudentInfo() {
            return "Student{" +
                    "studentId=" + studentId +
                    ", studentName='" + studentName + '\'' +
                    ", grade=" + grade +
                    '}';
        }
    }

     

    이렇게 생성자 정의후, 메인함수에서 객체를 만들고 멤버변수들의 값들을 찍어보겠습니다.

     

    public class StudentTest {
        public static void main(String[] args) {
            Student studentTest = new Student(19, "Test Student", 1);
    
            System.out.println(studentTest.studentId);
            System.out.println(studentTest.studentName);
            System.out.println(studentTest.grade);
        }
    }

    생성된 객체의 멤버변수들의 값들이 생성자에 의해 초기화되어있음을 확인할 수 있습니다.

     

    3. 생성자 오버로딩 (overloading)

    오버로딩은 같은 이름의 메서드를 중복하여 정의하는 것을 말합니다. 같은 메서드를 호출하더라도 호출하는 코드에 따라 다른 메서드가 호출되게 됩니다. 즉, 한 클래스 내에서 같은 이름의 메서드가 있더라도 매개변수의 개수나 타입이 다르면 같은 이름의 메서드를 중복해서 정의할 수 있습니다. 

    오버로딩의 조건은 메서드의 이름이 같고, 매개변수의 개수나 타입이 달라야 합니다.(그래야 컴파일러가 어떤 메서드를 쓸지 결정할 수 있겠죠?)

    public class Student {
        public int studentId;
        public String studentName;
        public int grade;
    
        public Student(int studentId, String studentName, int grade) {
            this.studentId = studentId;
            this.studentName = studentName;
            this.grade = grade;
        }
    
        public String showStudentInfo() {
            return "Student{" +
                    "studentId=" + studentId +
                    ", studentName='" + studentName + '\'' +
                    ", grade=" + grade +
                    '}';
        }
    }

    위의 코드에서는 생성자가 2개 정의되어있습니다. Default constuctor(public Student() {})와 매개변수를 3개 가지는 생성자(public Student(int studentId, String studentName, int grade) {...})가 있습니다.

    따라서 아래 메인 함수에서 studentDefault 객체는 매개변수가 없는 생성자를 호출하고, studentOverloaded 객체는 int, String, int 파라미터를 갖는 생성자를 호출하게 됩니다. 같은 Student 생성자를 부르더라도 매개변수가 달라짐에 따라 다른 생성자를 호출하게 되는 것이지요.

    public class StudentTest {
        public static void main(String[] args) {
            Student studentDefault = new Student();
            Student studentOverloaded = new Student(19, "Eunbin Kwon", 3);
    
            System.out.println(studentDefault.studentId);
            System.out.println(studentDefault.studentName);
            System.out.println(studentDefault.grade);
    
            System.out.println(studentOverloaded.studentId);
            System.out.println(studentOverloaded.studentName);
            System.out.println(studentOverloaded.grade);
        }
    }

    main 함수에서 각 생성자로 생성된 객체의 멤버변수 값을 찍어보면 생성자에 의해 멤버변수들이 초기화가 되어있음을 알 수 있습니다. 

    자바에서 지역변수는 자동으로 초기화되지 않지만, 멤버변수는 생성자에 의해 자동으로 초기화됩니다. 

    Default constructor에 의해 생성된 객체의 integer형 멤버변수는 0으로, String 멤버변수는 null로 초기화되었고, 오버로딩 생성자로 생성된 객체들은 넘겨준 파라미터의 값들로 초기화된 것을 확인할 수 있습니다.

     

     

     

     

    반응형

    댓글