JAVA 웹 개발 패키지 - 패스트캠퍼스/Chapter3

메서드 재정의 하기 (overring)

giggs 2022. 1. 3. 17:28

 

하위 클래스에서 메서드 재정의 하기

  • 오버 라이딩(overriding) : 상위 클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있음
  • VIPCustomer 클래스의 calcPrice()는 할인율이 적용되지 않음
  • 재정의 하여 구현해야 함

 

 

Customer 클래스의 clacPrice 부분

 

 

VIPCustomer 클래스의 clacPrice 부분

 

@overriding 애노테이션은 재정의 된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가 남

 

@overriding 애노테이션 (annotation)

  • 애노테이션은 원래 주석이라는 의미
  • 컴파일러에게 특별한 정보를 제공해주는 역할

 

 

출력 테스트 ---

 

price 값을 주고 등급에 맞는 calcPrice 적용되었는지 확인

 

SILVER / VIP 고객 할인율 다르게 적용되어서 출력 잘됨 확인 GOOD :)

 


 

형 변환과 오버라이딩 메서드 호출

 

Customer vc = new VIPCustomer();

vc 변수의 타입은 Customer지만 인스턴스의 타입은 VIPCustomer

자바에서는 항상 인스턴스의 메서드가 호출 됨 (가상 메서드의 원리)

자바의 모든 메서드는 가상 메서드(virtual method) 임

 

 

쓸 수 있는 메서드 - Customer 애들 - 타입을 Customer로 지정했기 때문에

 

 

메서드도 Customer 것 사용했지만 - VIPCustomer 인스턴스로 생성하였기때문에 인스터스의 메서드가 호출 됨(가상메서드 원리)

 

 


 

 

메서드 재정의와 가상 메서드 원리

 

메서드는 어떻게 호출되고 실행되는가?

  • 메서드(함수)의 이름은 주소 값을 나타냄 - 함수 이름에 따른 주소 호출
  • 메서드는 명령어의 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를 가지고 있음- 가상 메서드 테이블
  • 재정의된 경우는 재정의 된 메서드의 주소를 가리킴 -

 

재정의 Override 된 경우에는 새로운 주소를 가리킨다.

 

 

 


 

 

 

review

재정의 Override / 가상 메서드 / 재정의 호출

상속 부분에서 배운 것은
상속 상위 클래스의 기능들을 기본으로 가져다쓰면서
상속 하위 클래스에 추가되는 부분만 추가해서 사용하는 것을 배웠다.

재정의 부분에서 배운 것은
상속 상위 클래스에서 정의된 기능을 가져다가 쓰는데
기능은 그대로 쓰되 추가 조건이나 변수의 값을 변경하여 사용할 때
재정의하여 사용한다는 것을 배웠다.
그때 변수의 타입이 아닌 인스턴스 타입의 메서드가 호출된다는 점도 중요 포인트였다.
-> 가상 메서드의 원리

 
재정의된 경우 가상메서드 테이블 영역에 새로운 주소를 가리키게 된다는 것을 알았다.

기능은 같으므로 프로그램 로드될 때 code영역에 처음 1번 메서드(함수) set
메서드 영역에 사용 변수는 지역변수로 스택 메모리
다른 인스턴스라도 메서드의 코드는 같으므로 같은 메서드가 호출됨
달라지는 것은 변수들..
인스턴스 변수들은 heap메모리에 생성돼서 호출 사용

이 개념으로 가상 메서드를 이해하는 것이 중요한 부분 같다고 생각했다.