생성자
: 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'🍟 생성자의 조건
1. 생성자의 이름은 클래스의 이름과 같아야 함
2. 생성자는 리턴값이 없음
<생성자도 메서드이기 때문에 리턴값이 없다는 의미의 void를 붙여야 하지만, 모든 생성자가 리턴값이 없으므로 void 생략 가능함>
🍔 생성자의 정의 - 생성자도 오버로딩 가능하므로 하나의 클래스에 여러개의 생성자 존재 가능
클래스이름(타입 변수명, 타입 변수명, . . .) {
//인스턴스 생성시 수행될 코드,
//주로 인스턴스 변수의 초기화 코드를 적음
}
ex)
class Point {
point() { //매개변수가 없는 생성자
...
}
point(int x, int y) { //매개변수가 있는 생성자
...
}
...
}
모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 함
생성자를 정의하지 않고도 인스턴스를 생성할 수 있었던 이유는 컴파일러가 제공하는 기본 생성자(default constructor)
덕분임
컴파일 할 때, 소스파일(*.java)의 클래스에 생성자가 하나도 정의되지 않은 경우 컴파일러는 자동적으로 아래와 같은 내용의 기본 생성자를 추가하여 컴파일 함
클래스이름() {} //기본 생성자
Point() {} //Point클래스의 기본 생성자
컴파일러가 자동적으로 추가해주는 기본 생성자는 이와 같이 매개변수도 없고 아무런 내용도 없는 간단한 것
인스턴스 초기화 작업이 요구되어지지 않는다면 생성자를 정의하지 않고 컴파일러가 제공하는 기본 생성자를 사용하는 것도 좋음
클래스의 '접근 제어자(Access Modifier)'가 public인 경우에는 기본 생성자로 'public 클래스이름( ) { }'이 추가됨
🍇 컴파일러가 자동적으로 기본 생성자를 추가해주는 경우는 '클래스 내에 생성자가 하나도 없을 때 뿐
<에러>
Data_1 d1 = new Data_1();
Data_2 d2 = new Data_2();
<정상>
Data_1 d1 = new Data_1();
Data_1 d2 = new Data_2(10);
예제에서 컴파일 에러가 발생하지 않도록 하기 위해서
Data_2 클래스의 인스턴스를 생성할 때 생성자 Data_2(int x)를 사용하던가
Data_2클래스에 생성자 Data_2()를 추가로 정의 필요
자동차를 클래스로 정의한 것인데,
단순히 color, gearType, door 세 개의 인스턴스 변수와 두 개의 생성자만을 가지고 있음
class Car {
String color; //색상
String gearType; //변속기종류-auto,manual
int door; //문의 개수
Car() {} //기본 생성자
Car(String c, String g, int d) { //생성자
color = c;
gearType = g;
door = d;
}
}
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
▼
Car c = new Car("white","auto",4);
🍎 인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야함
1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?
2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?
- 생성자를 잘 활용하면 보다 간결하고 직관적인, 객체지향적인 코드를 작성할 수 있음