2 minute read

0. 들어가기 전에

생성자는 new 연산자로 호출되는 중괄호{} 블록이다. 객체 생성시 초기화를 담당한다.
객체 초기화 : 필드를 초기화 하거나 메소드를 호출해서 객체를 사용할 준비를 하는것
생성자가 성공적으로 실행되면 힙영역에 객체가 생성되고 객체번지가 리턴된다. 그번지는 참조 변수에 담긴다.

1. 기본 생성자 (default constructor)

클래스 내부에 생성자 선언 생략할 경우 바이트 코드에 자동 추가

[public] 클래스(){}

와 같이 선언한다. 컴파일러는 컴파일 할때 java파일내에 생성자가 없다면 컴파일 단게에서 생성자를 자동 생성하준다.

2. 생성자 선언

클래스(매개변수, ...) {
	//객체 초기화 코드
}

매개 변수 선언은 생략 가능하며, 여러개 선언 또한 가능하다

public class Customer{
	Customer(String name, int age, String number){..}
}
// 위와 같이 매개변수가 있는 생성자만 있을경우에는 
// Customer customer = new Customer()와 같은 방법으로 선언은 불가능하다.
// 추가로 기본 생성자를 선언하면 가능

Customer cumtomer = new Customer("한승우, 30, "010-0000-0000");

클래스에 생성자가 명시적으로 선언되었을 경우 반드시 선언된 생성자 호출하여 객체생성

3. 필드 초기화

생성자는 객체를 생성하기 위한 역할을 수행하는데, 객체를 생성할때 객체가 가져야할 데이터를 초기화야할 경우들이 있다. 이때 생성자 내부에서 작성이 되어 어떤 특정한 값이 저장될수 있도록 선언하는것이 가능하다.

위의 예에서 name, age, number 등은 사람마다 보두 다른 값을 갖기 때문에 필드에 값을 선언하는 것은 조금 문제가 있다. 그럴때 객체를 생성할때 아래와 같이 생성자를 이용한다.

public clas Army{
	String name;
	int age;
	String number;
	String nation = "korea"; //이것도 사실 여러 국가가 있겠지만 여기선 한국인만 있다고 생각하자

	Army(String name, int age, String number){
		name = name;
		age = age;
		number = number;
	}
}

public class RepublicOfKoreaArmy {
	public void main(String [] args){
		Army a1 = new Army("호국",21,"010-1111-1111");
		Army a2 = new Army("호국2",22,"010-1111-1112");
		// 스택영역에는 a1,a2 와 객체 번지주소가
		// 힙영역에는 객체의 정보들이 저장된다.
	}
}

생성자의 매개변수가 필드의 초기화를 위해서 사용된다 하면, 매개변수 이름은 필드이름과 동일하거나 유사하게 만드는것이 권장된다.
필드와 매개변수 이름이 완전히 동일할 경우는 보통 this를 사용하여 표현한다.

Army(String name, int age, String number){
		this.name = name;
		this.age = age;
		this.number = number;
	}

4. 생성자 오버로딩

  • 매개 변수를 달리하는 생성자를 여러 개 선언 하는것을 생성자 오버로딩 이라 한다. (위에서 잠깐 설명했음)
  • 외부에서 제공되는 다양한 데이터 사용하여 객체 초기화 하려면 생성자 역시 다양해야 하기 때문
  • 매개 변수의 타입, 개수, 선언된 순서가 같은경우, 매개변수 이름만 바꾸는 것은 생성자 오버로딩이 아님
    public class clazz{
      clazz(매개변수1, 매개변수2, 매개변수3, ...){}
      clazz(매개변수1, 매개변수4){}
     
      // 매개변수 타입, 개수, 순서가 다르게 선언하여 여러개를 만들 수 있다.
    }
    

5. 다른 생성자 호출 : this()

생성자의 초기화 내용이 비슷하다고 하면 오버로딩된 생성자 내용의 중복은 문제가 된다.
이걸 해결하는 것이 this()라 할 수 있다. this() 는 아래와 같이 사용된다.

  • 생성자에게 다른 생성자를 호출
  • 필드 초기화 내용은 한 생성자에만 집중 작성하고, 나머지 생성자는 초기화 내용 가진 생성자로 호출 생성자 오버로딩 증가 시 중복코드 문제를 해결
class(매개변수1, 매개변수2, ...){
	this(매개값1, 매개값2,); // 초기화 코드들을 다른 생성자에서 수행함
	실행문;
}

Categories:

Updated: