하위 클래스에서 메서드 재정의 하기
- 오버 라이딩(overriding) : 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있음
- VIPCustomer 클래스의 calcPrice()는 할인율이 적용되지 않음
- 재정의 하여 구현해야 함
Customer 클래스의 clacPrice 부분
VIPCustomer 클래스의 clacPrice 부분
@overriding 애노테이션은 재정의 된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가 남
@overriding 애노테이션 (annotation)
- 애노테이션은 원래 주석이라는 의미
- 컴파일러에게 특별한 정보를 제공해주는 역할
출력 테스트 ---
price 값을 주고 등급에 맞는 calcPrice 적용되었는지 확인
SILVER / VIP 고객 할인율 다르게 적용되어서 출력 잘됨 확인 GOOD :)
형 변환과 오버라이딩 메서드 호출
Customer vc = new VIPCustomer();
vc 변수의 타입은 Customer지만 인스턴스의 타입은 VIPCustomer 임
자바에서는 항상 인스턴스의 메서드가 호출 됨 (가상 메서드의 원리)
자바의 모든 메서드는 가상 메서드(virtual method) 임
메서드 재정의와 가상 메서드 원리
메서드는 어떻게 호출되고 실행되는가?
- 메서드(함수)의 이름은 주소 값을 나타냄 - 함수 이름에 따른 주소 호출
- 메서드는 명령어의 set이고 프로그램이 로드되면 메서드 영역(코드 영역)에 명령어 set이 위치
- 해당 메서드가 호출되면 명령어 set 이 있는 주소를 찾아 명령어가 실행됨
- 이때 메서드에서 사용하는 변수들은 스택 메모리에 위치하게 됨
- 따라서 다른 인스턴스라도 메서드의 코드는 같으므로 같은 메서드가 호출됨 - 기능은 같다 / 변수가 다른 것
- 인스턴스가 생성되면 변수는 힙 메모리에 따로 생성되지만, 메서드 명령어 set은 처음 한 번만 로드됨
프로그램이 로드될때 크게 2가지 영역 | |
Data 영역 | 상수 / static / 리터럴 |
Code 영역 | 함수 / 기능(더하는 기능은 같다, 변수가 다른것) |
변수의 영역 | |
지역변수는 stack | 스택 메모리 |
인스턴스변수는 heap | 힙 메모리 |
public class TestMethod {
int num;
void aaa() {
System.out.println("aaa() 호출");
}
public static void main(String[] args) {
TestMethod a1 = new TestMethod();
a1.aaa();
TestMethod a2 = new TestMethod();
a2.aaa();
}
}
가상 메서드의 원리
- 가상 메서드 테이블(vitual method table)에서 해당 메서드에 대한 address를 가지고 있음- 가상 메서드 테이블
- 재정의된 경우는 재정의 된 메서드의 주소를 가리킴 -
review
재정의 Override / 가상 메서드 / 재정의 호출
상속 부분에서 배운 것은
상속 상위 클래스의 기능들을 기본으로 가져다쓰면서
상속 하위 클래스에 추가되는 부분만 추가해서 사용하는 것을 배웠다.
재정의 부분에서 배운 것은
상속 상위 클래스에서 정의된 기능을 가져다가 쓰는데
기능은 그대로 쓰되 추가 조건이나 변수의 값을 변경하여 사용할 때
재정의하여 사용한다는 것을 배웠다.
그때 변수의 타입이 아닌 인스턴스 타입의 메서드가 호출된다는 점도 중요 포인트였다.
-> 가상 메서드의 원리
재정의된 경우 가상메서드 테이블 영역에 새로운 주소를 가리키게 된다는 것을 알았다.
기능은 같으므로 프로그램 로드될 때 code영역에 처음 1번 메서드(함수) set
메서드 영역에 사용 변수는 지역변수로 스택 메모리
다른 인스턴스라도 메서드의 코드는 같으므로 같은 메서드가 호출됨
달라지는 것은 변수들..
인스턴스 변수들은 heap메모리에 생성돼서 호출 사용
이 개념으로 가상 메서드를 이해하는 것이 중요한 부분 같다고 생각했다.
'JAVA 웹 개발 패키지 - 패스트캠퍼스 > Chapter3' 카테고리의 다른 글
인터페이스(interface) (0) | 2022.01.04 |
---|---|
추상 클래스(abstract class) 와 템플릿 메서드 패턴 (0) | 2022.01.04 |
다운 캐스팅과 instanceof (0) | 2022.01.04 |
다형성과 다형성을 사용하는 이유 (0) | 2022.01.03 |
상속 ( inheritance ) (0) | 2022.01.03 |