ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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

    댓글

Designed by Tistory.