백엔드/JAVA_이론공부

JAVA_this(), this

반 불혹 2022. 9. 18. 20:55

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번째 생성자 호출 -> "1번째 생성자" 출력

  2. 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를 통해 인스턴스의 변수에 접근할 수 있다!