본문 바로가기

TIL

<자바 Java> 생성자

- 생성자란?

객체는 클래스를 필요로 한다. 어떠한 사물이 만들어지기 전에 설계도가 먼저 존재하고, 이 설계도를 바탕으로 사물이 만들어지듯, 객체도 설계도의 역할을 하는 클래스가 필요한 것이다. 그리고 클래스에는 객체의 성격과 기능을 정의하는 필드와 메서드가 존재한다. 여기서 필드는 보통 변수로 칭해지곤 하는데, 변수와 필드는 엄연히 다른 것이므로 이 둘을 구별해야 한다(같은 뜻의 명칭으로 사용하면 개념의 혼동이 올 수 있다).

 

그리고 필드와 메서드에 더해 추가로 또 주어지는 것이 바로 생성자인데, 생성자는 객체를 만들 때 꼭 필요한 것이다. 이름도 그 역할 그대로 그래서 '생성'자, 라고 이해하면 더 쉬울 것 같다. 객체를 만들 때에는 객체의 초기화가 꼭 필요한데, 여기서 초기화란 객체의 속성이나 상태에 대한 데이터를 가지고 있는 필드를 초기화하거나, 객체의 기능을 나타내는 메소드를 호출해서 객체를 사용할 준비를 하는 것을 뜻한다. 그래서 이 역할을 하는 것이 바로 생성자이다.

 

생성자는 이 초기화 과정을 'new' 연산자를 이용해 처리하며, 이 과정이 성공하면 객체는 힙(Heap) 영역에 저장되고 객체의 주소 값은 설정된 변수에 저장된다. 그리고 우리는 이 변수를 가지고 프로그램의 코드를 작성해나가는 것이다.

 

 

- 생성자의 종류

클래스가 갖는 생성자의 종류와 그 수는 여러가지가 될 수 있다. 그 중에서도 기본적으로 꼭 필요한 생성자를 기본 생성자라고 한다. 앞서 설명했듯 모든 클래스는 필드, 메서드와 함께 생성자를 포함하는데 특히 기본 생성자는 클래스에 1개씩은 꼭 필요한 것이다.

 

1) 기본 생성자

기본 생성자의 형식은 클래스의 접근 제한자, 그리고 클래스명과 동일하게 쓰인 형태다.

//클래스
public class Car {
	//생성자
    public Car() {}
}

다만, 클래스는 기본 생성자를 꼭 필요로하기 때문에, 만약 우리가 클래스에서 기본 생성자를 만들지 않는 경우에는 자동으로 생성이 된다. 따라서 생성자를 만들지 않고도 우리는 생성자를 호출하여 객체를 만들 수 있는 것이다. 아래 코드에서 Car()가 바로 기본 생성자를 호출한 것이다.

Car myCar = new Car();

 

2) 직접 만드는 생성자

객체를 다양하게 초기화하기 위해, 즉 원하는 형태의 생성자를 만들어둠으로써 좀 더 간소화된 코드 및 편리한 코드 작성이 가능하기 때문에 생성자를 직접 선언하는 경우가 있다. 생성자 블록 내부에 필드의 초기값을 설정하거나, 메소드를 호출, 또는 선언부에 매개 변수를 선언하는 것이 그것이다.

 

필드 초기화의 경우는 두 가지 방법이 있는데, 필드를 선언할 때에 초기값을 주거나, 위에서 언급했던 것처럼 생성자에서 초기값을 직접 주는 방법이다. 필드를 선언할 때 초기값을 주면 이후 생성되는 객체들은 모두 같은 데이터를 갖게 된다. 하지만 그것이 아니라 객체 생성 시 유연하게 데이터를 바꿔야 한다면 후자의 방법을 사용하면 된다. 예시는 다음과 같다.

public class Korean {
//필드
String name;

//생성자
public Korean(String n) {
name = n;
public class KoreanExample{
	public static void main(String[] args){
    	Korean k1 = new Korean("대한민국");
    }
}

 

다만 위에서 주의할 점은, 매개 변수는 관례적으로 필드와 동일한 이름으로 정해진다는 것이다. 하지만 그렇게 되면 생성자가 필드를 초기화 할 때에 혼돈이 생기므로, 이 경우는 필드 앞에 'this.'를 붙이는 것으로 해결한다. 'this.'는 객체 자신을 참조하는 것으로, 참조 변수(객체의 주소를 참조하는 변수, 객체 생성 시 설정하는 변수는 우리가 이름을 정하지만 여기서는 자기 자신을 가리킬 때 this를 사용한다)이다.

public Korean(String name) {
	this.name = name;
}

앞의 name이 필드이고, 뒤의 name이 매개변수이다.

 

그리고 객체를 다양하게 초기화하는 또 다른 방법으로 매개 변수를 선언하는 것은 생성자 호출 시 외부의 값을 매개변수를 통해 생성자의 블록 내부로 전달하는 것이다. 그리고 이렇게 기본 생성자가 아닌 다른 생성자가 만들어져 있을 경우, 이것이 해당 클래스의 기본 생성자가 되는 것이며(의미적으로), 생성자 호출 시에도 이 만들어진 생성자의 형태를 그대로 따라야 한다.

 

 

- 생성자 오버로딩(Overloading)

앞서 언급했듯 객체는 만들어지려면 생성자가 꼭 필요하다. 그런데 생성자가 하나뿐이라면, 외부에서 제공되는 다양한 데이터를 수용할 수 없다. 따라서 다양한 방법으로 객체를 생성할 수 있도록 한 것이 바로 생성자 오버로딩이다. 생성자 오버로딩의 규칙은 간단하다. 동일한 생성자를 여러개 만들 수 있는데, 이 중 매개변수의 타입와 개수, 그리고 순서만 서로 다르게 선언하면 된다.

 

그런데 이 경우 생성자 오버로딩은 많아지는데 중복된 코드도 함께 많아질 수 있다. 이것을 해결하는 방법으로는 생성자에서 다른 생성자를 호출할 때 사용할 수 있는 this() 코드를 쓰면 된다.

 

 

 

 

 

 

참고 : 도서 <이것이 자바다>