자바의 모든 클래스에는 하나 이상의 생성자가 정의되어 있어야 한다. 하지만 특별히 생성자를 정의하지 않고도 인스턴스를 생성할 수 있는데, 자바 컴파일러가 기본 생성자를 기본적으로 제공해 주기 때문이다. 기본 생성자는 매개변수를 하나도 가지지 않고, 아무런 명령어도 포함되어 있지 않다. 자바 컴파일러는 컴파일 시 클래스에 생성자가 하나도 정의되어 있지 않으면 자동으로 다음과 같은 생성자를 추가한다.
기본적인 문법은 클래스명(){} 이며 예시는 아래와 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
class Car{
private String modelName = "소나타";
private int modelYear = 2016;
private String color = "파란색";
public String getModel(){
return this.modelYear + "년식 " + this.color + " " + this.modelName;
}
}
public class Main{
public static void main(String[] args) {
Car myCar = new Car(); // 기본 생성자 호출
System.out.println(myCar.getModel()); // 2016식 파란색 소나타
}
}
|
cs |
위의 예시에서 Car 클래스의 인스턴스인 myCar는 기본 생성자를 사용해 생성된다. 하지만 기본 생성자는 아무런 동작도 하지 않으므로, 인스턴스 변수를 클래스 필드에서 바로 초기화 하고 있다. 이처럼 인스턴스 변수의 초기화는 생성자를 사용해 수행할 수도 있지만 클래스 필드에서 바로 수행할 수도 있다. 하지만 만약 매개변수를 가지는 생성자를 하나라도 정의했다면, 기본 생성자는 자동으로 추가되지 않는점을 유의 해야 한다.
따라서 매개변수를 가지는 생성자를 하나 이상 정의한 후 기본 생성자를 호출하면, 오류가 발생한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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 Main{
public static void main(String[] args) {
Car myCar = new Car(); // ② 기본 생성자 호출
// Car myCar = new Car("아반떼", 2016, "흰색", 200); // ③ 생성자의 호출
System.out.println(myCar.getModel()); // 생성자에 의해 초기화 되었는지 확인
}
}
|
cs |
위의 예시 코드에서 ①번(8행) 라인에서 4개의 매개변수를 갖는 생성자를 정의하고 있다. 따라서 자바 컴파일러는 Car 클래스에 별도의 기본 생성자를 추가하지 않을 것이다. 하지만 ②번(23행) 라인에서는 기본 생성자를 호출해 인스턴스를 생성하려고 하고 있다, 따라서 자바 컴파일러 오류를 발생시킬 것이며, ③번(24행) 라인과 같이 4개의 매개변수를 전달해야만 인스턴스가 생성이 될 것이다.
'프로그래밍 공부 > Java' 카테고리의 다른 글
Java - 다형성(Polymorphism) (0) | 2020.02.20 |
---|---|
Java - 상속(Inheritance) (0) | 2020.02.20 |
Java - 클래스(Class)와 객체(Object) (0) | 2020.02.14 |
Java - 클래스(Class)와 객체(Object) 예제 (0) | 2020.02.05 |
Java - 배열 (0) | 2020.02.03 |