- this , this() : 클래스 자신의 내부 구성 요소를 호출하는 문법 요소
- this
-> 자신의 객체
-> 인스턴스 메서드 내부에서 필드를 사용하거나 메서드를 호출할 때 참조변수명으로 사용
-> 생략했을 때 컴파일러가 자동으로 추가
- this() 메서드
-> 자신의 생성자
-> 자신의 또 다른 생성자를 호출하고, 생성자 내에서만 사용 가능
-> 항상 첫줄에 위치
1. 부모의 객체를 가리키는 super 키워드
- 필드명의 중복 또는 메서드 오버라이딩으로 가려진 부모의 필드 또는 메서드를 호출하기 위해 사용
1) 멤버 앞에 있는 참조 변수를 생략(this.)했을 때의 메서드 호출
package SuperKeyword;
class A {
void abc() {
System.out.println("A 클래스의 abc()");
}
}
class B extends A {
void abc() {
System.out.println("B 클래스의 abc()");
}
void bcd() {
abc(); //this.abc();
//인스턴스 메서드의 내부에서 모든 필드와 메서드 앞에 있는 객체를 생략하면 this 키워드 추가
}
}
public class SuperKeyword {
public static void main(String[] args) {
//객체 생성
B bb = new B();
//메서드 호출
bb.bcd();
}
}
- 클래스 A에 abc() 메서드 1개
- 상속한 클래스 B에서는 abc() 메서드를 오버라이딩하고, 추가로 bcd() 메서드 생성
- bcd() 메서드에서는 abc() 메서드를 호출
- bcd()메서드를 호출하면 this.abc()가 실행
2) 멤버 앞에 있는 super 키워드를 사용했을 때의 메서드 호출
package SuperKeyword;
class A {
void abc() {
System.out.println("A 클래스의 abc()");
}
}
class B extends A {
void abc() {
System.out.println("B 클래스의 abc()");
}
void bcd() {
super.abc(); // 부모 클래스 객체의 abc() 메서드 호출
}
}
public class SuperKeyword2 {
public static void main(String[] args) {
//객체 생성
B bb = new B();
//메서드 호출
bb.bcd();
}
}
- 부모 클래스의 abc()를 자식 클래스에서 호출
- super 키워드가 사용되는 예
class A {
void init() {
// 메모리 할당, 화면 세팅, 변수 초기화 등의 코드 100줄
}
}
class B extends A {
void init() {
// 메모리 할당, 화면 세팅, 변수 초기화 등의 코드 100줄
// 화면 출력 코드 1줄
}
class C extends A {
void init() {
super.init();
//화면 출력 코드 1줄
}
}
- super 키워드를 사용하면 자식 클래스의 메서드에서 부모 클래스의 메서드를 호출하고, 추가할 코드 1줄만 따로 작성 가능
2. 부모 클래스의 생성자를 호출하는 super() 키워드
- 모든 생성자의 첫줄에는 반드시 this() 또는 super()가 있어야 함
- 아무것도 쓰지 않으면 컴파일러는 super()을 자동으로 생성
-> 자식 클래스의 생성자로 객체를 생성할 때 부모 클래스의 객체가 만들어지는 이유
1) super()을 이용한 부모 클래스 생성자 호출
class A {
A() {
System.out.println("A 생성자");
}
}
class B extedns A {
B() {
super();
System.out.println("B 생성자");
}
}
- B b = new B(); -> A 생성자 B 생성자
- B() 생성자를 이용해 객체를 생성할 때는 가장 먼저 super() 메서드를 실행
- A() 먼저 실행 -> super()는 부모의 생성자를 호출함
- A() 생성자의 실행이 완료되면 메모리에는 A 객체가 생성됨
- 값이 "A 생성자", "B 생성자" 순으로 출력
2) super() 메서드의 기능 및 컴파일러에 따라 super() 자동 추가
- super()의 자동 추가 확인
class A {
A(int a) {
System.out.println("A 생성자");
}
}
class B extends A {
} // 오류 발생
- 클래스 B 안에는 생성자가 없으므로 컴파일러가 super() 추가
- super()는 부모의 기본 생성자, 즉 A()를 호출하라는 의미
But 클래스 A는 기본 생성자를 포함 X -> 오류 발생
package SuperKeyword;
class A {
A() {
System.out.println("A 생성자");
}
}
class B extends A {
B() {
super(); //생략했을 때 컴파일러가 자동 추가 (부모 클래스의 생성자 호출)
System.out.println("B 생성자");
}
}
class C {
C(int a) {
System.out.println("C 생성자");
}
}
class D extends C {
D() {
super(3);
}
}
public class SuperKeyword3 {
public static void main(String[] args) {
//A 객체 생성
A aa = new A();
System.out.println();
//B 객체 생성
B bb = new B();
}
}
3) this() 메서드와 super() 메서드의 혼용
package SuperKeyword;
class A{
A() {
this(3);
System.out.println("A 생성자1");
}
A(int a) {
System.out.println("A 생성자2");
}
}
class B extends A {
B() {
this(3);
System.out.println("B 생성자1");
}
B(int a) {
System.out.println("B 생성자2");
}
}
public class SuperKeyword4 {
public static void main(String[] args) {
//A 객체 생성
A aa1 = new A();
System.out.println();
A aa2 = new A();
System.out.println();
//B 객체 생성
B bb1 = new B();
System.out.println();
B bb2 = new B();
}
}
- B bb1 = new B()
1. 부모의 기본 생성자인 A() 먼저 호출 -> A생성자2, A 생성자1
2. this(3); -> B생성자2
3. System.out.println("B 생성자2"); -> B 생성자1
'Java > 문법' 카테고리의 다른 글
15 - 5장 쓰레드의 상태 (0) | 2023.06.15 |
---|---|
10 - 6장 최상위 클래스 Object (0) | 2023.06.01 |
10-4장 인스턴스 필드와 정적 멤버의 중복 (0) | 2023.06.01 |
10-3장 메서드 오버라이딩 (0) | 2023.05.04 |
10-2장 객체의 타입 변환 (0) | 2023.05.04 |