생성자란 객체 생성시 제공되는 초기화 기능이라고 생각하면 됩니다.
[기본 생성자 예시]
public class ConstructorEx{
public static void main(String[] args){
ConstructorEx constructorEx = new ConstructorEx();
}
}
위의 예시에서 new 오른쪽에 있는 ConstructorEx()가 생성자입니다.
생성자는 객체를 생성할 때 가장 먼저 실행되어 객체를 초기화합니다.
하지만 Constructor클래스에서 아무리봐도 생성자가 정의된 부분을 찾을 수 없습니다.
그 이유는 클래스를 작성할 때 사용자가 생성자를 만들지 않으면 자바에서 기본 생성자를 컴파일 할 때 자동으로 생성해주기 때문입니다.
기본 생성자는 매개변수가 없는생성자입니다.
이제부터는 매개변수가 있는 생성자에 대해서 생각해 보겠습니다.
우선 매개변수가 있는 생성자는 자바에서 제공해주지 않기때문에 우리가 직접 만들어야 합니다
우리는 생성자를 정의해본 적이 없기때문에 몇 가지 생성자의 특징에 대해 알아보고 생성자를 만들어보겠습니다
(생성자의 리턴타입은 해당클래스의 객체)오버로딩은 특징을 가집니다.
[매개변수가 있는 생성자 예시]
public class ConstructorEx{
String name;
public ConstructorEx() {
//기본 생성자
}
public ConstructorEx(String name) {
//매개변수가 있는 생성자
this.name = name;
}
public static void main(String[] args){
ConstructorEx constructorEx = new ConstructorEx("myName");
}
}
기본생성자 예제와는 확실히 차이점이 보입니다.
매개변수가 있는 생성자 예제를 보기로 했는데 기본 생성자가 선언되어 있는걸 보고 기본 생성자는 자바에서 제공해주는 것 아닌가?라는 생각을 할 수 있습니다.
하지만 자바가 기본생성자를 자동으로 만들어주는 것은 클래스안에 생성자가 없는 경우입니다.
만약 사용자가 클래스 안에 생성자를 하나라도 선언했다면, 기본 생성자가 제공되지 않으며 그 경우 기본 생성자가 없으면 컴파일이 되지 않습니다
이처럼 우리는 매개변수를 다르게 가지는 여러개의 생성자를 이용해서 다양한 방법으로 객체를 초기화 할 수 있습니다.
[여러가지 생성자 활용 예시]
public class ConstructorEx{
String name;
int age;
public ConstructorEx() {
//기본 생성자
}
public ConstructorEx(String name) {
//이름만 아는 경우
this.name = name;
}
public ConstructorEx(int age) {
//나이가 아는경우
this.age = age;
}
public ConstructorEx(String name, int age) {
//나이와 이름을 모두 아는 경우
this.name = name;
this.age = age;
}
public static void main(String[] args){
ConstructorEx constructorEx = new ConstructorEx("myName");
ConstructorEx constructorEx2 = new ConstructorEx(21);
ConstructorEx constructorEx3 = new ConstructorEx("myName", 21);
}
}
위의 예시처럼 여러가지 생성자를 만들어서 객체를 초기화 할 수 있습니다.
생성자를 몇 개 까지 만들수 있을까라고 생각하시는 분도 계실거라고 생각합니다
생성자에 정해진 개수는 없지만, 무분별하게 많이 만들경우 관리가 힘들어지고 혼란을 야기할 수 있기 때문에 꼭 필요한 생성자만 만드는 것을 추천합니다
위의 예시에서 this라는 키워드가 사용된 것을 보셨을 것입니다.
this는 인스턴스 자기자신을 의미한다고 생각하시면 됩니다
public class ConstructorEx{
String name;
int age;
public ConstructorEx(String name) {
//이름만 아는 경우
this.name = name;
}
}
위의 생성자에서 매개변수로 받은 name과 인스턴스 변수 name의 이름이 같기때문에 this를 사용하지 않으면 두 개의 변수를 구분할 수 없습니다
그렇다면 매개변수 이름을 다르게 하면 되지 않나?라고 생각 할 수 있습니다.
물론 틀린말은 아니고, 그렇게 사용하는 것은 개인의 자유입니다.
하지만 this를 이용해서 구분하는 것이 의미가 더 명확하다고 생각하기 때문에 저는 변수이름을 달리 사용하기 보다는 this를 이용하는 편이 더 좋다고 생각합니다.