상속이란 부모 클래스의 속성과 메서드를 자식 클래스가 물려받는 기능이다.
class Animal {
void eat() {
System.out.println("먹는다");
}
}
class Dog extends Animal {
void bark() {
System.out.println("짖는다");
}
}
public class Main {
public static void main(String[] args) {
Dog d = new Dog();
d.eat(); // 부모 클래스 메서드 사용
d.bark(); // 자식 클래스 메서드 사용
}
}
위 예제에서 Dog 클래스는 Animal 클래스를 상속받아 eat() 메서드를 사용할 수 있다.
class 부모클래스 {
// 필드, 생성자, 메서드
}
class 자식클래스 extends 부모클래스 {
// 자식 클래스만의 필드, 생성자, 메서드
}
extends 키워드를 사용해 상속을 구현한다.
자식 클래스는 부모 클래스의 필드와 메서드를 그대로 사용할 수 있다.
단, 생성자는 상속되지 않는다.
자식 클래스는 부모 클래스의 메서드를 재정의(override)할 수 있다.
class Animal {
void sound() {
System.out.println("동물 소리");
}
}
class Cat extends Animal {
@Override
void sound() {
System.out.println("야옹");
}
}
@Override는 컴파일러에게 재정의했음을 알리는 어노테이션이다. (선택은 아니고 권장)
오버라이딩 시에는 메서드 시그니처가 동일해야 한다.
Java에서는 클래스 간 다중 상속은 지원하지 않는다.
class A { }
class B { }
// ❌ Error: Java does not support multiple inheritance
class C extends A, B { }
이러한 문제를 해결하기 위해 Java는 인터페이스를 제공한다. (implements 키워드 사용)
자식 클래스에서 부모 클래스의 멤버를 명시적으로 사용할 때 super를 사용한다.
class Animal {
void sound() {
System.out.println("동물 소리");
}
}
class Dog extends Animal {
void sound() {
super.sound(); // 부모 메서드 호출
System.out.println("멍멍");
}
}
또한, 생성자에서 부모 생성자를 호출할 때도 super()를 사용한다.
✔️ 장점
코드 재사용 → 중복 감소
유지보수 용이
다형성 구현 가능
❗ 단점
관계가 너무 복잡해질 수 있음
잘못 사용하면 의존성이 강해져 유지보수가 어려워짐
상속은 "공통 기능은 부모에게, 특수 기능은 자식에게"라는 원칙으로 객체지향의 핵심을 실현하는 도구.