생성자는 new연산자를 통해서 인스턴스를 생성할 때 반드시 호출되고 제일 먼저 실행되는 일종의 void 타입 메소드이다. 생성자는 인스턴스 변수를 초기화 시키는 역할을 담당한다.
생성자는 일종의 void 타입의 메소드라고 했다. 따라서 메소드를 선언하는 방식과 비슷하다.
생성자명은 생성자를 정의하는 클래스명과 동일하게 작성해야 한다.
반환타입이 무조건 void이기 때문에 생략이 가능한 것이다.
앞서 메소드를 호출할 때 먼저 new 연산자로 객체를 생성한 후에 해당 객체에 있는 메소드를 사용할 수 있었다. 객체를 생성할 때 사실은 기본생성자를 호출하여 객체를 초기화한 것이다.
😯 기본생성자를 만들지 않았었는데?
기본생성자는 따로 개발자가 작성하지 않아도 컴파일러가 자동으로 생성해주기 때문에 생성자 호출이 가능했던 것이다.
매개변수가 없는 기본생성자 이외의 다른 생성자를 생성할 때는 기본생성자가 생성되지 않는다. 다른 생성자를 만들고 기본생성자도 같이 사용하려면 기본생성자를 직접 작성해주어야 한다.
이 경우 기본생성자와 다른 생성자는 오버로딩 관계이다. 매개변수의 타입과 개수가 다르면 같은 이름의 메소드를 사용할 수 있는 것을 오버로딩이라고 했었다. 생성자도 메소드이고 같은 메소드명을 사용하면서 매개변수가 다르기 때문에 오버로딩이라 할 수 있다.
public class Student{
// 필드
String name;
int age;
public Student(){ }// 1)기본생성자
public Student(String name, int age){ // 2)매개변수를 가진 생성자
this.name = name;
this.age = age;
}
public void test(){ //3) 실행메소드
System.out.print("학생이름: " + name);
System.out.print(", 학생나이: " + age);
}
}
public static void main(String[] args) {
Student s1 = new Student(); // 4)객체생성 -> 기본생성자 호출
Student s2 = new Student("김사과", 20); // 5) 객체생성 -> 매개변수를 가진 생성자 호출
s1.test(); // 6)
s2.test(); // 7)
}
1) 기본생성자. 매개변수를 가진 생성자를 만들면 기본생성자가 자동으로 생성되지 않기 때문에 직접 작성해준다.
2) 매개변수를 가진 생성자.
1) 과 2)는 생성자 오버로딩 관계이다.
3) 변수를 출력하는 실행메소드이다.
4) 메인메소드에서 기본생성자를 호출하여 객체를 생성해주었다.
5) 메인메소드에서 매개변수를 가진 생성자를 호출하여 객체를 생성해주었다. 매개변수 타입과 수에 맞게 값을 넣어야 한다.
6) [결과] 학생이름: null, 학생나이: 0
7) [결과] 학생이름: 김자바, 학생나이: 20
변수를 필드에서 초기화하지 않고 생성자에서 변수를 초기화 할 수 있다. 국적이나 성별 등과 같은 경우는 하나의 값으로 고정할 수도 있지만 이름, 나이, 주민번호와 같은 경우는 사람마다 다르기 때문에 생성자에서 초기화해야 한다.
생성자에서 값을 넣으면 필드의 변수가 초기화될 수 있다. 매개변수의 이름은 필드이름과 유사하거나 동일하게 사용할 것을 권장한다. 필드와 매개변수이름이 완전히 동일한 경우는 “this.”을 통해 필드를 표현한다.
this?
this는 객체 자신을 가리키는 참조변수이다. 자신의 객체에 접근할 때 사용한다. 주로 멤버변수와 매개변수의 이름이 동일할 때, 이를 구분하기 위해 사용된다. “this.”이 붙은 변수가 필드이다.
↪️ 위의 예제를 다시 살펴보자.
public class Student{
// 필드
String name;
int age;
public Student(){
public Student(String name, int age){ // 2)매개변수를 가진 생성자
this.name = name; //1)
this.age = age; //2)
}
public void test(){
System.out.print("학생이름: " + name);
System.out.print(", 학생나이: " + age);
}
}
1)과 2)는 필드의 멤버변수 name과 age를 가리키는 것을 알 수 있다.