본문 바로가기
JAVA/객체지향

자바 this / this() 뜻, 의미, 사용방법에 대해서

by 스코리아 2023. 8. 15.

안녕하세요, 스코리아입니다.

오늘은 자바의 this, this()의 차이점과 의미(뜻)를 알아보고, 어떻게 사용하는지 사용 방법을 예제와 함께 알아보겠습니다.

 

this 의미(뜻)?

  • this를 단어의 어원적인 측면으로 본다면, '이것'이라고 해석합니다.
  • 자바에서는 '인스턴스 자신의 메모리'를 가리키는 키워드입니다. 
  • 아래 그림과 같이 생성된 인스턴스의 메모리 주소를 가집니다. 클래스 내에서 참조 변수가 가지는 주소값과 동일한 주소값을 가지는 키워드입니다.

this 사용 예제

 

this와 this()의 차이점과 사용방법

  • this this.매개변수 형태로 사용이 가능합니다. 매개변수와 객체 자신이 가지고 있는 변수의 이름이 같은 경우 이를 구분하기 위해 this를 붙입니다.
  • 예를 들어 아래 코드를 보면 this.month = month; 에서 this.month는 객체의 멤버변수를 가리키고 month는 메소드의 매개변수를 가리키고 있습니다. 이름이 month로 동일하니, 구분하기 위해 this. 를 붙인 겁니다.
private int month; // 멤버변수

public void setMonth(int month){ // 메소드
	this.month = month;
}

  • this() 클래스에 생성자가 여러 개일 경우, 생성자 내에서 또 다른 생성자를 호출할 때 사용합니다. (생성자 오버로딩 참고: https://skorea6.tistory.com/7 )
  • 예를 들어 아래 코드를 보면, 기본 생성자 Person() 이 있고, 매개변수 name과 age를 받는 추가 생성자 Person(String, int)이 있습니다.
  • 기본 생성자 Person()이 호출될 때, name을 "이름없음"과 age를 1로 초기화하기 위해 추가 생성자 this(String, int)를 호출하였습니다.
public class Person {
	String name;
	int age;
	
	public Person() { // 기본 생성자
    	// [주의] this 위에 작성 불가!
		this("이름없음", 1); // 추가 생성자 호출
	}
	
	public Person(String name, int age) { // 추가 생성자
		this.name = name;
		this.age = age;
	}
}
  • 정말 주의해야 할 점이 있습니다. 
  • 생성자에서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없습니다. 즉, this() 위에 무언가를 쓰는 행동은 불가합니다.

 

자신의 메모리 주소 반환하는 this (예제)

public class Person {
    String name;
    int age;

    public Person() {
        this("이름없음", 1);
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Person getPerson() {
        return this; // 자기 자신 반환 (Person 인스턴스 메모리 주소 반환)
    }


    public static void main(String[] args)
    {
        Person p = new Person();
        System.out.println(p.name + " " + p.age);
        System.out.println(p.getPerson()); // p 이름의 Person 인스턴스 메모리 주소
        System.out.println(p); // p 이름의 Person 인스턴스 메모리 주소
    }
}

예제 결과값

  1. new Person()을 통해 p 이름을 가진 Person 인스턴스를 생성하였습니다. 
  2. 인스턴스를 생성할 때, 기본 생성자로 호출되었으므로, this("이름없음", 1); 가 호출되어, 멤버변수 name 에는 "이름없음", age에는 1이 저장된 상태입니다. 이를 출력하였습니다.
  3. getPerson() 메소드this (자기 자신의 메모리 주소)를 반환합니다. 그러므로 인스턴스 p의 메모리주소가 출력됩니다.
  4. 인스턴스 p를 직접적으로 출력하면, 인스턴스 p의 메모리주소가 출력됩니다. 이는 3 과정에서의 메모리주소와 동일합니다. (같은 인스턴스는 같은 메모리 주소를 갖고 있으므로)

 


지금까지 자바(JAVA) this 키워드(예약어)의 의미와 사용방법을 예제와 함께 알아보았습니다.

추가적으로, this 클래스 내부에서만 사용 가능하며 static 메소드에서는 사용이 불가합니다. static은 인스턴스가 생성되기 이전의 상태로, 인스턴스 자신의 메모리 주소를 알 수가 없는 상태이기 때문이죠.

 

 

읽어주셔서, 감사합니다.