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

Codren·2021년 6월 2일

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. 가상 메서드 테이블

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

1개의 댓글

comment-user-thumbnail
2023년 7월 26일

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

답글 달기