this 와 this()

지정욱·2023년 12월 21일
0

먼저 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;
 }
}

위 코드에서 생성자를 보면 멤버 변수와 생성자의 매개변수 이름이 같은 것을 볼 수 있다. 과연 어떻게 구분해야 할까?

  • 이 경우에는 멤버 변수보다 매개변수의 코드가 코드 블럭의 더 안쪽에 있기 때문에 매개변수가 우선순위를 가진다. 따라서 StudentInformation(String name, ...) 생성자 안에서 name이라고 적으면 매개변수에 접근하게 된다.
  • 멤버 변수에 접근하려면 앞에 this. 이라고 붙여주면 된다. this는 인스턴스(객체) 자신의 참조값을 가리킨다.
    이렇게 생각하면 this를 왜 사용하는지 알게 되었을 것이다.

> 코드를 다음과 같이 변경해주면 된다.

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;
 }
}

> 그렇다면 과연 this()는 무엇일까?

메소드 오버로딩을 하는 것 처럼 생성자도 매개변수만 다르게 해서 여러 생성자를 제공할 수 있다.

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);
profile
T자형 개발자가 되자

0개의 댓글