Java 상속(Inheritance) 완벽 이해하기
객체지향 프로그래밍(OOP)을 배우면 반드시 등장하는 개념이 바로:
상속(Inheritance)
입니다.
초보 시절에는 보통:
extends
문법 정도로만 이해하고 넘어가기 쉽습니다.
하지만 실제 상속은 단순 문법이 아니라:
- 코드 재사용
- 타입 계층 구조
- 다형성
- 객체 설계
- 프레임워크 구조
와 깊게 연결됩니다.
실무에서도:
- Spring Security
- Exception 구조
- Collection Framework
- JPA Entity
등 매우 많은 곳에서 상속 구조가 사용됩니다.
하지만 상속은 잘못 사용하면:
- 강한 결합
- 유지보수 어려움
- extends 지옥
을 만들 수도 있습니다.
이번 글에서는:
- 상속이 왜 필요한가
- extends의 진짜 의미
- 메모리 구조
- 메서드 오버라이딩
- super 동작 방식
- 상속의 장단점
- 실무에서 왜 상속보다 조합을 선호하는가
까지 정리해보겠습니다.
1. 상속(Inheritance)이란?
Object-Oriented Programming 에서 상속은:
기존 클래스의 속성과 기능을 새로운 클래스가 물려받는 것
입니다.
예시:
class Animal {
void eat() {
System.out.println("먹는다");
}
}
class Dog extends Animal {
}
Dog는 Animal 기능을 상속받습니다.
2. extends 의미
class Dog extends Animal
의미:
Dog is a Animal
즉:
Dog는 Animal의 일종
이라는 관계입니다.
3. 상속을 왜 사용할까?
상속이 없다면:
class Dog {
void eat() {}
}
class Cat {
void eat() {}
}
중복 코드 발생.
상속 사용 시:
class Animal {
void eat() {}
}
공통 기능 재사용 가능.
4. 상속의 핵심 목적
상속의 핵심 목적은:
공통 기능 재사용
+
타입 계층 구조 생성
입니다.
5. 부모 클래스(Parent Class)
class Animal {
}
- Super Class
- Parent Class
- Base Class
라고 부릅니다.
6. 자식 클래스(Child Class)
class Dog extends Animal {
}
- Sub Class
- Child Class
- Derived Class
라고 부릅니다.
7. 상속 시 메모리 구조
예시:
Dog dog = new Dog();
메모리 구조:
Heap:
Dog 객체 내부에
Animal 영역 포함
즉:
Dog + Animal
구조로 생성됩니다.
8. 생성자 호출 순서
매우 중요합니다.
예시:
class Animal {
Animal() {
System.out.println("Animal");
}
}
class Dog extends Animal {
Dog() {
System.out.println("Dog");
}
}
실행:
new Dog();
결과:
Animal
Dog
9. 왜 부모 생성자가 먼저 실행될까?
자식 객체 내부에는:
부모 영역 포함
되어 있기 때문입니다.
즉 부모 부분 먼저 초기화 필요.
10. super()
생성자에서 부모 생성자 호출.
class Dog extends Animal {
Dog() {
super();
}
}
실제로는:
super()
가 자동 삽입됩니다.
11. 부모 생성자 매개변수 전달
class Animal {
Animal(String name) {
}
}
class Dog extends Animal {
Dog() {
super("dog");
}
}
12. 메서드 상속
class Animal {
void eat() {
System.out.println("먹는다");
}
}
Dog에서 그대로 사용 가능.
Dog dog = new Dog();
dog.eat();
13. 메서드 오버라이딩(Overriding)
자식 클래스가 부모 메서드를 재정의.
class Animal {
void sound() {
System.out.println("동물 소리");
}
}
class Dog extends Animal {
@Override
void sound() {
System.out.println("멍멍");
}
}
14. @Override 사용하는 이유
컴파일러 검증 가능.
오타 방지 매우 중요.
실무에서는 거의 필수.
15. 오버라이딩 조건
| 메서드 이름 동일 | 필수 |
| 매개변수 동일 | 필수 |
| 반환 타입 동일/하위 | 가능 |
16. 접근제어자 규칙
오버라이딩 시:
접근 범위를 더 좁게 불가능
예:
public -> private
불가능.
17. final 메서드는 오버라이딩 불가
final void hello()
상속은 되지만 재정의 불가능.
18. super 키워드
부모 객체 접근.
super.sound();
부모 메서드 호출 가능.
19. 변수 hiding
변수는 오버라이딩되지 않습니다.
예시:
class Parent {
int value = 10;
}
class Child extends Parent {
int value = 20;
}
20. 다형성과 상속
상속의 진짜 핵심은:
다형성 기반 구조
입니다.
예시:
Animal animal = new Dog();
부모 타입으로 자식 객체 처리 가능.
21. 업캐스팅(Upcasting)
Animal animal = new Dog();
자동 형변환 발생.
실무에서 매우 중요.
22. 다운캐스팅(Downcasting)
Dog dog = (Dog) animal;
명시적 형변환 필요.
주의하지 않으면:
ClassCastException
발생 가능.
23. instanceof
객체 타입 확인.
if (animal instanceof Dog)
24. Java는 다중 상속 불가능
class A extends B, C
불가능.
왜냐하면:
Diamond Problem
문제 때문.
25. Diamond Problem이란?
부모 두 개가 같은 메서드 제공 시:
어느 메서드 사용할지 모호
문제 발생.
Java는 이를 방지하기 위해:
클래스 다중 상속 금지
채택.
26. 대신 Interface 사용
Java는:
다중 구현
허용.
class Dog implements Runnable, Serializable
27. 상속의 장점
| 코드 재사용 | 공통 기능 활용 |
| 유지보수성 | 공통 수정 가능 |
| 다형성 | 유연한 구조 |
| 계층 구조 | 역할 표현 가능 |
28. 상속의 단점
| 강한 결합 | 부모 변경 영향 큼 |
| 구조 복잡화 | 계층 깊어짐 |
| 유연성 감소 | 재사용 어려움 |
29. 실무에서 상속 남용 문제
예시:
BaseUser
↓
AdminUser
↓
SuperAdminUser
↓
MasterAdminUser
이런 구조는 유지보수 지옥 가능.
30. 상속보다 조합(Composition) 선호
실무에서는:
has-a 관계
를 더 선호.
예시:
class Car {
Engine engine;
}
즉:
Car has a Engine
관계.
31. 언제 상속을 써야 할까?
진짜:
is-a 관계
일 때만 사용하는 것이 좋습니다.
예:
Dog is a Animal
32. 상속의 진짜 핵심
상속의 핵심은 단순 재사용이 아니라:
다형성 기반 설계
입니다.
Spring, JPA, Collection Framework 전부 이 개념 위에서 동작합니다.
33. 정리
상속(Inheritance)은 단순히:
extends 사용하는 기술
이 아닙니다.
실제로는:
- 코드 재사용
- 타입 계층 구조
- 다형성
- 객체 협력
- 유연한 설계
를 위한 핵심 객체지향 개념입니다.
특히 실무에서는:
- 오버라이딩
- super
- 다형성
- 상속보다 조합
을 이해하는 것이 매우 중요합니다.
다음 글에서는:
다형성(Polymorphism)
을 JVM 메서드 디스패치와 Spring 구조까지 포함해서 정리해보겠습니다.
'language > java' 카테고리의 다른 글
| Java 추상 클래스(Abstract Class) vs 인터페이스(Interface) 완벽 이해하기 (0) | 2026.05.22 |
|---|---|
| Java 다형성(Polymorphism) 완벽 이해하기 (0) | 2026.05.22 |
| Java 캡슐화(Encapsulation) 완벽 이해하기 (0) | 2026.05.22 |
| 객체지향 프로그래밍(OOP) 완벽 이해하기 (0) | 2025.04.19 |
| Java package와 import 구조 완벽 이해하기 (1) | 2025.04.16 |
댓글