this와 this()는 클래스 내부에서 사용된다. 두 this의 차이점에 대해서 알아보자
클래스 내부에서 인스턴스가 자기자신을 참조할 때 사용하는 참조변수다. this는 자신 인스턴스의 주소를 가르킨다.
public class Main {
Frog keroro = new Frog("keroro", 100);
}
}
class Frog {
String name;
int age;
Frog(String name, int age){ // 생성자
this.name = name;
this.age = age;
}
}
예시 코드의 동작
keroro와 100을 인수로 넘겨줬다.keroro)과 age(100)을 자기 자신의 멤버 name과 age에 초기화한다.this 특징
this()는 같은 클래스에서 생성자가 다른 생성자를 호출할 때 사용한다.
public class Main {
Frog keroro = new Frog("keroro");
}
}
class Frog {
String name;
int age;
Frog(String name) { // 생성자 1
this(name, 0)
}
Frog(String name, int age){ // 생성자 2
this.name = name;
this.age = age;
}
}
예시 코드의 동작
keroro를 인수로 넘겨줬다.name과 0을 인수로 넘겨준다.특징
super와 super()도 this와 this()의 차이와 같다. 대신 super은 상속 받은 부모클래스에 접근한다는 것이 차이점이다.
super 참조 변수를 사용하여 부모 클래스 멤버에 접근할 수 있다.
this키워드와 마찬가지로 클래스 자신의 멤버 이름과 부모 클래스의 멤버 이름이 같을 때 구분하기 위해 사용한다.
class super {
int a = 10;
}
class serve extends super {
int a = 100;
void printA () {
System.out.println(this.a);
System.out.println(super.a);
}
}
출력
100
10
this()와 마찬가지로 부모 클래스의 생성자를 호출하는 메서드다.
자식 클래스의 인스턴스를 생성하면, 그 인스턴스에는 자식 클래스의 멤버와 부모 클래스의 멤버까지 포함되어있다.
이 때 부모 클래스의 멤버를 초기화하기 위해서는 super() 메서드로 부모 클래스의 생성자를 호출하여 초기화해야한다.
특징
자식 클래스에서 부모 클래스 생성자를 호출하지 않으면 자동으로 부모 클래스의 기본 생성자를 호출한다. (부모 클래스에 기본 생성자가 없다면 오류가 발생한다.)
super() 역시 첫줄에 사용되어야 한다.
예시 코드
class super {
int a = 0;
super(int i){ // 생성자
a = i;
}
}
class serve extends super {
int b;
serve() { // 생성자
super(10)
b = 100;
}
void printAB(){
System.out.println(a);
System.out.println(b);
}
}
출력
10
100