본문 바로가기

JAVA/JAVA

자바 개념 - super, super() 비교 설명

반응형

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

super 

: 부모클래스 멤버에 접근하고자 할 때 사용

super()

: 부모클래스의 생성자를 요구 할 때 사용 ==> 반드시 첫번째 문장에 와야 한다


<예제순서>

1. super 의 예(접근)

2. super() 의 예(호출)

3. 항상 상속클래스의 생성자안에 super() 가 생략되있다는 것 설명

4. 밑에 예제는 생성자의 기본생성자 관련


<코드1>

class Human{

public String toString(){

}

}


class Student extends Human{

public String toString(){

return super.toString() + " ";

}

}



<코드2>

class Human{

public void info(){

}

}


class Student extends Human{

public void pro(){

info(); // 호출 하게 되면 재정의한 info()가 우선순위가 된다.

super.info(); // super를 붙이면 부모클래스에 있는 info()가 호출된다.

}

public void info(){

}

}



<코드3>

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) 처럼 부모클래스에 정의된 생성자에 맞도록 호출해 주어야 한다


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


반응형