This

임준철·2021년 3월 14일
0

JavaAdvanced

목록 보기
12/15

This 키워드

  • 객체가 스스로를 가르키는 참조, 자신의 메모리를 가리킨다.
  • 인스턴스 자신의 주소를 반환한다.
  • 멤버 변수와 로컬 변수의 이름이 같을 때, 멤버 변수임을 명시

생성자에서 다른 생성자를 호출하는 예제

  • 생성자를 호출하는 데에도 사용할 수 있다.
    • 생성자 오버로딩에서 한 클래스 안에 생성자가 여러개 있을 수 있는데
      한 생성자에서 다른 생성자를 호출하는 경우가 종종있다.
  • this() 호출시에 반드시 생성자의 첫 줄에서만 사용해야 한다.
    • 생성자는 인스턴스의 값들을 초기화하는 인스턴스 생성을 초기화하는 역할을 한다.

    • this()로 다른 생성자를 호출할 때, 호출한 생성자가 무슨일을 할 줄 모르는 상태인데 this() 호출 보다 먼저 값들을 초기화한다고 하면,
      다른 생성자를 호출할 때 다른 스테이트가 올라가는 것을 허용하지 않는다. 그래서 호출은 가장 첫줄에 써야 한다.

       public class Constructor {
           int x;
           int y;
           String z;
       
           public Constructor(){ // 기본 생성자, 구현하지 않아도 알아서 생긴다.
               this(0,0);
       //        x = 1;
       //        y = 2;
       //        z = "자동 초기화 값이 들어간다.";
           }
      
       
       
          // 파라미터 생성자
           public Constructor(int x, int y, String z){ //오버로딩
               this.x = x; // this는 멤버 변수를 표기하기 위해 사용될 수 있다.
               this.y = y;
               this.z = z;
           }
       
           public Constructor(int a, int b){
               this(a,b,""); 
            // 자기 자신을 가르키는 애 위에 함수가 호출됨.
            // this는 무조건 첫줄에만 쓰일 수 있다.(단한번) 규칙입니다.
       //        x = a;
       //        y = b;
       //        z = "";
           }
       }

자기 자신의 메모리를 가리키는 this 예제

public class MyDate {
    private int day;
    private int month;
    private int year;

    private boolean isVaild = true;

    public  void setDay(int day){
        this.day = day;
    }
    public int getDay(){
        return day;
    }

    public int getMonth() {
        return month;
    }

    public void setMonth(int month) {
        if(month <1 || month > 12){
            isVaild = false;
        }
        this.month = month;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public void showDate(){
        if (isVaild){
            System.out.println(this.year + "년" + this.month + "월" +this.day+"일");
        }else{
            System.out.println("유효하지 않은 범위 입니다.");
        }
    }
}

public class MyDateTest {
    public static void main(String[] args) {
        MyDate date = new MyDate();

        date.setYear(2019);
        date.setMonth(13);
        date.setDay(10);

        date.showDate();

    }
}
  • 인스턴스 자신의 주소를 반환할 일이 있으면 this를 반환 하면 된다.

  • day로부터 setYear라는 메소드를 호출하게 되면 setYear는 BirthDay에 대한 메소드이니깐

  • setYear의 세그멘테이션이 stack영역에 만들어지고 만약 setYear 안에서 this를 썼다하면 힙영역의 BirthDay에 대한 메모리를 가리킨다.
    인스턴스 내부에서(객체 내부에서) 자기 자신이 생성된 메모리 주소를 가리킨다.
    인스턴스가 여러 개 생성 됬다 하면 각각의 this는 다 다름 코드상에서 this하나만 쓰지만 각각은 다 다르다

  • 여기서 stack 영역에 this가 들어가게 되는데 왜 this가 들어가는지 이해가 안 갔는데

  • 메인에서 this가 date.setYear() 이런식으로 호출이 되어있다면 this는 date변수 대신이라고 생각해도 될까?

  • 로컬변수에 this는 참조변수로 생성된다. 그런의미로 이해하면 될 것 같다.

자기 자신을 반환하는 this

public Person getPerson(){
     return this;
}
profile
지금, 새로운 문을 열자! 문 저편에 무엇이 있을지 두렵더라도!!

0개의 댓글