JAVA/개념

자바(JAVA) : this, this(), super, super()

tigre 2022. 1. 4. 15:16
728x90
반응형

this 키워드

클래스 생성에 흔히 많이 사용되는 키워드 중 하나로 '객체, 자기 자신'을 나타내는 명령어 입니다.

사용은 총 3가지 형태로 사용되며, 대부분 호출한 객체를 명확히 하기위해 사용된다.

* 클래스의 속성과 매개변수의 이름이 같을 때

public Class Test{
       int a;
       
       public void Test(int a){
            this.a = a;
       }
}

위 소스에서는 생성자에서 클래스 속성인 a를 매개변수 a로 초기화해주고 있다. 근데 만약 이를 a = a로 나타내면 어떻게 될까?

답은 '초기화되지 않는다' 입니다. 만약 이처럼 this를 사용하지 않을 경우, a는 스코프에 위해서 [매개변수a = 매개변수a] 라는 식을 가지게 되고 결과적으로 객체의 값 자체는 초기화 되지 않게 됩니다.

* 오버로딩된 다른 생성자를 호출할 때

이건 우리가 코딩하다 흔히 보는 this() 함수를 사용하는 경우입니다.

public Class Test{
       int a;
       int b;

       public void Test(){
           this(null,null);
       }

       public void Test(int a){
           this(a, null);
       }

       public void Test(int b){
           this(null, b);
       }

       public void Test(int a , int b){
            this.a = a;
            this.b = b;
       }
}

this() 는 위와 같이 생성자를 부르기 위해 사용됩니다. 가장 많이 사용되는 것이 위와 같은 형태로 보통 속성을 초기화하는 부분을 축약할 때 사용되어 집니다.

주의할 점은 this()는 반드시 생성자의 첫번째 문장에 사용되어야 한다는 점입니다.

* 객체 자신의 참조값을 전달하고 싶을때

마지막으로 사용하는 방법이 자기자신의 참조값을 전달하고 싶은 경우입니다.

public Class Test{
       int a;
       public Test(int a){
            this.a = a;
       }
        
       public Test getTest(){
            return this;
       }
}

위와 같이 자신의 참조값을 전달하고 싶을 때 this라는 키워드가 사용됩니다.

super 키워드

this를 공부하면 다음으로 나오는 키워드가 바로 super 키워드 입니다.

super의 경우 this와는 다르게 자식클래스가 부모클래스로부터 상속받은 멤버로를 사용하고자 할때 사용됩니다.

class Parent{
   int a = 10;
}

class Child extends Parent{
    int a = 20;
    
    void childMethod(){
           System.out.println(a);         //20
           System.out.println(this.a);     //20
           System.out.println(super.a);   //10
    }
}
[출처] 온라인 자바 스터디#5 - 클래스(클래스, 메소드, 생성자, this/super키워드)|작성자 슝스

위와 같이 super를 사용하면 부모클래스에 선언된 속성 값을 가져올 수 있습니다.

super 키워드와 this 키워드의 기능이 비슷하 듯이 this()와 super() 키워드 역시도 기능이 비슷합니다. super() 키워드는 this()와 마찬가지로 생성자를 호출하는 함수로, 자기자신이 아닌 부모클래스의 생성자를 호출합니다.

class Canvas2D{
	int x;
	int y;
		
	public Canvas2D(int x, int y) {
		this.x = x;
		this.y = y;
	}
}
	
class Canvas3D extends Canvas2D{
	int z;

	public Canvas3D() {
		this(100, 200, 300);
	}
		
	public Canvas3D(int x, int y, int z) {
		super(x, y);
		this.z = z;
	}
}

다음과 같이 불러와 해당 속성들을 모두 초기화 할 수 있습니다.

 

728x90
반응형