객체 지향 프로그래밍에서 자기 자신을 나타내는 this라는 키워드에 대하여 살펴보도록 하겠습니다.

 

This의 역할

  • 자기자신의 메모리를 가르키는 역할을 합니다.
  • 생성자에서 다른 생성자를 호출 하는 역할을 합니다. 
  • 인스턴스가 자기 자신의 주소를 반환할 때 사용합니다.

 

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

  • 인스턴스,힙 메모리에서 배웠듯이 참조 변수는 stack메모리에 저장되어 heap메모리에 있는 해당 인스턴스를 가리키는 역할을 합니다.
  • 예제에서 BirthDay 클래스의 인스턴스를 생성하며 선언한 참조 변수 day는 해당 인스턴스의 heap메모리 위치는 가르키고 있고 day에 사용하는 this는 day가 가리키는 인스턴스의 메모리 위치를 똑같이 가리키는 역할을 합니다.
  • 만약 BirthDay day2 = new BirthDay(); 라는 인스턴스를 생성시켜서 this를 사용한다면 이때 this는 day가 아닌 day2의 메모리의 위치를 가리킬 것 입니다. 

 

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

public class Person {
	
	String name;
	int age;
	//1번
	public Person() {
		
		this("이름없음",1);
	}
	//2번
	public Person(String name, int age) {
		
		this.name = name;
		this.age = age;
	}
	//3번
	public void showPeorsonInfo() {
		
		System.out.println(name +","+age);
}

}
  • Person class를 만들고 name, age 두개의 멤버 변수를 선언한 후 생성자로 이용해 2개의 인스턴스를 구현하는 경우에 2번과 같이 자기자신을 가르키는 this. 외에도 1번 생성자 안에 this()처럼 2번 생성자를 호출하는 역할로 this를 사용할 수 있습니다.
  • 호출하는 생성자를 사용시 this()괄호안에는 2번 생성자에서 매개변수인 String name과 int age가 들어가야 되고 1번 생성자에서는 초기화값을 주기 위해 "이름없음"과 1을 입력해 주었습니다.
  • 결과를 확인해보기위해 name과 age를 출력해주는 showPersoninfo() 메서드를 3번에 작성하였습니다.
public class PersonTest {

	public static void main(String[] args) {

		Person personNoName = new Person(); 
		personNoName.showPeorsonInfo(); //이름없음,1
		
		Person personLee = new Person("이순신",10);
		personLee.showPeorsonInfo(); // 이순신,10
		
	}

}
  • 1번 생성자를 테스트하기 위해 personNoName이라는 참조변수를 만들고 매개변수를 입력하지 않자 초기화 값인 이름없음,1이 출력되었고 2번 생성자가 잘 호출 되었음을 확인 할 수 있습니다.
  • 2번 생성자를 테스트하기 위해 poersonLee를 만들고 매개변수로 "이순신",10을 입력하였고 그대로 출력되는 것을 확인 할 수 있습니다.
public Person() {
		age = 10
		this("이름없음",1);
	}
  • 1번 생성자를 수정한 위의 문장은 "Constructor call must be the first statement in a constructor"라는 에러가 발생하는데 먼저 작성한 문장이 다른 생성자를 호출 할 경우 충돌이 생길 가능성을 예방하기 위한 에러입니다. 그렇기 때문에 호출을 위해사용하는 this()는 항상 첫문장으로  사용 되야 합니다.

 

자기 자신의 주소를 가르킬 때의 this

public Person getSelf() {
		return this;
	}
  • Person 클래스에 자기 자신의 주소를 반환하는 getSelf 메서드를 작성하였습니다. 이때 반환되는 자료형은 클래스명으로 return 값에 this를 사용하게 됩니다. 
package thisex;

public class PersonTest {

	public static void main(String[] args) {

		Person personNoName = new Person();
		personNoName.showPeorsonInfo();
		
		Person personLee = new Person("이순신",10);
		personLee.showPeorsonInfo();
		//2번
		System.out.println(personLee); //thisex.Person@5305068a 
		//1번
		Person p = personLee.getSelf();
		System.out.println(p);         //thisex.Person@5305068a
				
	}

}
  • 테스트하기 위해 1번과 같이 personLee에 getSlef메서드를 참조하고 변수 p의 대입하고 출력을 하고 P값을 출력했습니다. 그리고 2번 출력문과 같이 바로 personLee의 주소를 출력해보니 둘이 값이 같은 것을 확인 할 수 있습니다. 
  • 1번에서 바로 Person p변수를 사용할 수 있는 이유는 이미 생성된 참조변수 personLee를 담는 역할을 하기 때문이다. 만약 personSong과 같이 새로운 참조변수를 사용한다면 변수p를 사용할 수 없습니다.

+ Recent posts