-
[JAVA] This언어/JAVA 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); } }
'언어 > JAVA' 카테고리의 다른 글
[JAVA] SingletonPattern (0) 2022.09.07 [JAVA] Static (0) 2022.09.07 [JAVA] 생성(Constructor) (0) 2022.09.07 [JAVA] 접근지정자(AccessModifier) (0) 2022.09.07 [JAVA] Class (0) 2022.09.07