this는 인스턴스 자신을 가리키는 예약어이다. 즉, this는 인스턴스가 저장된 힙 메모리의 주소값을 가지고 있는 변수이며 스택 메모리에 저장된다.
위의 단 하나의 원리를 기억하면서 this가 사용되는 예제를 몇 개 보자.
1. 인스턴스가 저장된 메모리의 주소
package classpart;
public class Student {
String name;
char gender;
public void setName(String name) {
this.name = name; // this.name은 클래스의 멤버변수이고 name은 메소드의 매개변수를 의미한다.
}
public String getName() {
return this.name; // 클래스의 멤버변수 name을 반환
}
public void printThis(){
System.out.println(this); // this자체를 반환
}
}
매개변수로 이름을 전달해 줄 때에도 그 의미를 파악할 수 있게 name이라고 넣어준다. 그리고 메소드의 코드 구현부에서는 로컬변수인 매개변수 name이 우선이다. 이 때 매개변수 name의 값을 클래스 멤버변수 name에 저장하기 위해 this를 쓴다. this.name은 클래스의 멤버변수 name을 지칭한다.
package classpart;
public class Test {
public static void main(String[] args) {
Student stu = new Student();
stu.setName("John");
System.out.println(stu.getName());
System.out.println(stu);
stu.printThis();
}
}
실행결과
John
classpart.Student@15db9742
classpart.Student@15db9742
setName의 매개변수로 전달 된 "John"이 전달되었다. 이 때 setName 메소드의 코드 구현부의 this는 인스턴스가 대입되는 것이다. 따라서 코드 구현부는 stu.name = "John"이 되는 것이다.
한 번더 확인하기 위해 stu를 출력하고 this를 출력하는 printThis() 메소드를 호출한 결과가 같다. 둘 모두 인스턴스가 저장된 힙 메모리의 주소값을 가진다.
2. 생성자에서 다른 생성자를 호출할 때
package classpart;
public class Student {
String name;
char gender;
Student(){
this("NoName", '?'); //아래에 정의된 생성자 호출
}
Student(String name, char gender){
this.name = name;
this.gender = gender;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public char getGender() {
return gender;
}
public void setGender(char gender) {
this.gender = gender;
}
}
위 코드는 인스턴스를 생성하면서 아무런 정보도 입력하지 않았을 때의 default값을 설정하기 위해 이미 정의 된 다른 생성자를 사용하는 경우이다.
package classpart;
public class Test {
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu.getName());
System.out.println(stu.getGender());
}
}
실행결과
NoName
?
3. 자신의 주소 반환
package classpart;
public class Student {
String name;
char gender;
public Student returnItSelf() {
return this;
}
}
Student 타입의 자료를 반환하는 함수라 반환형이 Student인 메소드이다.
package classpart;
public class Test {
public static void main(String[] args) {
Student stu = new Student();
System.out.println(stu);
System.out.println(stu.returnItSelf());
}
}
실행결과
classpart.Student@15db9742
classpart.Student@15db9742
같은 결과를 반환하는 것을 볼 수 있다.
이 경우처럼 this가 쓰이는 경우는 흔치 않다.
하지만 세 가지 방법에 통용되는 원리는 단 하나다. this라는 것은 인스턴스가 만들어졌을 때 생겼을 주소값을 저장하여 자신을 가르키는 역할을 한다는 것만 기억하면 된다.
'프로그래밍 언어 > Java' 카테고리의 다른 글
(Java) 22 - static 변수 (0) | 2020.05.17 |
---|---|
(Java) 21 - 객체 지향 예제 - 학생, 버스, 지하철 프로그램 (0) | 2020.05.17 |
(Java) 19 - 정보 은닉 (0) | 2020.05.17 |
(Java) 18 - 참조 자료형 (0) | 2020.05.17 |
(Java) 17 - 생성자 (0) | 2020.05.17 |