언어/JAVA
[JAVA] This
hvoon
2022. 9. 7. 17:44
-멤버변수와 지역변수(매개변수)와 부득이하게 이름이 같았을 때, 그 둘을 구분하기 위해 멤버변수 앞에 this. 을 붙여서 사용함.
-this 키워드는 클래스 내부에서 사용되는 모든 멤버 변수에 원래 붙어 있지만 사용 편의상 확실히 멤버변수로 구분할 수 있는 경우 생략해서 사용하고 있음
-매개변수와 이름이 같지 않은 경우도 this를 붙여서 사용할 수 있음
-this 변수는 래퍼런스(참조) 변수임
-클래스의 멤버 필드들은 new라는 키워드에 의해서 각각의 객체별로 생성됨(서로 다른(겹치지 않는) 메모리 공간)
-반면, 멤버 메서드는 생성된(오버로딩 포함) 메서드별로 하나만 존재하여 모든 객체들이 공유해서 필요시 호출함.
-이때 현재 메서드를 호출한 객체가 어떤 객체인지 구분하여 실행될 수 있게 this라는 숨겨진 참조변수를 제공함
class ThisB{
private int num;
ThisB(/* , ThisB this */){
this.num=0;
}
ThisB(ThisB b /* , ThisB this */){
this.num=b.num;
// 매개변수에 저장된 객체의 num 값을
// 현재 만들어지는 객체의 num에 저장
// main 메서드에서 ThisB b4=new ThisB(b2);
// 이와 같이 호출되었다면
// this에 b4가 전달, b에 b2가 전달
}
public void setNum(int num /* , ThisB this */) {
// 메서드를 호출한 객체가 매개변수 this에 저장됨
this.num=num;
}
public void prn(/* ThisB this */) {
System.out.printf("num=%d\n",num);
}
public void copy1(ThisB b /* , ThisB this */){
this.num=b.num;
// main 메서드에서 b5.copy1(b2);이와 같이 호출되었다면
// this에는 b5, b에 b2가 전달
}
public ThisB copy2(/* ThisB this */) {
// ThisB b6=b4.copy2();
// this<=b4 실행결과가 리턴되서 b6로 되돌려짐
ThisB temp=new ThisB();
temp.num=this.num;
return temp;
}
}
public class This01{
public static void main(String[] args) {
ThisB b1=new ThisB();
ThisB b2=new ThisB();
b1.setNum(100);
b2.setNum(200);
b1.prn();
b2.prn();
ThisB b3=b1; // b1이 저장한 참조값(주소)을 B3에 저장
// 인스턴스는 하나, 같은 주소를 갖는 참조변수는 두개의 효과
b3.setNum(300); // b3의 변수값 변경은 b1의 변경이기도 함
b1.prn();
b3.prn();
// 위 연산은 new를 이용하여 b3에 새로운 공간을 만든게 아니라
// b1 위 래퍼런스 값만 복사 저장한 결과로
// b1과 b3는 같은 공간의 주소를
// 저장하고 있기 때문
ThisB b4=new ThisB(b2); // 전달인수로 객체의 주소를 보냄
b2.setNum(500);
b2.prn();
b4.prn();
ThisB b5=new ThisB();
b5.copy1(b2);
b2.setNum(700);
b2.prn();
b5.prn();
ThisB b6=b4.copy2();
b2.setNum(900);
b2.prn();
b6.prn();
}
}
용도
-멤버메서드를 호출한 호출객체의 참조변수값(주소값)을 전달받아 전달된 메세드를 호출한 객체를 식별하는 용도로 사용됨.
-보통 멤버변수를 this 없이 사용해도 이름이 중복된 매개변수가 없다면 내부적으로 this가 붙어서 실행됨.
-오버로딩 외어 있는 생성자들 간 서로를 재호출 하기 위한 이름으로 사용
-호출하는 형태(매개변수의 형태)데로 생성자가 오버라이딩 되어 있어야 사용가능
class ThisC {
private int num1;
private int num2;
private int num3;
ThisC(int n){
num1=n;
System.out.println("ThisC class constructor1");
}
ThisC(int n1,int n2){
// num1=n1;
// ThisC(n1); X
this(n1);
// 전달인수 하나를 갖는 생성자를 호출하기 위해 ThisC(n1);이 아닌
// this(n1);을 사용
// 현재 위치에서 실행될 명령이 다른 생성자에 똑같이 존재한다면
// 똑같은 코드 또 쓰지 않고 다른 생성자를 호출해서 실행을 대신하겠다는 뜻
num2=n2;
System.out.println("ThisC class constructor2");
}
ThisC(int n1, int n2, int n3){
this(n1,n2);
num3=n3;
System.out.println("ThisC class constructor3");
}
// this를 사용한 생성자간 호출 코드는 반드시 생성자의 명령 중
// 첫번째 실행코드로만 사용 가능함
}
public class This02 {
public static void main(String[] args) {
ThisC t1=new ThisC(10);
System.out.println();
ThisC t2=new ThisC(20,30);
System.out.println();
ThisC t3=new ThisC(10,20,30);
}
}