본문 바로가기
language/java

Java 상속(Inheritance) 완벽 이해하기

by 죄니안죄니 2026. 5. 22.
반응형

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 구조까지 포함해서 정리해보겠습니다.

반응형

댓글