카테고리 없음

Java super란? super()차이

끄적잉 2024. 6. 3. 22:22
반응형

Java에서 `super` 키워드는 클래스 상속과 관련하여 부모 클래스(슈퍼클래스)의 멤버(필드, 메서드)를 참조하거나 부모 클래스의 생성자를 호출할 때 사용됩니다. `super` 키워드는 자식 클래스(서브클래스)에서 부모 클래스의 기능을 확장하거나 재사용할 때 매우 유용합니다. 아래에서는 `super` 키워드의 사용법과 예제를 통해 자세히 설명하겠습니다.

 


### 1. 기본 개념

#### 1.1 부모 클래스(슈퍼클래스)와 자식 클래스(서브클래스)
자바에서 클래스는 다른 클래스를 상속받을 수 있습니다. 이때 상속받는 클래스는 '자식 클래스' 혹은 '서브클래스'라 불리며, 상속해주는 클래스는 '부모 클래스' 혹은 '슈퍼클래스'라고 합니다. 상속을 통해 자식 클래스는 부모 클래스의 필드와 메서드를 물려받아 사용할 수 있습니다.

 


#### 1.2 super 키워드
`super`는 자식 클래스에서 부모 클래스의 멤버를 참조할 때 사용합니다. 주로 다음과 같은 경우에 사용됩니다:
1. 부모 클래스의 멤버 변수(필드)에 접근할 때
2. 부모 클래스의 메서드를 호출할 때
3. 부모 클래스의 생성자를 호출할 때

 


### 2. super의 사용법

#### 2.1 부모 클래스의 필드 참조
자식 클래스에서 부모 클래스와 동일한 이름의 필드를 가질 때 `super`를 사용하여 부모 클래스의 필드에 접근할 수 있습니다.

 


```java
class Parent {
    int num = 100;
}

class Child extends Parent {
    int num = 200;

    void display() {
        System.out.println("Child num: " + num);
        System.out.println("Parent num: " + super.num);
    }
}

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

이 예제에서 `Child` 클래스는 `Parent` 클래스와 같은 이름의 `num` 필드를 가지고 있습니다. `super.num`을 사용하여 부모 클래스의 `num` 필드에 접근할 수 있습니다.

 

 


#### 2.2 부모 클래스의 메서드 호출
자식 클래스에서 부모 클래스와 동일한 이름의 메서드를 가질 때 `super`를 사용하여 부모 클래스의 메서드를 호출할 수 있습니다.

```java
class Parent {
    void display() {
        System.out.println("Display method in Parent class");
    }
}

class Child extends Parent {
    void display() {
        System.out.println("Display method in Child class");
        super.display();
    }
}

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

이 예제에서 `Child` 클래스는 `Parent` 클래스와 동일한 이름의 `display` 메서드를 오버라이드합니다. `super.display()`를 사용하여 부모 클래스의 `display` 메서드를 호출할 수 있습니다.

 

반응형


#### 2.3 부모 클래스의 생성자 호출
자식 클래스의 생성자에서 부모 클래스의 생성자를 호출할 때 `super`를 사용할 수 있습니다. 이는 주로 부모 클래스에서 초기화가 필요한 멤버 변수를 초기화하기 위해 사용됩니다.

```java
class Parent {
    Parent() {
        System.out.println("Parent class constructor");
    }

    Parent(String msg) {
        System.out.println("Parent class constructor with message: " + msg);
    }
}

class Child extends Parent {
    Child() {
        super("Hello from Child");
        System.out.println("Child class constructor");
    }
}

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

이 예제에서 `Child` 클래스의 생성자는 `super("Hello from Child")`를 통해 부모 클래스의 생성자 `Parent(String msg)`를 호출합니다.

 

 


### 3. 예제 및 심화

#### 3.1 구체적인 예제

```java
class Animal {
    String name;

    Animal(String name) {
        this.name = name;
    }

    void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    Dog(String name) {
        super(name); // 부모 클래스의 생성자 호출
    }

    @Override
    void sound() {
        super.sound(); // 부모 클래스의 sound 메서드 호출
        System.out.println(name + " barks");
    }
}

public class Main {
    public static void main(String[] args) {
        Dog dog = new Dog("Buddy");
        dog.sound();
    }
}
```

 

 


이 예제에서 `Dog` 클래스는 `Animal` 클래스를 상속받습니다. `Dog` 클래스의 생성자는 부모 클래스의 생성자를 호출하여 `name`을 초기화합니다. `sound` 메서드를 오버라이드하고 `super.sound()`를 통해 부모 클래스의 `sound` 메서드를 호출합니다.

 

 


#### 3.2 심화: super 키워드의 중요성

`super` 키워드는 객체 지향 프로그래밍에서 매우 중요합니다. 이를 통해 자식 클래스는 부모 클래스의 메서드와 필드를 재사용하고 확장할 수 있습니다. 또한, 코드의 중복을 줄이고 유지보수를 쉽게 만들어줍니다.

예를 들어, 큰 프로젝트에서 여러 클래스가 공통된 기능을 공유해야 할 때, 부모 클래스에 공통 기능을 구현하고 자식 클래스에서 이를 재사용할 수 있습니다. 이는 코드의 일관성을 유지하고 오류를 줄이는 데 도움이 됩니다.

 

 


### 4. 결론

`super` 키워드는 자바의 상속 메커니즘에서 중요한 역할을 합니다. 이를 통해 자식 클래스는 부모 클래스의 필드와 메서드를 참조하고, 부모 클래스의 생성자를 호출할 수 있습니다. `super`를 사용하면 코드의 재사용성과 유지보수성을 높일 수 있으며, 객체 지향 프로그래밍의 원칙을 따르는 데 큰 도움이 됩니다. 다음은 `super` 키워드를 사용하는 주요 상황을 요약한 것입니다:

1. **부모 클래스의 필드 참조**: 자식 클래스와 부모 클래스가 동일한 이름의 필드를 가질 때, 부모 클래스의 필드를 참조할 수 있습니다.
2. **부모 클래스의 메서드 호출**: 자식 클래스에서 부모 클래스와 동일한 이름의 메서드를 오버라이드할 때, 부모 클래스의 메서드를 호출할 수 있습니다.
3. **부모 클래스의 생성자 호출**: 자식 클래스의 생성자에서 부모 클래스의 생성자를 호출하여 부모 클래스의 초기화 과정을 재사용할 수 있습니다.

이러한 사용법을 잘 이해하고 활용하면, 더 효율적이고 유지보수하기 쉬운 객체 지향 프로그램을 작성할 수 있습니다.

반응형