[Day 4 | Java] super

y♡ding·2024년 10월 17일
0

데브코스 TIL

목록 보기
18/163

🦸🏻 supersuper()

1️⃣ super: 부모의 필드나 메서드에 접근

super는 자식 클래스에서 부모 클래스의 멤버(필드나 메서드)에 접근할 때 사용한다. 자식 클래스에서 부모 클래스의 필드나 메서드가 자식 클래스에서 같은 이름으로 오버라이딩되었을 때, super를 사용하여 부모 클래스의 원본 멤버에 접근할 수 있다.

  • 부모 클래스의 필드메서드를 호출할 때 사용한다.
  • 주로 오버라이딩된 메서드필드에서 부모의 원래 동작을 유지하면서 자식 클래스에 추가적인 동작을 더할 때 사용한다.

super로 부모 메서드 호출

class Parent {
    void display() {
        System.out.println("부모 클래스의 display()");
    }
}

class Child extends Parent {
    void display() {
        System.out.println("자식 클래스의 display()");
        super.display(); // 부모 클래스의 display() 호출
    }
}

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

출력:

자식 클래스의 display()
부모 클래스의 display()

super로 부모 필드 접근

class Parent {
    String name = "Parent Name";
}

class Child extends Parent {
    String name = "Child Name"; // 부모 필드를 오버라이딩

    void showName() {
        System.out.println("자식 클래스 필드: " + this.name); // 자식 필드
        System.out.println("부모 클래스 필드: " + super.name); // 부모 필드
    }
}

public class Main {
    public static void main(String[] args) {
        Child c = new Child();
        c.showName();
    }
}

출력:

자식 클래스 필드: Child Name
부모 클래스 필드: Parent Name

2️⃣ super(): 부모 생성자 호출

super()부모 클래스의 생성자를 호출하는 역할을 한다. 자식 클래스의 생성자에서 부모 클래스의 생성자를 명시적으로 호출할 때 사용한다. 자식 클래스의 생성자가 호출되면 먼저 부모 클래스의 생성자가 실행되어야 부모 클래스의 필드가 올바르게 초기화된다.

  • 생성자의 첫 번째 줄에서만 호출할 수 있다. (다른 위치에서 호출하면 컴파일 에러 발생)
  • 부모 클래스의 디폴트 생성자가 자동으로 호출되지만, 부모 클래스에 매개변수가 있는 생성자를 호출하고 싶다면 super(매개변수) 형식으로 명시적으로 호출해야 한다.
  • 자식 클래스에서 생성자를 정의할 때 부모 클래스의 기본 생성자를 호출하는 super()는 생략할 수 있다. 그러나 부모 클래스에 기본 생성자가 없거나, 매개변수가 있는 생성자를 호출해야 하는 경우에는 반드시 명시적으로 super()를 사용해야 한다.

super() 기본 사용

class Parent {
    Parent() {
        System.out.println("Parent 생성자 호출");
    }
}

class Child extends Parent {
    Child() {
        super(); // 부모 클래스의 기본 생성자 호출
        System.out.println("Child 생성자 호출");
    }
}

public class Main {
    public static void main(String[] args) {
        Child c = new Child();
    }
}

출력:

Parent 생성자 호출
Child 생성자 호출

매개변수가 있는 super() 호출

class Parent {
    Parent(String name) {
        System.out.println("Parent 생성자 호출: " + name);
    }
}

class Child extends Parent {
    Child() {
        super("홍길동"); // 부모 클래스의 매개변수 생성자 호출
        System.out.println("Child 생성자 호출");
    }
}

public class Main {
    public static void main(String[] args) {
        Child c = new Child();
    }
}

출력:

Parent 생성자 호출: 홍길동
Child 생성자 호출

🥊 super()this()의 차이점

  • this(): 같은 클래스 내의 다른 생성자를 호출할 때 사용됨.
  • super(): 부모 클래스의 생성자를 호출할 때 사용됨.
class Parent {
    Parent(String name) {
        System.out.println("Parent 생성자 호출: " + name);
    }
}

class Child extends Parent {
    Child() {
        this("Child 호출");  // 같은 클래스의 다른 생성자 호출
    }

    Child(String name) {
        super(name);  // 부모 클래스의 생성자 호출
        System.out.println("Child 생성자 호출: " + name);
    }
}

public class Main {
    public static void main(String[] args) {
        Child c = new Child();
    }
}

출력:

Parent 생성자 호출: Child 호출
Child 생성자 호출: Child 호출

  • super(): 부모 클래스의 생성자를 호출한다. 자식 클래스의 생성자에서 부모 클래스의 디폴트 또는 매개변수 생성자를 호출할 때 사용한다.

  • super: 부모 클래스의 필드나 메서드에 접근할 때 사용한다. 자식 클래스에서 오버라이딩된 메서드나 필드를 호출할 때 유용하다.

  • 부모 클래스의 생성자는 항상 자식 클래스 생성자에서 먼저 호출되므로, 자식 클래스의 생성자 첫 줄에서 super()를 사용해 부모 생성자를 명시적으로 호출할 수 있다.

0개의 댓글

관련 채용 정보