Java 오버라이딩(재정의)

김정훈·2024년 4월 19일

Java

목록 보기
17/48

메서드 오버라이딩(재정의)

상위 클래스에 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우 하위 클래스에서 이 메서드를 재정의할 수 있습니다.
이를 메서드 오버라이딩(method overriding)이라고 합니다.

1. 메서드 오버라이딩(재정의)

  • 상속시에만 가능, 인스턴스 메서드에서만 가능
  • 반환형, 메서드 이름, 매개 변수, 매개변수 자료형이 반드시 같아야 함.
  • 하위클래스에 상위클래스와 동일한 메서드가 있으면 하위클래스가 우선
  • 상속은 객체간에만 가능

애노테이션

애노테이션(Annotation) : 주석, 주해
형식 : @이름 - 정보전달
@Override : 재정의된 메서드임을 컴파일러에게 알려주는 정보.

2. 업캐스팅과 메서드 재정의

public class Parent {
    public void move(){
        System.out.println("child!");
    }
}

public class Child extends Parent{
    public void move(){
        System.out.println("child!");
    }
}

public class Ex01 {
    public static void main(String[] args) {
        Parent p = new Child();
        p.move(); //child출력
    }
}
  • 업캐스팅에 의해 Child이 Praent형으로 변환되었습니다. 그리고 나서 move() 메서드가 호출되었습니다.
  • move()는 하위 클래스에서 재정의된 메서드이며 Child 클래스와 Parent 클래스에 모두 존재합니다.
  • Customer형으로 선언되었다고 하더라도 p.move()은 Child에서 재정의된 메서드가 호출됩니다.
    (멤버 변수와 메서드는 선언한 클래스형에 따라 호출됩니다.)

상위 클래스와 하위 클래스에 같은 이름의 메서드가 존재할 때 호출되는 메서드는 인스턴스에 따라 결정됩니다.

선언한 클래스형이 아닌 생성된 인스턴스의 메서드를 호출하는 것, 이렇게 메서드가 호출되는 기술을 '가상 메서드(virtual method)'라 합니다.

3. 가상메서드

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

자바의 클래스는 멤버변수와 메서드로 이루어져 있습니다. 클래스를 생성하여 인스턴스가 만들어 지면 멤버변수는 힙 메모리에 위치합니다. 그러나 변수가 사용하는 메모리와 메서드가 사용하는 메모리는 다릅니다.

변수는 인스턴스가 생성될 떄마다 생성되지만 실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행합니다.
즉, 같은 객체의 인스턴스를 여러 개 생성한다고 해서 메서드도 여러 개 생성되지 않습니다.

원리

  • 일반적으로 프로그램에서 메서드를 호출한다는 것은 그 메서드의 명령 집합이 있는 메모리 위치를 참조하여 명령을 실행하는 것입니다.
  • 그런데 가상메서드의 경우에는 가상 메서드 테이블이 만들어집니다.
    가상메서드 테이블은 각 메서드 이름과 실제 메모리 주소가 짝을 이루고 있습니다.
  • 어떤 메서드가 호출되면 이 테이블에서 주소 값을 찾아서 해당 메서드의 명령을 수행합니다.

showCustomerInfo()와 같이 재정의되지 않은 메서드인 경우는 메서드 주소가 같으며 상위 클래스의 메서드가 호출됩니다.
그러나, 묵시적 형변환(업캐스팅)과 오버라이딩이 된경우에는 다르다.

묵시적 형변환(업캐스팅)과 오버라이딩된 경우

  • 상위 클래스(Customer)에서 선언한 calcPrice() 메서드가 있고 이를 하위클래스(VIPCustomer)에서 재정의한 상태에서 하위 클래스 인스턴스(vc)가 상위 클래스로 형 변환이 되었습니다.
  • vc.calcPrice()가 호출되면, vc 변수를 선언할 때 사용한 자료형(Customer)의 메서드가 호출되는 것이 아니라 생성된 인스턴스(VIPCustomer)의 메서드가 호출됩니다.
    이를 가상 메서드라고 합니다. 자바의 모든 메서드는 가상메서드입니다.
profile
안녕하세요!

0개의 댓글