언어/Script Question

super() & super

MellowHoney 2024. 4. 7. 14:10
728x90
반응형

super

  • 자신이 상속받은 부모를 가리키는 참조 변수
  • 자식과 부모사이의 구분에 사용
    class Object{
    	int a;
    }

    class A extends Object{
    	int a;
    }

    public static void main(String args[]){
    	A ins = new A();
        ins.a=2 // 여기서 a는 A의 a. 즉, 자식의 변수이다
        // 만약 자식에게 a라는 변수가 없었다면 부모의 a를 가리켰을 것이다.
        // 여기서 자식 a가 아닌 부모의 a로 접근하고 싶다면?

        ins.super.a = 20; // 이렇게 super라는 참조 변수를 사용해서 부모의 a에 접근할 수 있다
    }
    // 위와 같은 이유로 자바에서는 다중 상속이 불가능하다 (상속의 모호성)
	//예제2
	class Parent {
    	int a = 10;
	}

	class Child extends Parent {
    	int a = 20;

    	void display() {
        	System.out.println(a);
        	System.out.println(this.a); // 자식
        	System.out.println(super.a); // 부모
    	}
	}

	public class Inheritance03 {
    	public static void main(String[] args) {
        	Child ch = new Child();
        	ch.display();
    	}
	}

super()

  • 자신이 상속받은 부모의 생성자를 호출하는 메소드
  • 부모클래스에 기본 생성자가 아닌 매개변수를 가지는 생성자가 있다면(=부모클래스에서 생성자가 오버로딩되면) 자동으로 추가되지 않음 (=묵시적 제공을 하지 않음) 이럴 때 사용

예문

 class Parent{
     int a;
     Parent(int n){a=n;};
 }

 class Child extends Parent(){
     int b;
     Child(){
         super()
         b=20;
     }
 }

1. 부모클래스에 기본 생성자 선언 (명시된 문제 그대로의 해결)

class Parent{
    int a;
    Parent(){a=10;};
    Parent(int n){a=n;};
}

class Child extends Parent(){
    int b;
    Child(){
        super();
        b=20;
    }
}

2. 오버로딩된 생성자에 맞춰 super()의 인자를 맞춰줌 (합리적 해결👍🏻)

class Parent{
    int a;
    Parent(int n){a=n;};
}

class Child extends Parent(){
    int b;
    Child(){
        super(40);
        b=20;
    }
}
반응형