티스토리 뷰

반응형
자바의 상속과 메모리 구조를 이해하기 위한 기초부터 완전한 설명

자바의 상속과 메모리 구조를 이해하기 위한 기초부터 완전한 설명


자바의 상속이란 무엇인가

상속의 정의

상속은 이미 정의된 클래스의 변수와 메서드를 새로운 클래스가 물려받아 사용하는 것입니다.
클래스(class)란 데이터를 담는 변수와 데이터를 처리하는 메서드를 하나로 묶은 설계도이며, 이 설계도를 기반으로 메모리에 객체를 만들어 사용합니다.
예를 들어 Parent라는 클래스가 있고 그 안에 greet()라는 메서드가 있을 때, Child라는 새로운 클래스가 Parent의 기능을 그대로 물려받아 사용하는 것이 상속입니다.
Child 클래스는 Parent가 가진 메서드뿐만 아니라 자신만의 새로운 메서드도 정의할 수 있습니다.


상속의 목적

  • 코드 재사용: 이미 작성한 코드를 다시 만들지 않고 그대로 재활용하거나 필요에 맞게 조금만 수정해 사용할 수 있습니다.
  • 유지보수 용이성: 공통된 기능을 부모 클래스에 모아 관리하므로 유지보수가 쉽습니다.
  • 계층 구조 표현: 현실 세계처럼 부모-자식 관계의 계층 구조를 코드에 표현할 수 있습니다.

자바에서 상속을 구현하는 실제 코드

다음은 단순한 형태로 작성한 자바 코드 예제입니다.
Parent 클래스의 메서드를 Child 클래스가 상속받아 그대로 사용하면서, 자식만의 메서드도 정의합니다.


자바 코드


public class Main {
    public static void main(String[] args) {
        Child child = new Child();
        child.greet();
        child.introduce();
    }
}

class Parent {
    public void greet() {
        System.out.println("Hello from Parent.");
    }
}

class Child extends Parent {
    public void introduce() {
        System.out.println("Hello from Child.");
    }
}
    

출력 결과


Hello from Parent.
Hello from Child.
    

설명:
Child 객체를 생성하면 Parent 클래스의 메서드인 greet()를 그대로 호출할 수 있습니다.
또한 Child 자신만의 메서드인 introduce()도 호출 가능합니다.
객체는 하나이지만, 메서드 실행 시에는 부모와 자식 각각의 영역을 사용합니다.


힙 영역의 메모리 구조

자식 객체가 생성되면 부모 클래스의 멤버와 자식 클래스의 멤버가 모두 하나의 힙 메모리 블록에 포함됩니다.
즉, 자식 객체를 생성하면 부모의 멤버까지 함께 메모리에 할당됩니다.
아래는 힙 영역의 구조를 부모 → 자식 순서로 쌓이는 형태로 표현한 것입니다.


힙 메모리 다이어그램


[힙 영역: 0x7ffee1a0]
+-------------------------------+
| Parent 영역                   |  ← 부모 클래스의 메서드와 상태
|   - 메서드: greet()           |
|                               |
| Child 영역                    |  ← 자식 클래스의 메서드와 상태
|   - 메서드: introduce()       |
+-------------------------------+
    

설명

✅ 힙에는 객체가 하나의 연속된 메모리 블록으로 생성됩니다.
✅ 이 블록 안에 부모 클래스의 멤버가 먼저 배치되고, 그 뒤에 자식 클래스의 멤버가 이어집니다.
✅ 부모와 자식이 각각 다른 메모리 공간을 차지하는 것이 아니라, 같은 주소 공간(0x7ffee1a0) 안에 함께 존재합니다.
✅ 객체는 하나이며, 메서드 호출 시에는 이 블록 안의 부모 영역 혹은 자식 영역으로 실행 지점이 이동합니다.


메서드 호출 시 메모리 흐름

Child 객체로 메서드를 호출하면 힙 메모리 안에서 부모 영역과 자식 영역을 오가며 실행됩니다.
아래는 각각의 메서드 호출 시 힙 메모리에서 어떤 영역으로 이동해 실행되는지를 나타낸 다이어그램입니다.


child.greet(); 호출 시


[힙 영역: 0x7ffee1a0]
+-------------------------------+
| Parent 영역                   | ◀─ 현재 실행 중: greet()
|   - 메서드: greet()           |
|                               |
| Child 영역                    |
|   - 메서드: introduce()       |
+-------------------------------+
    

✅ 부모 영역에 정의된 greet() 메서드가 실행됩니다.
✅ 메모리 블록은 그대로 유지되며, 부모 부분이 활성화됩니다.


child.introduce(); 호출 시


[힙 영역: 0x7ffee1a0]
+-------------------------------+
| Parent 영역                   |
|   - 메서드: greet()           |
|                               |
| Child 영역                    | ◀─ 현재 실행 중: introduce()
|   - 메서드: introduce()       |
+-------------------------------+
    

✅ 자식 영역에 정의된 introduce() 메서드가 실행됩니다.
✅ 메모리 블록은 그대로 유지되며, 이번에는 자식 부분이 활성화됩니다.

Filipe

최종 정리

Child 객체 하나가 힙에 할당되며, 그 안에 부모와 자식의 상태가 모두 포함됩니다.
메서드 호출 시 메모리 블록은 변하지 않고, 실행 포커스만 부모 → 자식으로 이동합니다.
이것이 자바의 상속과 메모리 구조의 핵심입니다.


반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/10   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함
반응형