Java 오버라이딩과 가상 메서드

Codren·2021년 6월 2일
2
post-custom-banner

Section 1. 오버라이딩

1. 오버라이딩 (Overriding)

상위 클래스의 메서드가 구현할 내용과 맞지 않는 경우, 또는 자신만의 메서드로 변경하여 사용할 경우에 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있음

  • 오버라이딩(재정의)하면 해당 메서드가 메서드 영역에 새로 생김
    (이름은 같지만 내부적으로 더미값을 추가하여 실제적으로는 정확히 동일한 이름은 아님)




2. 오버라이딩 구현

@Override
public int calcPrice(int price) {
	bonusPoint += price * bonusRatio;
	return price - (int)(price * salesRatio);
}




3. 애노테이션 (annotation)

  • @overriding 애노테이션 - 컴파일러에게 오버라이딩 함수라는 정보를 제공
  • 재정의 된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가 남



Section 2. 가상 메서드

1. 가상 메서드 (Virtual Method)

다형성의 원리가 적용될 수 있는 멤버 함수(메서드)로써 동적 바인딩으로 처리되는 메서드를 의미
동적 바인딩 수행 시 가상 메서드 테이블을 참조하여 매핑함

  • 정적 바인딩이 아닌 동적 바인딩으로 처리되기 때문에 컴파일 시점에 정해지지 않은, 실제로 존재하지 않는, 임시로 존재하는 메서드라는 의미로 가상 메서드라고 지칭함




2. 메서드 호출과 동작 원리

  • 메서드의 이름은 주소값을 나타냄 (메모리 Code 영역에서 해당 메서드가 저장되는 부분의 주소)
  • 해당 메서드가 호출 되면 instruction set 이 저장된 주소를 찾아 명령어(메서드)가 실행됨
  • 메서드에서 사용하는 변수들은 메모리 Stack 영역에 위치 하게됨
  • 다른 인스턴스라도 같은 메서드의 코드는 같으므로 같은 메서드가 호출됨
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();
	}

}




3. C++ 에서 가상 함수가 필요한 상황

  • 하위 클래스에서 상위 클래스의 특정 함수를 오버라이딩(재정의) 할 수 있음
  • 하위 클래스 인스턴스를 상위 클래스 타입으로 형변환 할 수 있음 (업캐스팅)
  • 이 때, 업캐스팅된 객체에서 오버라이딩 된 함수를 호출할 경우 상위 클래스의 원본 함수가 수행

이유 -> 상위 클래스의 자료형은 하위 타입들의 인스턴스를 가리킬 수 있음 (업캐스팅). 이러면 컴파일 시에는 상위 클래스 타입의 참조 변수가 어떤 인스턴스를 참조하는지 알 수가 없기 때문에 일반화된 상위 클래스의 원본 함수가 수행되도록 설정함 (정적바이딩)




4 . C++ 에서 가상 함수 사용

  • 오버라이딩 될 함수에 virtual 키워드 적용 -> 가상 함수 지정, 동적 바인딩 설정
  • 가상 함수가 존재하는 클래스가 인스턴스로 생성될 때 가상함수 매핑 테이블도 생성됨
    (가상함수 이름과 메모리 Code영역에서 해당 함수의 instruction set 저장 위치 주소 매핑)
  • 똑같이 업캐스팅된 객체에서 오버라이딩 된 함수를 호출할 경우 이번에는 하위 클래스의 오버라이딩된 함수가 수행됨

이유 -> virtual 키워드를 적용했기 이번에는 동적 바인딩이 수행된다. 즉, 업캐스팅된 객체에서 오버라이딩된 함수가 호출될 경우 상위 클래스 타입의 참조 변수가 어떤 하위 클래스의 인스턴스를 참조하는 지 알 수 있고, 따라서 해당 인스턴스의 가상함수 매핑 테이블을 참조하여 재정의된 함수를 수행함 (동적바인딩)




5 . 가상 함수의 역할

  • 다형성의 원리가 적용될 함수를 지정함
  • 업캐스팅 된 객체에서 가상 함수를 호출하면 각 인스턴스의 함수가 수행되게 함
    (접근은 상위 클래스 범위로 접근하지만 함수 수행은 인스턴스 기준)



Section 3. Java 가상 메서드

1. Java 에서 가상 메서드

  • C++ 에서 존재하는 가상 함수 개념을 Java 에서 동일하게 적용
  • Java 에서는 모든 메서드가 가상 메서드임 (따라서 virtual 키워드 생략)




2. 가상 메서드 테이블

  • 각 클래스마다 메서드 테이블이 존재
  • 오버라이딩(재정의)된 경우는 재정의 된 메서드의 주소를 가리킴

post-custom-banner

1개의 댓글

comment-user-thumbnail
2023년 7월 26일

자바 공부는 어느정도 했다고 생각했는데, 이런 개념이 있는걸 몰랐네요....덕분에 알게되네요

답글 달기