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":"");
}
}