생성자(Constructor)는 new 연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다. 객체 초기화란 필드를 초기화하거나, 메소드를 호출해서 객체를 사용할 준비를 하는 것을 말한다. 생성자를 실행시키지 않고는 클래스로부터 객체를 만들 수 없다 new 연산자에 의해 생성자가 성공적으로 실행되면 힙(heap) 영역에 객체가 생성되고 객체의 주소가 리턴된다. 리턴된 객체의 주소는 클래스 타입 변수에 저장되어 객체에 접근할 때 이용된다.
모든 클래스는 생성자가 반드시 존재하며, 하나 이상을 가질 수 있다.
클래스 내부에 생성자 선언을 생략했다면 컴파일러는 중괄호 { } 블록 내용이 비어있는 기본 생성자를 바이트 코드에 자동 추가한다.
[public] 클래스() {
}
클래스가 public class로 선언되면 기본 생성자에서도 public이 붙지만, 클래스가 public 없이 class로만 선언되면 기본 생성자에도 public이 붙지 않는다.
그렇기 때문에 클래스에 생성자를 선언하지 않아도 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성시킬 수 있다.
Car myCar=new Car();
기본 생성자 대신 생성자를 명시적으로 선언하려면 다음과 같은 형태로 작성한다.
클래스(매개변수, ...){
//객체의 초기화 코드
}
생성자는 메소드와 비슷한 모양을 가지고 있지만, 리턴 타입이 없고 클래스 이름과 동일하다.
생성자 블록 내부에는 객체 초기화 코드가 작성되는데, 일반적으로 필드에 초기값을 저장하거나 메소드를 호출하여 객체 사용 전에 필요한 준비를 한다.
매개 변수 선언은 생략할 수도 있고, 여러 개를 선언할 수도 있다. 매개 변수는 new 연산자로 생성자를 호출할 때 외부의 값을 생성자 블록 내부로 전달하는 역할을 한다.
예를 들어 Car 생성자를 호출할 때 세 개의 값을 제공한다고 했을 때
Car myCar=new Car("K7", "검정", "200");
두 개의 매개값은 String 타입이고 마지막 매개값은 int 타입이다. 세 매개값을 생성자가 받기 위해서는 다음과 같이 생성자를 선언해야 한다.
public class Car{
//생성자
Car(String model, String color, int maxSpeed){
...
}
}
클래스에 생성자가 명시적으로 선언되어 있을 경우에는 반드시 선언된 생성자를 호출해서 객체를 생성해야만 한다.
생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것
을 말한다.
public class Car{
Car() {...}
Car(String model){...}
Car(String model, String color){...}
Car(String model, String color, int maxSpeed){...}
}
생성자 오버로딩 시 주의할 점은 매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아니다.
Car(String model, String color){...}
Car(String model, String model){...} //오버로딩이 아님
생성자가 오버로딩되어 있을 경우, new 연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 의해 호출될 생성자가 결정된다.
Car car1=new Car();
Car car2=new Car("K7");
Car car3=new Car("k7", "검정색");
Car car4=new Car("K7", "검정색", 200);