객체 지향 프로그래밍에서 자기 자신을 나타내는 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를 사용할 수 없습니다.
'Java' 카테고리의 다른 글
[Java] 클래스와 객체 - 예제2 (0) | 2020.07.12 |
---|---|
[Java] 클래스와 객체 - 객체간 협력 (0) | 2020.07.10 |
[Java] 클래스와 객체 - 정보 은닉 (0) | 2020.07.10 |
[Java] 클래스와 객체 - 참조 자료형 (0) | 2020.07.10 |
[Java] 클래스와 객체 - 생성자, 생성자 오버로딩 (0) | 2020.07.10 |