[Java] 클래스와 객체 - this에 대하여

나영원·2020년 8월 27일
2

Java_basic

목록 보기
28/60

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

This의 역할

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

자기 자신의 메모리를 가리키는 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를 사용할 수 없습니다.
profile
배우는 개발 일기

0개의 댓글