생성자란?
생성자는 객체를 생성할 때 호출되는 특별한 종류의 메서드이다. 예시를 들어 설명하면
Car car = new Car();
Car의 클래스가 있다고 가정하자. car 변수를 Car 타입으로 선언 후 new 키워드를 통해 힙 메모리 영역에 새로운 객체에 필요한 메모리를 할당한다. 이 후에 객체를 초기화를 수행하는데 필요한 메서드를 호출하는데 이 메서드가 생성자이다.
클래스를 작성하면서 생성자를 작성하지 않았던 적이 있었을 것이다. 이는 자바에서 생성자를 따로 작성하지 않으면 생성자를 자동으로 생성해주기 때문이다.
생성자의 작성 방법에 대해서 알아보겠다.
기본 생성자
기본 생성자는 생성자 메서드에서 매개변수를 받지 않고 초기화하는 메서드로 클래스의 이름과 기본 생성자 메서드의 이름은 같아야 한다. 아래에는 기본 생성자 작성 예시이다.
Class Car {
private count;
Car() {
System.out.println("기본 생성자 생성");
}
}
Case1)
Class Car {
private count;
Car (int count) {
this.count = count;
}
}
Case2)
Class Car {
private count;
Car(int count) {
count = count;
}
}
주의할 점
만약 위의 코드에서 생성자 초기화 부분에서 Case 2와 같이 하게 되면 어떻게 될까? 이는 우리의 의도와 다르게 count는 모두 우선순위가 빠른 매개변수 count로 인식되어 클래스의 맴버변수의 초기화는 이루어지지 않는다. 따라서 이 때 맴버변수로 지정해주는 키워드가 필요한데 이 키워드가 바로 위에서 사용한 this 이다. 다시 정리하면 this 키워드는 자기 자신의 클래스의 맴버변수를 가리키는 키워드이다.
생성자의 오버로딩
그럼 생성자의 매개변수의 타입과 개수를 다르게 해줘서 객체 생성시 초기화를 다양하게 할 수 없을까? 당연히 가능하다. 이는 오버로딩을 이용하면 되는데 오버로딩에 대해 짧게 설명하면 같은 메서드를 매개변수를 다르게 해서 다양하게 사용할 수 있게 하는 방법인데 아래는 예시이다.
Class Book {
private String name;
private String author;
privaet int isbn;
Book(String name, String author, int isbn) {
this.name = name;
this.author = author;
this.isbn = isbn;
}
Book(String name, String author) {
this.name = name;
this.author = author;
isbn = 0;
}
}
this() 사용법과 예시
위에서 Book 생성자 메서드를 보면 중복이 약간 불편하다고 생각할 수 있다. 따라서 이를 this() 메서드를 통해 중복을 피할 수 있다. this() 기능은 생성자 내부에서 자신의 생성자를 호출할 수 있게 해주는 메서드이다. this() 사용 주의점은 생성자 메서드 내부에서만 사용가능하며 생성자 메서드 맨 첫줄(앞)에 와야 한다는 점이다.
Class Book {
private String name;
private String author;
private int isbn;
Book(String name, String author, int isbn) {
this.name = name;
this.author = author;
this.isbn = isbn;
}
Book(String name, String author) {
this(name, author, 0)
}