생성자는 new
연산자와 같이 사용되어 클래스로부터 객체를 생성할 때 호출되어 객체의 초기화를 담당한다.
객체 초기화란 필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비를 하는 것 입니다. 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없습니다.
모든 클래스는 하나 이상의 생성자가 존재합니다. 클래스 내부에 생성자 선언을 하지 않았다면 컴파일러는 기본 생성자를 바이트 코드에 자동으로 추가합니다.
public class Car{
// public Car(){} 자동추가
}
위 코드에서 Car클래스에 생성자를 생략했지만 주석처리된 부분처럼 기본 생성자가 자동으로 생성됩니다. 그렇기 때문에 클래스에 생성자를 선언하지 않아도 아래 코드처럼 new
연산자 뒤에 기본생성자를 호출해서 객체를 만들 수 있습니다.
Car myCar = new Car();
❗️ 클래스에 명시적으로 선언한 생성자가 한개라도 있으면 컴파일러는 기본생성자를 만들어주지 않습니다.
생성자를 명시적으로 선언하려면 다음과 같은 형태로 선언한다.
클래스( 매게변수선언, 매게변수선언, ...){
//객체의 초기화 코드.
}
생성자는 메소드와 비슷하지만 리턴타입이 없고 클래스 이름과 동일하다. 생성자블록 내부에는 객체의 초기화 코드가 작성됩니다. 필드 초기값을 저장하거나 메소드를 호출하여 객체 사용전에 필요한 준비를 합니다
public class Car{
//생성자
Car(String color, int cc){
}
}
public class CarExample{
Car myCar = new car("검정", 3000);
//Car myCar = new Car(); <--기본생성자호출x
}
위 예시에서 Car클래스에 생성자 선언을 했으므로 기본생성자로 객체를 호출해서 객체를 생성할 수 없고 Car(String color, int cc)
를 호출해서 객체를 생성해줘야 합니다.
클래스로부터 객체가 생성되면 필드는 기본 초기값으로 자동 설정됩니다.
다른 값으로 초기화를 하고 싶다면 두 가지 방법이 있습니다.
1 . 필드를 선언할 때 초기값을 주는 방법.
public class Korean{
String nation = "대한민국";
String name;
String ssn;
}
Korean k1 = new Korean();
Korean k2 = new Korean();
위 예제에서 Korean
클래스에 nation
필드를 선언 해주면서 "대한민국"
으로 초기값을 잡아줬습니다. Korean클래스
로부터 k1
, k2
객체를 생성하면 두객체의 nation
필드에는 모두 "대한민국"
이 저장되어 있습니다.2 . 생성자에서 초기값을 주는 방법
Korean
예제에서 name(이름)
, ssn(주민번호)
필드값은 클래스를 작성할 때 초기값을 줄수 없고 객체 생성 시점에 따라 다양한 값을 가질수 있다.public class Korean{
//필드
String nation = "대한민국";
String name;
String ssn;
//생성자
public class Korean{
name = n;
ssn = s;
}
}
Kor k1 new =Korean("김감자", "011225-1234567");
Kor k2 new =Korean("박감자", "011225-1234567");
위 코드에서 name
은 매개변수 n
으로 ssn
은 매개변수 s
로 전달 됩니다.name
, ssn
필드의 초기값으로 사용할 수 있습니다.this
를 붙혀주면 됩니다.public static Korean(String name, String ssn){
//필드 //매개변수
this.name = name;
this.ssn = ssn;
}
자바에서는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공합니다.
생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 의미합니다.
//예시
Car() {...}
Car(String model) {...}
Car(String model, String color) {...}
Car(String model, String color, int maxSpeed) {...}
주의할 점은 매개변수의 타입,개수,선언된 순서가 같을 경우 매개변수 이름만 바꾸는것은 안된다.
Car(String model, String color) {...}
Car(String color, String model) {...}//오버로딩이아니다.
생성자가 오버로딩되어 있으면 new
연산자로 생성자를 호출할 때 제공되는 매개값의 타입과 수에 의해 호출되는 생성자가 결정된다.
Car car1 = new Car(); //car()기본생성자호출.
Car car2 = new Car("그랜저"); //Car(String model)호출
Car car2 = new Car("그랜저, "흰색"); //Car(String model, String color)호출
Car car2 = new Car("그랜저, "흰색", 300);//Car(String model, String color, int maxSpeed)호출
생성자간의 오버로딩이 많아질수록 중복된 코드가 발생할 수 있습니다.
매개 변수의 수만 달리하고 필드 초기화 내용이 비슷한 생성자에서 이런 현상을 많이 볼 수 있습니다. 이 경우에는 필드 초기화 내용은 한 생성자에만 집중하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선이 가능하다.
다른 생성자를 호출할 때에는 this()
코드를 사용합니다.
this()
는 자신의 다른 생성자를 호출하는 코드로 생성자의 첫 줄에서만 허용됩니다.this()
의 매개값은 호출되는 생성자의 매개 변수에 맞게 제공해야 합니다.this()
다음에는 추가적인 실행문들이 올 수 있다. 실행이 끝나면 원래 생성자로 돌아와서 다음 실행문을 실행합니다.