먼저 this에 대해서 알아보도록 하자.
멤버 변수와 메서드의 매개변수의 이름이 같으면 둘은 어떻게 구분해야 할까?
먼저 코드를 보도록하자. 다음 코드는 학생 객체를 생성하는 프로그램이다.
package construct;
public class StudentInformation {
String name;
int age;
int grade;
public StudentInformation(String name, int age, int grade) {
name = name;
age = age;
grade = grade;
}
}
위 코드에서 생성자를 보면 멤버 변수와 생성자의 매개변수 이름이 같은 것을 볼 수 있다. 과연 어떻게 구분해야 할까?
package construct;
public class StudentInformation {
String name;
int age;
int grade;
public StudentInformation(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
메소드 오버로딩을 하는 것 처럼 생성자도 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.
package construct;
public class StudentInformation {
String name;
int age;
int grade;
public StudentInformation(String name, int age){
this.name = name;
this.age = age;
this.grade = 0;
}
public StudentInformation(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
this.name = name;
this.age = age;
개발자가 제일 싫어하는 것이 무엇인가? 바로 중복코드이다!!
이때 this()라는 기능을 사용하면 생성자 내부에서 자신의 생성자를 호출할 수 있다.
참고로 this는 인스턴스 자신의 참조값을 가리킨다. 따라서 자신의 생성자를 호출한다고 생각하면 된다. 이제 코드를 수정해 보도록 하자.
package construct;
public class StudentInformation {
String name;
int age;
int grade;
public StudentInformation(String name, int age){
this(name,age,0);
}
/
public StudentInformation(String name, int age, int grade) {
this.name = name;
this.age = age;
this.grade = grade;
}
}
this()를 사용하면 생성자 내부에서 다른 생성자를 호출 할 수 있다.
첫번째 생성자에서 두번째 생성자를 호출한 것이다. 이 부분을 잘 활용한다면 지금과 같은 중복코드를 제거할 수 있다.
this()를 사용하려면 주의사항이 있다. 명심하도록 하자.
this()는 생성자 코드의 첫줄에만 작성이 가능하다.
다음은 컴파일 에러가 발생하는 코드이다.
System.out.println("에러가 발생하는 코드입니다.);
public StudentInformation(String name, int age){
this(name,age,0);