[자바/Java] 생성자 란?
resilient
·2021. 8. 2. 16:55
자바 프로그래밍을 할 때, 생성자에 대해 모르고 그냥 사용하는 경우가 많다.
하지만 깊이 있는 프로그래밍을 위해서는 생성자의 개념이 중요하다고 생각해서 정리하게 되었다.
먼저, 생성자란?
생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.
따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.
- 생성자의 이름은 클래스의 이름과 같아야 한다.
- 생성자는 리턴 값이 없다. void 또한 사용하지 않는다.
- 생성자는 몇 가지 특징을 제외하면 메소드와 다르지 않다.
- 생성자는 메소드 처럼 클래스 내에 선언되고, 오버 로딩이 가능하므로 하나의 클래스에 여러 개의 생성자가 존재할 수 있다.
기본 생성자(Default constructor) 란?
우리가 생성자를 모르고도 자바 프로그래밍이 가능했던 이유는 아마 이 기본 생성자 덕분이 아니었나 싶다.
컴파일을 할 때, 소스파일의 클래스에 생성자가 하나도 정의되어있지 않으면 컴파일러가 자동으로 기본 생성자를 생성해서 컴파일해준다. 예를 들어보자.
class Data1 {
int value;
}
class Data2 {
int value;
Data2(int x) { // 매개변수가 있는 생성자.
value = x;
}
}
class ConstructorTest {
public static void main(String[] args) {
Data1 d1 = new Data1();
Data2 d2 = new Data2(); //에러가 발생한다.
}
}
위에 코드를 실행해보면 Data2 d2 = new Data2() 부분에서 에러가 발생하는데 이유는 Data2()는 기본 생성자가 아닌 매개변수가 있는 생성자이기 때문이다. 다음으로는 매개변수가 있는 생성자를 알아보자.
매개변수가 있는 생성자
위에 에러가 발생헀던 Data2()처럼,인스턴스를 생성할 때 매개변수가 있는 생성자를 사용한다면 인스턴스를 생성함과 동시에 원하는 값으로 초기화를 할 수 있어 보다 간결하고 직관적이다.
아래 예제를 보자.
class Car {
String color;
String gearType;
int door;
Car() {}
Car(String c, String g, int d) { // 매개변수가 있는 생성자
color = c;
gearType = g;
door = d;
}
}
class CarTest {
public static void main(String[] args) {
Car c1 = new Car();
c1.color = "white";
c1.gearType = "auto";
c1.door = 4;
Car c2 = new Car("white", "auto", 4);
System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
}
}
Car 클래스에서 기본 생성자를 포함해서 매개변수가 있는 생성자도 만들어주었다.
main 클래스 CarTest를 보면 Car c2 = new Car("white", "auto", 4); 이 부분이 매개변수가 있는 생성자를 이용한 인스턴스 생성이다.
Car c1은 기본 생성자에서 값을 초기화해주는 과정이 있어서 간결하지 못하고 직관적이지 못하다.
this()와 this란?
생성자 간에 서로 호출이 가능한데, 아래의 조건을 따라야 한다.
- 생성자의 이름으로 클래스 이름 대신 this를 사용해야 하고
- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.
아래 예제를 보자.
class Car {
String color;
String gearType;
int door;
Car() {
this("white", "auto", 4);
}
Car(String color) {
this(color, "auto", 4);
}
Car(String color, String gearType, int door) {
this.color = color;
this.gearType = gearType;
this.door = door;
}
}
class CarTest2 {
public static void main(String[] args) {
Car c1 = new Car();
Car c2 = new Car("blue");
System.out.println("c1의 color=" + c1.color + ", gearType=" + c1.gearType+ ", door="+c1.door);
System.out.println("c2의 color=" + c2.color + ", gearType=" + c2.gearType+ ", door="+c2.door);
}
}
생성자 Car()에서 또 다른 생성자 Car(String color, String gearType, int door)을 호출했다.
이렇게 생성자 간의 호출에서는 생성자 이름 대신 this를 사용해야 한다.
그리고 Car()의 첫 번째 줄에서 호출하였다.
같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이렇게 연결하고 호출하는 방식으로 구현하면 더 효율적이고, 유지보수도 쉬워진다.
본 게시물은 '자바의 정석'을 바탕으로 공부한 내용을 정리한 것입니다.
오류가 있거나 궁금하신 점은 댓글로 말씀해주시면 감사하겠습니다.
'Language > Java & Kotlin' 카테고리의 다른 글
[자바/Java] 인터페이스(Interface) 란? (0) | 2021.08.09 |
---|---|
[자바/Java] 오버로딩(Overloading) 이란? (0) | 2021.08.03 |
[자바/Java] 람다식이란? (0) | 2021.03.06 |
[자바/Java] 제네릭이란? (0) | 2021.02.27 |
[자바/Java] I/O(Input/Output)이란? (0) | 2021.02.22 |