9. Inheritance
객체 지향 프로그래밍에서 상속은 클래스 간의 관계를 설정하고, 코드 재사용을 통해 효율성을 높이는 중요한 개념입니다. 이번 포스트에서는 상속의 주요 개념과 사용법을 정리해보았습니다.
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() 키워드는 부모 클래스의 생성자를 명시적으로 호출할 때 사용합니다.