본문 바로가기

BackEnd/Java

super, 부모를 가리키는 예약어

** super, super()를 비교하여 설명하시오

super : 부모클래스 멤버에 접근하고자 할 때 사용
super() : 부모클래스의 생성자를 요구 할 때 사용 => 반드시 첫번째 문장에 와야 함

 

 

<코드1 - super 접근의 예문>

 

class Human{
	public String toString() {
	
	}
}

class Student extends Human {
	public String toString() {
		return super.toString() + " ";
	}
}

 

 

<코드2 - super() 호출의 예문>

 

class Human {
	public void info() {
	
	}
}

class Student extends Human {
	public void pro() {
		info(); // 호출 하게 되면 재정의한 info()가 우선순위가 된다.
		super.info(); // super를 붙이면 부모클래스에 있는 info()가 호출된다.
	}

	public void info() {

	}
}

 

 

<코드3 - 상속해주는 클래스 내부엔 항상 super()가 있지만 생략되어 있음>

 

class Human{
	public Human() {

	}
}

class Student extends Human {
	public Student() {

		/* body 에 아무것도 안써도 super(); 가 생략되어 있는 것이다
		그렇기에 밑에처럼 출력하면 저렇게 나옴 */

	}
}

Student s = new Student();
// 별다른 문장이 없어도 부모클래스인 Human 생성자가 먼저 동작하고 그다음 상속받은 자식 클래스가 동작하게 된다

 

 

<코드4 - 기본생성자>

 

class Human {
	public Human(String name, int age) {
		/* public Human() {} */
	}
}

class Student extends Human {
	public Student() {
	// super("홍길동",20);
	// super() 가 생략 
	}
}

Student s = new Student();

 

에러 발생!

Human 클래스에서 사용자가 매개변수를 갖는 생성자를 정의하게 되면 자바는 더이상 기본생성자를 제공하지 않는다

그러나 Student 생성자에서는 부모클래스인 Human의 기본생성자를 요구하기 때문에 

오류가 발생한다

이를 해결하기 위해 부모클래스인 Human에 기본생성자를 정의하거나 혹은 Student 생성자 내에서 

super("홍길동",20) 처럼 부모클래스에 정의된 생성자에 맞도록 호출해 주어야 한다

=> 자식클래스의 생성자에서는 묵시적으로 부모의 기본생성자를 요구한다

'BackEnd > Java' 카테고리의 다른 글

상속 (Inheritance)  (0) 2020.03.16
기본형 변수와 참조형 변수의 차이  (0) 2020.03.16
this, 자신을 가리키는 예약어  (0) 2020.02.12
생성자 (Constructor)  (0) 2020.02.12
패키지(Package)와 import  (0) 2020.02.11