[자바/Java] 생성자 란?

resilient

·

2021. 8. 2. 16:55

728x90
반응형

 

자바 프로그래밍을 할 때, 생성자에 대해 모르고 그냥 사용하는 경우가 많다.

하지만 깊이 있는 프로그래밍을 위해서는 생성자의 개념이 중요하다고 생각해서 정리하게 되었다.

 

먼저, 생성자란?

생성자는 간단하게 얘기하면 인스턴스가 생성될 때 호출되는 '인스턴스 초기화 메소드'이다.

따라서 인스턴스 변수의 초기화 작업에 사용되고, 인스턴스 생성 시에 실행되어야 할 작업을 위해서 사용된다.

 

  • 생성자의 이름은 클래스의 이름과 같아야 한다.
  • 생성자는 리턴 값이 없다. 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()의 첫 번째 줄에서 호출하였다.

 

같은 클래스 내의 생성자들은 일반적으로 서로 관계가 깊은 경우가 많아서 이렇게 연결하고 호출하는 방식으로 구현하면 더 효율적이고, 유지보수도 쉬워진다.

 

 

 

 

 

본 게시물은 '자바의 정석'을 바탕으로 공부한 내용을 정리한 것입니다.

오류가 있거나 궁금하신 점은 댓글로 말씀해주시면 감사하겠습니다.

 

반응형