생성자는 객체를 생성하면서 ( 해야될 일 들, 하고 싶은 일들 ) 구현하는 것
또는 인스턴스가 생성될 때 호출되는 초기화메서드
구조는 리턴값이 없다. 그렇다고 void를 사용하지 않는다. 이유는 모든 생성자가 리턴값이 없으므로 void를 생략할 수 있게 한 것이다.
조건은
1. 생성자의 이름은 클래스이 이름과 같아야 한다.
2. 생성자는 리턴 값이 없다.
public class Student {
int studentID;
String studentName;
int grade;
String address;
// 이 객체를 생성할 때, 무조건 이름 or id을 가지고 생성해야한다면
// 생성자를 이용하는 것이다.
public Student(int id, String name) { // 매개변수가 있는 생성자
// 이 객체가 생성될 때 2개의 매게변수를 받고 있다.
// id, name를 받으면 이 Student 변수에 넣어줘야 heap 메모리 값이 들어간다.
this.studentID = id;
this.studentName = name;
}
}
- 디폴트 생성자 (기본 생성자)
클래스 생성 시 자동으로 생기는 기본 생성자
만약 클래스에 매개변수가 있는 생성자를 추가하면 디폴트 생성자는 제공되지 않는다.
매개변수가 있는 생성자를 쓴 경우 디폴트 생성자 필요하다면 따로 명시해줘야 한다.
- 매개변수가 있는 생성자
// 1. 인스턴스를 생성한 다음 인스턴스 변수의 값을 변경
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
// 2. 매개변수를 갖는 생성자를 사용하는 것보다 코드를 보다 간결, 직관적.
Car c = new Car("white", "auto", 4);
- 생성자에서 다른 생성자 호출하기 - this(), this
조건
1. 생성자의 이름으로 클래스이름 대신 this를 사용한다.
2. 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
첫줄에만 가능한 이유는 생성자내에서 초기화 작업도중에 다른 생성자를 호출하게 되면,
호출한 다른 생성자 내에서도 멤버변수들의 값을 초기화를 할 것이므로 다른 생성자를 호출하기 이전의 초기화 작업이 무의미해진다.
// 1. 로컬변수, 인스턴스변수가 서로 구별 될 때
Car (String c, String g, int d) {
color = c;
gearType = g;
door = d;
}
// 2. 두 변수가 서로 구별이 안될 때
Car (String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
this.color 는 인스턴스 변수, color 는 로컬변수
- 생성자 오버로드
필요에 의해 생성자 추가하는 경우 여러개의 생성자가 하나의 클래스에 있다.
예) 한 클래스 안에 디폴트 생성자, name을 매개변수로 받는 생성자, id/name를 매개변수로 입력받는 생성자
생성자?
인스턴스(객체)를 생성한 후에 사용하기 전에(제대로 쓰일 수 있도록)
유효한(적당한) 값으로 초기화시키는 작업을 수행한다.