티스토리 뷰
Guitar 클래스가 Instrument 클래스를 상속받는 상황을 가정해보자.
public class Instrument {
public void play() {
System.out.println("악기를 연주합니다.");
}
}
public class Guitar extends Instrument {
@Override
public void play() {
System.out.println("기타를 연주합니다!");
}
}
그리고 Guitar 객체를 생성한다.
public class InheritanceMain {
public static void main(String[] args) {
Guitar guitar = new Guitar();
guitar.play();
}
}
이 때 Guitar 객체가 참조하는 메모리에는 어떤 클래스가 올라와 있을까?
메모리에는 Instrument와 Guitar 이 두 클래스의 정보가 모두 올라와있다.
⭐ 즉, 상속을 하면 부모 클래스도 함께 생성되는 것이다. 겉으로 볼 때는 Guitar 하나의 객체가 생성되는 것 같지만 그 속을 보면 부모와 자식이 모두 생성된다.
현재는 guitar 객체의 타입이 Guitar여서 play()메소드를 호출하면 Guitar 클래스의 play()메소드가 호출된다.
(상속 관계에서는 호출자의 타입을 통해 대상 타입을 찾는다)
그런데 만약 Guitar 클래스에 play()메소드가 없으면 어떨까?
→ 부모 클래스(Instument)로 올라가서 호출한 메소드(play())를 찾는다. 부모 클래스에도 호출하는 메소드가 없으면 컴파일 오류가 발생한다.
정리하자면,
1. new 키워드를 통해 Guitar 객체를 생성하기 위한 메모리 공간이 힙 영역 에 할당된다.
2. 해당 메모리 공간에 Instrument 클래스의 인스턴스 변수가 할당되며 메소드는 메소드 영역 에 할당된다.
3. Guitar 객체가 생성되면(guitar) 객체의 참조값(x001)이 guitar 참조 변수에 저장되고 그 변수는 스택 영역 에 할당된다.
4. guitar.paly()가 호출되면 JVM은 guitar 참조 변수(x001)가 가리키는 메모리 주소(guitar 객체)를 찾아간다.
5. 그리고 Guitar 클래스에 정의된 play() 메소드를 실행한다.(동적 바인딩)
'java' 카테고리의 다른 글
자바의 Checked Exception VS Unchecked Exception (1) | 2024.11.21 |
---|---|
인터페이스 vs 추상클래스 (0) | 2024.05.16 |
자바 main 메소드는 왜 static일까? (0) | 2023.12.19 |
자바 메모리 구조 (0) | 2023.12.16 |
final 키워드(변수, 상수) (0) | 2023.12.14 |
- Total
- Today
- Yesterday
- 오블완
- ddl-auto
- 일급컬렉션
- 생성자
- NPE
- 티스토리챌린지
- @Spring
- JPA
- 메인메소드
- @Value
- id생성전략
- 유효성 검사
- Java
- uncheckedException
- checkedException
- StreamAPI
- upperBound
- 동등성
- Spring
- @ConfigurationProperties
- Thymeleaf
- springboot
- @NoArgsConstructor
- null
- 백준
- N+1문제
- 이진탐색
- 자바
- lowerBound
- Optional
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |