상위 클래스로부터 상속을 받을 때, 하위 클래스 내에 같은 이름의 메서드가 있는 경우에 매개 변수의 타입과 개수가 다르면 오버로딩(Overloading)이라고 부르며, 매개 변수의 타입과 개수가 모두 같으면 오버라이딩(Overriding), 재정의가 됩니다.

즉, 매개 변수의 타입과 개수가 다른 메서드를 하위 클래스에서 정의하면 다른 메서드로 취급하지만 같은 경우에는 동일한 메서드가 되어 상위 클래스에 있는 메서드를 대체하게 됩니다.

더 간단히 말하자면, 상위 클래스에 정의된 메서드의 의미를 하위 클래스에서 바꾸는 것을 뜻합니다.

오버라이딩된 메서드에는 @override라는 애노테이션이 붙습니다. 애노테이션은 주석이라는 의미이고 컴파일러에게 "이거 오버라이딩된 메서드야"라고 알려주는 역할을 합니다. 주의할 점은 메서드를 선언하는 부분이 다를 경우, 에러가 발생합니다.

메서드를 어떤 식으로 재정의하는 것인지 간단하게 확인해 보겠습니다.

class SuperClass {
	void methodA() {
    	System.out.println("In SuperClass...");
    }
}

class SubClass extends SuperClass {
	@Override
    void methodA() {
    	System.out.println("In SubClass... Overriding");
    }
}

public class OverridingTest {
	public static void main(String[] args) {
    	SupberClass c1 = new SuperClass();
        SubClass c2 = new SubClass();
        c1.methodA();
        c2.methodB();
    }
}

결과

In SuperClass...
In SubClass... Overriding

상위 클래스에 선언된 메서드를 완전하게 대체하여 재정의(Overriding)하고자 할 경우, 위와 같이 메서드의 선언부와 일치하여야 합니다.

가상 메서드(Virtual Method)

위의 메서드를 설명하면서 추가적으로 중요한 점은 제가 저번에 SuperClass obj = new SubClass()로 객체를 생성하게 되면, obj의 인스턴스의 타입은 SubClass지만 obj 변수의 타입은 SuperClass이기 때문에 SuperClass로 대입이 된다라고 설명했는데, 그러면 SubClass에서 재정의된 메서드는 SuperClass 것으로 호출이 되는 것일까요?

결론은 SubClass에서 재정의된 메서드가 호출되며, JAVA에서는 항상 인스턴스의 메서드가 호출이 됩니다. 이는 가상메서드의 원리로 호출되며, JAVA의 모든 메서드는 가상 메서드(Virtual Method)입니다.

가상 메서드를 설명하기에 앞서 먼저 메서드가 어떻게 호출되는지를 알아야 합니다.

만약, methodA()라는 함수가 호출되어 메모리에 올라가게 되면, 저번에도 설명했듯이 메모리에서 2가지의 영역으로 상수나 static 같은 변수들은 Data 영역에, 구현한 메서드들은 명령어 set이기 때문에 Code 영역에 들어가게 됩니다.

함수의 이름은 나중에 주소 값으로 변하게 되는데, methodA() 라는 함수를 호출하게 되면, 명령어 set이 있는 주소를 찾아 명령어가 실행되는 방식입니다.

이때, 메서드에서 사용하는 변수들은 스택 메모리에 위치 하게되며, 다른 인스턴스라도 같은 메서드의 영역 코드는 같으므로 같은 메서드가 호출됩니다.

인스턴스가 생성되면 변수는 힙 메모리에 따로 생성되지만, 메서드 명령어 set은 처음 한번만 로드됩니다.

그래서 가상 메서드의 원리는 무엇일까?

실제로 함수 이름으로 호출이 되는 것이 아니라 함수 이름이 가리키는 주소에 대한 테이블이 따로 존재합니다. 그게 가상 함수 테이블(Virtual Function Table)이라고 하며, 각 클래스마다 가상 메서드 테이블이 존재합니다.

한 클래스에서 어떤 메서드를 호출하게 되면, 가상 함수 테이블의 그 메서드의 주소 값에 따라 메서드 영역에서 호출하게 됩니다.

그래서, 상위 클래스인 SuperClass와 하위 클래스 SubClass 각각 가상 함수 테이블이 생성되고, SubClass에서 재정의 되지 않은 메서드를 호출 시, 메서드 주소 값에 따라 SuperClass에 있는 메서드를 호출하며, 재정의된 메서드를 호출 시, 메서드 주소 값에 따라 SubClass에 재정의한 메서드가 호출되게 됩니다.

위의 이미지는 메가바이트 스쿨 : 백엔드 개발 과정의 JAVA 강의에서 가상 메서드 관련으로 사용한 이미지입니다.

이상으로 자바에서 사용하는 메서드 재정의에 대해서 간단히 알아봤습니다.

profile
꾸준함으로 성장하는 개발자 지망생

0개의 댓글