생성자란? 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행돼야 하는 작업을 위해서도 사용된다.
생성자 역시 메서드처럼 클래스내에 선언할 수 있고, 구조도 메서드와 매우 유사하지만 리턴값이 없다는점이 다르다. 그렇다고 일반 메서드처럼 void를 붙힐 필요도 없다.
생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야한다.(대,소문자포함)
2. 생성자는 리턴 값이 없다.
생성자는 다음과 같이 정의하고 오버로딩이 가능하여 여러개의 생성자를 만들 수 있다.
클래스이름 (타입 변수명1, 타입 변수명2, ...) {
// 인스턴스 생성 시 수행될 코드,
// 주로 인스턴스 변수의 초기화 코드를 적는다.
}
지금까지는 클래스를 정의할 때 생성자를 정의하지 않았지만 모든 클래스에는 생성자가 있어야한다. 우리가 굳이 코드에 작성하지 않아도 컴파일러가 알아서 기본생성자를 추가 해 주었던 것이다.
기본 생성자 ↓
클래스이름() {} //기본 생성자
Point() {} //Point 클래스의 기본 생성자
무엇이 있는가? 그냥.. 아무것도없다. 그저 인스턴스화를 위해 실행될 뿐 아무런 딱히 특별한 기능이 없다.
다만 기본 생성자는 내가 다른 생성자를 하나라도 만들면 컴파일러가 자동으로 추가해주지 않기 때문에, 다른 생성자를 만든경우에 기본 생성자가 필요하다면 따로 만들어 주어야한다.
생성자도 메서드처럼 매개변수를 선언하고 호출 시 값을 넘겨받아 인스턴스 초기화 시 데이터를 인스턴스에 바로 저장할 수 있다. 아래의 코드처럼 생성자를 만들어 준다면 인스턴스 생성시 각각의 멤버변수에 초기화를 진행할 수도 있고 안할수도 있다.
class Car {
String color;
String gearType;
int wheel;
Car() {} //기본 생성자 인스턴스 생성시 위 3가지 멤버변수를 초기화 하지 않음.
Car(String c, String g, int w) { //args constructor, 생성과 동시에 멤버변수를 초기화 함.
color = c;
gearType = g;
wheel = w;
}
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 생성자 간에도 서로 호출이 가능하다. 단 아래의 두가지 조건을 충족시켜야 한다.
- 생성자의 이름으로 클래스이름 대신 this를 사용한다.
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
아래코드는 에러상황의 예제이다.
Car(String color) {
door = 5;
Car(color, "auto", 4);
// 첫 번째 줄에서 생성자를 호출하지도 않았고, this를 사용하지도 않았음.
}