생성자(constructor)
생성자는 new 연산자를 통해서 인스턴스를 생성할 때 반드시 호출이 되고 제일 먼저 실행되는 일종의 메소드(하지만 메소드와는 다르다)이다. 생성자는 인스턴스 변수(필드 값 등)를 초기화 시키는 역할을 한다.
인스턴스 변수의 초기화
클래스를 가지고 객체를 생성하면, 해당 객체는 메모리에 즉시 생성됩니다.
하지만 이렇게 생성된 객체는 모든 인스턴스 변수가 아직 초기화되지 않은 상태입니다.
자바에서 클래스 변수와 인스턴스 변수는 별도로 초기화하지 않으면, 다음 값으로 자동 초기화됩니다.
변수의 타입초깃값
char | '\u0000' |
byte, short, int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 또는 0.0D |
boolean | false |
배열, 인스턴스 등 | null |
하지만 사용자가 원하는 값으로 인스턴스 변수를 초기화하려면, 일반적인 초기화 방식으로는 초기화할 수 없습니다.
인스턴스 변수 중에는 private 변수도 있으며, 이러한 private 변수에는 사용자나 프로그램이 직접 접근할 수 없기 때문입니다.
따라서 private 인스턴스 변수에도 접근할 수 있는 초기화만을 위한 public 메소드가 필요해집니다.
이러한 초기화만을 위한 메소드는 객체가 생성된 후부터 사용되기 전까지 반드시 인스턴스 변수의 초기화를 위해 호출되어야 합니다.
자바에서는 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 초기화할 수 있는 생성자(constructor)라는 메소드를 제공합니다.
생성자의 특징
- 값을 반환하지 않는다.
- 반환 타입을 void형으로 선언하지 않는다.
- 생성자는 인스턴스를 생성해주는 역할을 하는 특수한 메소드라고 할 수 있다.
그런데 반환 값이 있다면 엉뚱한 객체가 생성될 것이다.
따라서 반환 값을 필요로하는 작업에서는 생성자를 사용하지 않는다.
반환 값이 없기 때문에 return도 사용하지 않고, 반환 값을 메소드 정의에 포함시키지도 않는다. - 생성자의 이름은 클래스의 이름과 동일하다.
- 자바에서 클래스의 이름과 동일한 메소드는 생성자로 사용하기로 약속되어 있다. - 생성자는 초기화를 위한 데이터를 인수로 전달받을 수 있다.
- 객체를 초기화하는 방법이 여러 개 존재할 경우에는 하나의 클래스가 여러 개의 생성자를 가질 수 있다.
- 즉, 생성자도 하나의 메소드이므로, 메소드 오버로딩이 가능하다. - 메소드이다. 단, 리턴타입자리가 없고 메소드이름이 클래스이름동일
- 주로 데이터 초기화작업을 담당한다
- 직접 호출 X 객체가 생성되는 시점에 딱 한번 호출된다.
- overloading 가능하다.
- 모든 객체는 반드시 한개이상의 생성자를 갖는다.
- 생성자를 작성하지 않으면 자동으로 default constructor가 삽입된다.
- 최초의 딱 한번만 호출되므로 재사용안됨.
생성자 선언 방법
문법
1. 클래스이름() { ... } // 매개변수가 없는 생성자 선언
2. 클래스이름(인수1, 인수2, ...) { ... } // 매개변수가 있는 생성자 선언
public 클래스(매개변수){
~
}
Car 클래스를 선언하면서 여러 개의 생성자를 선언하는 예제
Car(String modelName) {}
Car(String modelName, int modelYear) {}
Car(String modelName, int modelYear, String color) {}
Car(String modelName, int modelYear, String color, int maxSpeeds) {}
생성자의 호출
자바에서는 new 키워드를 사용하여 객체를 생성할 때 자동으로 생성자가 호출됩니다.
class Car {
private String modelName;
private int modelYear;
private String color;
private int maxSpeed;
private int currentSpeed;
Car(String modelName, int modelYear, String color, int maxSpeed) {
this.modelName = modelName;
this.modelYear = modelYear;
this.color = color;
this.maxSpeed = maxSpeed;
this.currentSpeed = 0;
}
public String getModel() {
return this.modelYear + "년식 " + this.modelName + " " + this.color;
}
}
public class Method02 {
public static void main(String[] args) {
Car myCar = new Car("아반떼", 2016, "흰색", 200); // 생성자의 호출
System.out.println(myCar.getModel()); // 생성자에 의해 초기화되었는지를 확인함.
}
}
기본 생성자(default constructor)
자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 합니다.
하지만 특별히 생성자를 정의하지 않고도 인스턴스를 생성할 수 있습니다.
이것은 자바 컴파일러가 기본 생성자(default constructor)라는 것을 기본적으로 제공해 주기 때문입니다.
기본 생성자는 매개변수를 하나도 가지지 않으며, 아무런 명령어도 포함하고 있지 않습니다.
자바 컴파일러는 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않으면, 자동으로 다음과 같은 기본 생성자를 추가합니다.
문법
클래스이름() {}
다음 예제는 Car 클래스에 생성자를 정의하지 않고, 기본 생성자를 호출하는 예제입니다.
class Car {
private String modelName = "소나타";
private int modelYear = 2016;
private String color = "파란색";
public String getModel() {
return this.modelYear + "년식 " + this.color + " " + this.modelName;
}
}
public class Method03 {
public static void main(String[] args) {
Car myCar = new Car(); // 기본 생성자의 호출
System.out.println(myCar.getModel()); // 2016년식 파란색 소나타
}
}
//2016년식 파란색 소나타
위의 예제에서 Car 클래스의 인스턴스인 myCar는 기본 생성자를 사용하여 생성됩니다.
하지만 기본 생성자는 아무런 동작도 하지 않으므로, 인스턴스 변수를 클래스 필드에서 바로 초기화하고 있습니다.
이처럼 인스턴스 변수의 초기화는 생성자를 사용하여 수행할 수도 있지만, 클래스 필드에서 바로 수행할 수도 있습니다.
하지만 만약 매개변수를 가지는 생성자를 하나라도 정의했다면, 기본 생성자는 자동으로 추가되지 않습니다.
따라서 매개변수를 가지는 생성자를 하나 이상 정의한 후 기본 생성자를 호출하면, 오류가 발생할 것입니다
참고 :
'개발 > Java' 카테고리의 다른 글
[Java] BeanUtils (0) | 2019.04.08 |
---|---|
Java - Method (메소드) 개념 (0) | 2018.12.27 |
[Java] Instance란 (0) | 2018.12.27 |
[Java] WapperClass (0) | 2018.12.27 |
[Java] @Override (0) | 2018.12.27 |