생성자

생성자는 클래스로부터 객체를 생성할 때 자동으로 호출되는 메소드를 말한다. 객체의 멤버 변수 초기화를 담당하는 특수한 목적의 메소드이다.

 

생성자의 개념과 특징

  • 메소드 이름이 클래스 이름과 동일하다.
  • 리턴 타입이 없으며, void조차 허용하지 않는다.
  • 객체 생성 시 자동으로 호출되며, 일반 메소드처럼 참조 변수를 통해 호출할 수 없다.
  • 생성되는 객체의 멤버 변수 초기화를 담당한다.
  • 생성자가 하나도 정의되지 않은 클래스에는 기본 생성자가 자동으로 제공된다.
  • 하나의 클래스에 여러 개의 생성자를 오버로딩 할 수 있다.
  • this() 형태의 특수한 생성자가 있다.

 

기본 생성자

기본 생성자는 매개변수가 없는 생성자를 의미한다.

생성자의 가장 중요한 기능이 멤버 변수의 초기화인데, 기본 생성자는 매개변수를 가질 수 없기 때문에 멤버 변수를 기본값으로 초기화한다.

그래서 기본 생성자라는 이름을 갖게 된 것이다.

 

기본 생성자의 또 다른 특징으로는 클래스에 생성자가 하나도 없을 때 기본으로 제공된다는 것이다. 따라서 다음 두 클래스는 동일한 코드라고 볼 수 있다.

 

public class Student {
	String name;
    int score;
}
public class Student {
	String name;
    int score;
    
    Student() {}
}

 

 

생성자를 통해서 객체의 멤버변수를 초기화 하기

// 1. 클래스 선언부
public class Student {
    public String name;
    public int score;
    public boolean isPassed;
    public String major;

    public Student() {}

    public Student(String stdName, int stdScore, boolean stdIsPassed, String stdMajor) {
        name = stdName;
        score = stdScore;
        isPassed = stdIsPassed;
        major = stdMajor;
    }

    public void printInfo() {
        System.out.println(name + "의 전공 : " + major + " 점수 : " + score + " 시험 통과 여부 : " + isPassed);
    }

}

public Student() {}  는 기본생성자이고, 그 아래에 매개변수를 가지고 있는 public Student( ... ) {} 는 멤버변수 값을 초기화 해주는 오버로딩된 생성자이다.

 

기본 생성자로 객체를 선언하게 되면 멤버변수값들이 아래와 같이 기본값으로 초기화가 된다. int type의 score 는 0, boolean 타입의 isPassed는 false, 참조 변수 타입인 name, major는 null 값을 갖게 된다.

public class Main {
    public static void main(String[] args) {
        Student millpre = new Student();
        millpre.printInfo();
    }
}

 

아래와 같이 매개변수를 넣어 선언하게 되면 매개변수에 맞게 멤버변수 값들이 초기화 되는 것을 확인할 수 있다.

public class Main {
    public static void main(String[] args) {
        Student millpre = new Student("millpre", 90, true, "cs");
        millpre.printInfo();
    }
}

 

this() 생성자

생성자의 이름은 반드시 클래스의 이름과 동일해야 한다. 그런데 생성자 중에 클래스의 이름을 사용하지 않는 this() 라는 독특한 생성자가 존재한다.

this() 생성자를 이용하면 같은 클래스에 있는 다른 생성자를 호출할 수 있다. 이를 통해 생성자 내의 코드 중복을 제거할 수 있다.

코드를 보면 바로 이해할 수 있을 것이다.

// 1. 클래스 선언부
public class Student {
    public String name;
    public int score;
    public boolean isPassed;
    public String major;

    public Student() {}
    
    public Student (String stdName, int stdScore) {
        name = stdName;
        score = stdScore;
    }

    public Student(String stdName, int stdScore, boolean stdIsPassed, String stdMajor) {
        this(stdName, stdScore);
        isPassed = stdIsPassed;
        major = stdMajor;
    }

    public void printInfo() {
        System.out.println(name + "의 전공 : " + major + " 점수 : " + score + " 시험 통과 여부 : " + isPassed);
    }

}

 

728x90

'Language > JAVA' 카테고리의 다른 글

[JAVA] Enum 열거형  (0) 2023.11.04
[JAVA] Getter/Setter  (0) 2023.11.02
[JAVA] 값 복사와 주소 복사  (0) 2023.10.25
[JAVA] Java Collections / Array / ArrayList  (2) 2023.10.25
[JAVA] 테스트코드 작성하기  (1) 2023.10.24

+ Recent posts