this는 현재 클래스의 인스턴스를 의미한다. 자신의 객체를 참조하는 참조 변수이다. 인스턴스 변수와 지역 변수의 이름이 같을 때, 인스턴스 변수를 즉, 현재 클래스의 멤버변수를 지정할때 사용한다.
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public void printName() {
System.out.println("My name is " + this.name);
}
}
위 코드에서 this.name은 인스턴스 변수인 name을 나타낸다.
현재 클래스에 정의된 생성자를 부를때 사용된다.
public class Person {
private String name;
private int age;
public Person(String name) {
this.name = name;
this.age = 0;
}
public Person(String name, int age) {
this(name); // 다른 생성자를 호출합니다.
this.age = age;
}
// ... 이하 생략
}
위 코드에서 Person 클래스는 2개의 생성자를 가지고 있다. 첫 번째 생성자는 이름을 입력받아 name 인스턴스 변수에 저장하고, age를 0으로 초기화한다. 두 번째 생성자는 이름과 나이를 입력받아 name과 age 인스턴스 변수에 저장한다. 두 번째 생성자에서 첫 번째 생성자를 호출하고, 이름을 전달하여 중복되는 코드를 제거한다. this(name)은 인자로 받은 name을 갖는 첫 번째 생성자를 호출하는 구문이다.
super는 자식 클래스에서 상속받은 부모 클래스의 멤버변수를 참조할때 사용된다.
class Student extends Person {
private int studentId;
public Student(String name, int studentId) {
super(name);
this.studentId = studentId;
}
public void printStudentInfo() {
super.printName();
System.out.println("My student ID is " + this.studentId);
}
}
위 코드에서 super.printName()은 부모 클래스인 Person 클래스의 printName() 메서드를 호출한다.
super()는 부모 클래스의 생성자를 호출하는 데 사용된다. 자식 클래스에서 부모 클래스의 생성자를 호출할 때, super()를 사용하여 부모 클래스의 생성자를 호출할 수 있다.
기본적으로 자식 클래스의 생성자에 추가된다.
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
}
public class Dog extends Animal {
private String breed;
public Dog(String name, String breed) {
super(name); // 부모 클래스의 생성자 호출
this.breed = breed;
}
public Dog(String breed) {
this("unknown", breed); // 다른 생성자 호출
}
}
위 코드에서 Animal 클래스는 이름을 입력받아 name 인스턴스 변수에 저장하는 생성자를 가지고 있다. Dog 클래스는 Animal 클래스를 상속받으며, 이름과 견종을 입력받아 부모 클래스의 생성자를 호출하여 name 인스턴스 변수에 저장하고, breed 인스턴스 변수에 저장한다. 또한 견종만 입력받는 생성자를 추가하며, this("unknown", breed)를 사용하여 이름을 "unknown"으로 초기화하고, breed를 인스턴스 변수에 저장한다. super(name)은 부모 클래스인 Animal 클래스의 생성자를 호출하는 구문이다.