JAVA_this(), this
this(), this
this()
클래스 안의 메서드들끼리 서로 호출할 수 있듯이, 생성자도 서로 호출이 가능하다.
이때 사용하는 메서드가 this()이다.
생성자를 서로 호출한다는게 감이 안올 수도 있다.
코드로 먼저 보고 설명을 듣는게 좋다.
public class sengsungEX {
public static void main(String[] args) {
Sengsung sengsung1 = new Sengsung();
Sengsung sengsung2 = new Sengsung("chicken");
}
}
class Sengsung {
public Sengsung() { // (1) 생성자 오버로딩
System.out.println("1번 생성자");
}
public Sengsung(String str) { // (2)
this();
System.out.println("2번 생성자");
}
}
//출력
1번 생성자 // 진짜 1번 생성자 호출 할때 나온 출력
1번 생성자 // 2번 생성자 호출할때, this()로 1번생성자가 또 호출됨
2번 생성자 // 2번 생성자 출력
위의 코드를 보면, 2개의 생성자를 만들어서 각각 호출될때의 출력을 볼 수 있는 코드이다.
그런대, 1번 생성자 , 2번 생성자 총 2번의 출력 뿐 아니라, 1번생성자가 한번 더 들어있다.
이유는 매개변수가 있는 생성자 부분을 보면 알 수 있는데, 생성사 내용 작성 시 첫줄에 this();가 있는 것을 알 수 있다.
이 this()메소드는 해당 클래스의 기본 생성자(매서드가 없는 생성자)를 호출하게 되어, 2번째 생성자를 호출할 때 1번째 생성자와 2번째 생성자의 출력이 같이 나오는 것이다!
작동 순서
- 1번째 생성자 호출 -> "1번째 생성자" 출력
- 2번째 생성자 호출 -> "1번째 생성사" 출력 + "2번째 생성자" 출력
this
this는 this()와는 달리 "생성자"를 호출하는게 아닌, 클래스 내의 "객체"(변수,매서드..)를 호출하는 것이다.
이것도 코드를 보면서 이해하는것이 좋다.
public class sengsungEX {
public static void main(String[] args) {
Sengsung sengsung1 = new Sengsung("chicken");
System.out.println(sengsung1.getoutput());
}
}
class Sengsung {
private String CH;
public Sengsung(String CH) { // (1) 생성자 오버로딩
this.CH = CH;
System.out.println("1번 생성자");
}
public String getoutput(){
return CH;
}
}
//출력
1번 생성자 // 진짜 1번 생성자 호출 할때 나온 출력
chicken
위의 코드에서 클래스 안의 CH, 그리고 생성자 안의 CH를 보자.
생성자 안의 CH는 this.CH = CH로 클래스의 CH(클래스의 인스턴스변수)에 접근 한 것이다.
앞서 말한 매개변수가 있는 생성자 호출을 참고해서 보면, new Sensung("chicken"); 코드 작동으로 매개변수가 있는 생성자가 실행되어 "1번 생성자" 출력이 나오고,
System.out.println(sengsung1.getoutput()); 코드로, 클래스 내의 getoutput 메서드가 작동하게 된다.
이 때, sengsung1가 생성될 때, CH에 Sengsung 클래스의 매개변수로 chicken을 넣었고, 생성자에서 또 CH를 가져와서 (this를 이용해서 CH를 가져옴 = chicken을 가져옴) getoutput메서드에 넣는다.
요약하면, 생성자 선언 할 때 넣은 매개변수를 this.CH에 넣어준다는 것이다!
그러면 getoutput는 chicken을 내놓게 되고, 그대로 출력된 것이다.
핵심
- this는 인스턴스를 가리키며, 마치 참조변수를 통해 인스턴스의 멤버에 접근하는 것 처럼, this를 통해 인스턴스의 변수에 접근할 수 있다!