본문 바로가기

Java/문법

10 - 5장 super 키워드와 super() 메서드

- 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