Java Category/Java

[JAVA] 생성자(Constructor)

ReBugs 2023. 1. 1.

혼자 공부하는 자바 (저자 : 신용권)의 내용을 개인적으로 정리하는 글임을 알립니다.


생성자

  • 생성자는 new 연산자로 클래스로부터 객체를 생성할 때 호출되어 주로 객체의 초기화를 담당한다.
  • 생성자를 실행하지 않고는 클래스로부터 객체를 만들 수 없다.
  • 모든 클래스는 생성자가 반드시 존재하며, 생성자를 하나 이상 가질 수 있다.
  • new 연산자에 의해 생성자가 실행되면 힙 영역에 객체가 생성되고 객체의 주소가 리턴된다.
  • 리턴된 객체의 주소는 클래스 변수에 저장된다.

 

기본 생성자(Default Constructor)

클래스 내부에 생성자 선언을 생략했다면 컴파일러는 기본 생성자를 바이트 코드에 자동 추가한다.

클래스가 public class로 선언되면 기본 생성자에서도 public이 붙지만 클래스가 public 없이 class로만 선언되면 기본 생성자에도 public이 붙지 않는다.

그렇기 때문에 클래스에 생성자를 선언하지 않아도 new 연산자 뒤에 기본 생성자를 호출해서 객체를 생성할 수 있다.

 

생성자 오버로딩(Constructor Overloading)

외부에서 제공되는 다양한 데이터들을 이용해서 객체를 초기화하려면 생성자도 다양화 될 필요가 있다.

자바는 다양한 방법으로 객체를 생성할 수 있도록 생성자 오버로딩을 제공한다.

생성자 오버로딩이란 매개 변수를 달리하는 생성자를 여러 개 선언하는 것을 말한다.

 

Car.java

package TestPakage;
public class Car {
	String company = "abc 자동차 회사";
	String model;
	String color;
	int maxSpeed;
	//생성자
	Car() {
	}
	//생성자 오버로딩
	Car(String model) {
		this.model = model;
	}
	Car(String model, String color) {
		this.model = model;
		this.color = color;
	}
	Car(String model, String color, int maxSpeed) {
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}

 

Test.java

package TestPakage;
public class Test {
	public static void main(String[] args) {	
		Car car1 = new Car();
		System.out.println("car1.company : " + car1.company);
		System.out.println();
		
		Car car2 = new Car("A");
		System.out.println("car2.company : " + car2.company);
		System.out.println("car2.model : " + car2.model);
		System.out.println();
		
		Car car3 = new Car("A", "RED");
		System.out.println("car3.company : " + car3.company);
		System.out.println("car3.model : " + car3.model);
		System.out.println("car3.color : " + car3.color);
		System.out.println();
		
		Car car4 = new Car("B", "BLACK", 200);
		System.out.println("car4.company : " + car4.company);
		System.out.println("car4.model : " + car4.model);
		System.out.println("car4.color : " + car4.color);
		System.out.println("car4.maxSpeed : " + car4.maxSpeed);
	}
}
/*
car1.company : abc 자동차 회사

car2.company : abc 자동차 회사
car2.model : A

car3.company : abc 자동차 회사
car3.model : A
car3.color : RED

car4.company : abc 자동차 회사
car4.model : B
car4.color : BLACK
car4.maxSpeed : 200
*/
this.
Car 클래스의 필드 이름과 생성자에 들어가는 매개 변수의 이름이 같다.
이러면 모호성이 생긴다.
해결 방법은 this를 이용하는 것이다.
필드 앞에 'this.'을 붙이면 매개 변수를 뜻하는 것이 아니라, 객체의 필드를 뜻하게 된다.
매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우, 매개 변수 이름만 바꾸는 것은 생성자 오버로딩이 아니다.

 

다른 생성자 호출

위에 예제 코드에서도 중복된 코드를 볼 수 있는데, 생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드가 발생할 수 있다.

이 경우에는 필드 초기화 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선할 수 있다.

생성자에서 다른 생성자를 호출 할 때에는 this()를 사용한다.

this()는 자신의 다른 생성자를 호출하는 코드로 반드시 생성자의 첫 줄에서만 허용됨

Car.java

package TestPakage;
public class Car {
	String company = "abc 자동차 회사";
	String model;
	String color;
	int maxSpeed;
	//생성자
	Car() {
	}
	//생성자 오버로딩
	Car(String model) {
		this(model, null, 0);
	}
	
	Car(String model, String color) {
		this(model, color, 0);
	}
	
	Car(String model, String color, int maxSpeed) {
		this.model = model;
		this.color = color;
		this.maxSpeed = maxSpeed;
	}
}

 

Test.java

package TestPakage;
public class Test {
	public static void main(String[] args) {	
		Car car1 = new Car();
		System.out.println("car1.company : " + car1.company);
		System.out.println("car1.model : " + car1.model);
		System.out.println("car1.color : " + car1.color);
		System.out.println("car1.maxSpeed : " + car1.maxSpeed);
		System.out.println();
		
		Car car2 = new Car("A");
		System.out.println("car2.company : " + car2.company);
		System.out.println("car2.model : " + car2.model);
		System.out.println("car2.color : " + car2.color);
		System.out.println("car2.maxSpeed : " + car2.maxSpeed);
		System.out.println();
		
		Car car3 = new Car("A", "RED");
		System.out.println("car3.company : " + car3.company);
		System.out.println("car3.model : " + car3.model);
		System.out.println("car3.color : " + car3.color);
		System.out.println("car3.maxSpeed : " + car3.maxSpeed);
		System.out.println();
		
		Car car4 = new Car("B", "BLACK", 200);
		System.out.println("car4.company : " + car4.company);
		System.out.println("car4.model : " + car4.model);
		System.out.println("car4.color : " + car4.color);
		System.out.println("car4.maxSpeed : " + car4.maxSpeed);
	}
}
/*
car1.company : abc 자동차 회사
car1.model : null
car1.color : null
car1.maxSpeed : 0

car2.company : abc 자동차 회사
car2.model : A
car2.color : null
car2.maxSpeed : 0

car3.company : abc 자동차 회사
car3.model : A
car3.color : RED
car3.maxSpeed : 0

car4.company : abc 자동차 회사
car4.model : B
car4.color : BLACK
car4.maxSpeed : 200
*/

위의 예제를 보면 Car 클래스의 중복 코드가 줄어든 것을 볼 수 있다.

'Java Category > Java' 카테고리의 다른 글

[JAVA] 인스턴스 멤버와 정적 멤버  (0) 2023.01.03
[JAVA] 메소드(Method)  (0) 2023.01.02
[JAVA] 필드(Field)  (0) 2022.12.31
[JAVA] 클래스(Class)  (0) 2022.12.30
[JAVA] 객체 지향 프로그래밍(OOP)  (0) 2022.12.29

댓글