●생성자
생성자는 인터스턴스가 생성될 때 호출되는 '인스턴스 초기화 메서드'이다. 생성자 역시 메서드처럼 클래스 내에 선언된다. 구조가 메서드와 유사하지만 리턴값이 없다는 점이 다르다. 생성자의 조건은 다음과 같다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다.
생성자도 오버로딩이 가능하므로 하나의 클래스에 여러개의 생성자가 존재 가능하다. 클래스에 생성자를 구현하면 다음과 같다.
class Point {
Point() { //매개변수가 없는 생성자
...
}
Point(int x, int y) { //매개변수가 있는 생성자
...
}
...
}
생성자는 인스턴스를 생성하지 않는다. 단지 인스턴스 변수들의 초기화에 사용되는 조금 특별한 메서드일 뿐이다. 참고로 인스턴스를 생성하는 것은 연산자 new이다.
●기본 생성자
모든 클래스에는 반드시 하나 이상의 생성자가 정의되어 있어야 한다. 그런데 코드를 짜다보면 생성자를 생성하지 않아도 호출시 오류가 없는 경우가 있다. 그 이유는 생성자를 만들면 자바 컴파일러가 자동으로 생성자를 만들기 때문이다. 이를 '기본 생성자(default constructor)'라 한다.
클래스이름() {} //기본 생성자
Point() {} //Point클래스의 기본 생성자
기본 생성자에 대해 주의해야 할 점이 있다. 기본 생성자가 컴파일러에 의해 추가 되는 경우는 '클래스에 정의된 생성자가 하나도 없을 때'뿐이다.
class Data_1 {
int value;
}
class Data_2 {
int value;
Data_2(int x) { // 매개변수가 있는 생성자
value = x;
}
class Ex6_11 {
public static void main(String[] args) {
Data_1 d1 = new Data_1();
Data_2 d2 = new Data_2(); //compile error발생
위와 같은 자바코드를 만들면 Data_2를 객체생성할 때 오류가 발생한다. 그런데 같이 객체를 생성한 Data_1은 오류가 발생하지 않는다 왜일까? 그건 Data_1은 클래스에 정의된 생성자가 하나도 없는 반면, Data_2에는 정의된 생성자가 있기때문이다. 우리는 위의 코드를 통해 기본 생성자가 추가될 생성 될 때는 클래스에 정의된 생성자가 하나도 없어야 한다는 걸 알 수 있다.
●매개변수가 있는 생성자
생성자도 메서드처럼 매개변수를 선언하여 호출 시 값을 넘겨받아서 인스턴스의 초기화 작업에 사용할 수 있다. 생정자에 매개변수를 사용하면 코드가 간결해지고 직관적으로 만든다.
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인스턴스를 생성할 때, 생성자 Car()를 사용한다면, 인스턴스를 생성한 다음에 인스턴스 변수들을 따로 초기화해주어야 하지만, 매개변수가 있는 생성자 Car(String color, String gearType, int door)를 사용한다면 인스턴스를 생성하는 동시에 원하는 값으로 초기화 할 수 있다.
Car c = new Car();
c.color = "white";
c.gearType = "auto";
c.door = 4;
↓
Car c = new Car("white","auto",4);
위, 아래의 코드는 모두 똑같다. 그런데 앞서 설명한 바와 같이 매개변수가 있는 생성자가 좀더 간결하고 직관적이다. 그래서 인스턴스를 생성 후에 별도로 초기화 하지 않는 매개변수가 있는 생성자를 쓰는 게 바람직하다.
출처: 자바의 정석 기초편(저자: 남궁성, 출판사: 도우출판)
'java > 객체지향' 카테고리의 다른 글
[객체지향] 변수, 멤버변수의 초기화 (0) | 2021.07.12 |
---|---|
[객체지향] this()와 this (0) | 2021.07.12 |
[객체지향] 오버로딩(overloading) (0) | 2021.07.09 |
[객체지향] 메서드 간의 호출과 참조 (0) | 2021.07.09 |
[객체지향] static 메서드와 인스턴스 메서드 (0) | 2021.07.09 |