객체 지향 프로그래밍에서 상속은 클래스 간의 관계를 설정하고, 코드 재사용을 통해 효율성을 높이는 중요한 개념입니다. 이번 포스트에서는 상속의 주요 개념과 사용법을 정리해보았습니다.

1. 개념 정리

1.1 상속받은 클래스의 Stack과 Heap

  • Stack: 메서드 호출 시 생성되는 지역 변수들은 스택 메모리에 저장됩니다.
  • Heap: 객체의 인스턴스는 힙 메모리에 할당됩니다. 상속받은 클래스의 객체는 부모 클래스의 필드를 포함한 형태로 힙에 저장됩니다.

1.2 다중 상속

  • 자바는 다중 상속을 지원하지 않습니다. 즉, 하나의 클래스가 여러 클래스를 상속받을 수 없습니다.
  • 그러나 인터페이스는 다중 상속을 보완하는 기능을 사용할 순 있습니다.

1.3 super() 키워드

  • super()는 부모 클래스의 생성자를 호출하는 키워드입니다. 자식 클래스의 생성자에서 부모 클래스의 생성자를 명시적으로 호출할 수 있습니다.
  • 부모 클래스의 생성자는 super()를 통해 호출되며, 자식 클래스의 생성자 내부에서 첫 번째로 호출해야 합니다.
class Animal {
    public Animal() {
        System.out.println("Animal 생성자 호출");
    }
}

class Dog extends Animal {
    public Dog() {
        super(); // 부모 클래스의 생성자 호출
        System.out.println("Dog 생성자 호출");
    }
}

1.4 부모, 자식 클래스 간의 기본 호출 vs 명시적 호출

  • 기본 호출: 자식 클래스의 생성자는 부모 클래스의 생성자를 자동으로 호출합니다. 부모 클래스에 생성자가 없으면 컴파일러가 기본 생성자를 자동으로 호출합니다.
  • 명시적 호출: 부모 클래스의 생성자를 super()로 명시적으로 호출할 수 있습니다. 이 때, 부모 클래스의 생성자는 자식 클래스 생성자의 첫 줄에서 호출되어야 합니다.

1.5 오버라이딩

  • 오버라이딩(Overriding): 부모 클래스의 메서드를 자식 클래스에서 재정의하여 사용하는 기법입니다.
  • 부모 클래스의 메서드가 public, protected, default 접근 제어자를 가질 때 오버라이딩할 수 있습니다.
  • 오버라이딩 메서드는 부모 클래스와 같은 메서드 시그니처(메서드명, 매개변수의 타입, 순서, 개수)를 가져야 합니다.
class Animal {
    public void sound() {
        System.out.println("동물이 소리를 낸다.");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("개가 멍멍 소리를 낸다.");
    }
}

2. 상속의 활용

  • 상속을 통해 코드 재사용유지보수성을 향상시킬 수 있습니다.
  • 자식 클래스에서 부모 클래스의 기능을 확장하거나 수정할 수 있어 유연한 설계를 할 수 있습니다.
  • 다만, 다중 상속을 피하고, 인터페이스를 활용하여 의존성을 관리하는 것이 좋습니다.

3. 결론

  • 자식 클래스는 부모 클래스의 필드와 메서드를 상속받으며, 이를 통해 코드의 중복을 줄이고 재사용할 수 있습니다.
  • 오버라이딩을 통해 부모 클래스의 메서드를 자식 클래스에서 변경하여 새로운 동작을 정의할 수 있습니다.
  • super() 키워드는 부모 클래스의 생성자를 명시적으로 호출할 때 사용합니다.