[Java] this와 this(), super와 super() 차이점

고동이의 IT·2021년 10월 7일
1

Java

목록 보기
1/37

java에서 this와 this() 그리고 super와 super()에 대해 알아보겠습니다.

오버라이딩
부모 클래스로부터 상속받은 메서드의 내용을 변경하는것으로 메서드의 선언부는 부모의 것과 완전히 일치해야한다.
이름, 파라미터, 반환타입 같아야한다.

this: 인스턴스 자신을 가리키는 참조변수

this(): 같은 클래스의 다른 생성자를 호출할 때 사용

super: 부모, 자식 클래스의 변수/메서드 이름이 똑같을 때 구분위해 사용한다. 부모 클래스의 클래스 멤버 앞에 붙여준다.

super(): 자식 생성자 안에서 부모 클래스의 생성자를 호출할 때 사용한다. object클래스를 제외한 모든 클래스의 첫줄에 생성자, this() 또는 super()를 호출해야한다. 이유는 자식 클래스 멤버가 부모 클래스 멤버를 사용할 수 있기 때문에 부모의 멤버들이 먼저 초기화 되어 있어야 하기 때문이다. 생성자를 첫줄에 호출하징 않으면 컴파일러가 자동으로 super()를 생성자의 첫줄에 삽입한다.

예제를 들어 쉽게 이해해보도록 하겠습니다.

[this, super의 사용예]

1) 부모클래스와 자식 클래스를 생성

public class Parent {
 // 부모 클래스
	       String var;
	       
	       {var="초기화 블럭은 물려주지 않는다.";
	       }
	       
	       Parent(){ //생성자
	       var= "생성자도 물려주지 않는다.";
	       }
	       
	       int method(int x, int y){
	          return x+y;
	          }
	 
	       }
public class Child extends Parent {
	
  	   void childmethod() {
  		   System.out.println(var); // 부모 테이블에서 상속받은 String var
  		   System.out.println(method(7,13)); 
           // q부모 테이블에서 상속받은 int method()를 오버라이딩한것
  	   }
  		
        /* 오버라이딩: 
        부모 클래스로부터 상속받은 메서드의 내용을 변경하는것으로 
        메서드의 선언부는 부모의 것과 완전히 일치해야함
          이름, 파라미터, 반환타입 같아야함 */
          
         @Override 
  	   int method(int x, int y) {  
  			                     
  		   return x*y;
  		   
  	   }
  		
  		int var; // 인스턴스 변수
  		
  		void test(double var) {
  			System.out.println(var);       
            //메인메서드에서 test메서드를 호출하고 입력받은 파라미터값
  			System.out.println(this.var);  // 인스턴스 변수 int var
  			System.out.println(this.method(0, 20)); 
            // 오버라이딩한 자식 클래스 메서드 return x*y;
  			System.out.println(super.method(0, 20)); 
            // 부모 클래스 메서드 return x+y;
  		}
  		
  	
     }

위 코드에서 this.var는 인스턴스 변수 int var를 의미합니다.

this.method(0, 20)는 오버라이딩한 자식 클래스의 메서드 return x*y;

super.method(0, 20)는 부모 클래스의 메서드 return x+y;


2) 실행결과

public class test {

	public static void main(String[] args) {
		Child c = new Child();
		c.test(52);

	}

}

/* 실행결과
52.0
0
0
20 
*/
 

[this() 사용예- 자바의 정석 예제 6-2]

package OOP_6;

public class Exercise6_2 {

	public static void main(String[] args) {
		SutdaCard c1 = new SutdaCard(3,false) ; 
        ![](https://velog.velcdn.com/images%2Fvgo_dongv%2Fpost%2Fe877a7f4-0b6b-43cc-b6c8-efa0ab9302ac%2Fimage.png)// 기본 생성자
		SutdaCard c2 = new SutdaCard() ;
		
		System.out.println(c1.info());
		System.out.println(c2.info());

	}
	
	

}

class SutdaCard{
	int num; 
	boolean isKwang; // boolean의 기본값은 false

	SutdaCard(int num, boolean isKwang){ // 기본생성자
		this.num=num;
		this.isKwang=isKwang; 
	}
	
	SutdaCard(){
		this(1,true); 
        //this()는 같은 클래스의 다른 생성자를 호출한다.
		
	}
	
	/*
	 * SutdaCard(){
	 * 
	 *  this.num=1; this.isKwang=true;
	 * 
	 * } 로 쓰는것도 가능
	 */
	
	String info() {
		return num + (isKwang? "K":"");
	}
}
profile
삐약..뺙뺙

0개의 댓글