Programming

; develop a program

Back-End/Java

[Java] 메서드 오버라이딩(method overriding)

Clloud_ 2023. 2. 6. 12:18
반응형

이번 포스팅에서는 자바(java)에서 메서드 오버라이딩에 대하여 공부를 해보고자 한다.

 


메서드 오버라이딩이란

메서드 오버라이딩은 상위 클래스에 정의한 메서드가 하위 클래스에서 구현할 내용과 맞지 않을 경우에 하위 클래스에서 이 메서드를 재정의 하는 것을 말한다.

즉, 상속받은 부모 클래스의 메서드를 재정의하여 사용하는 것을 의미한다.

메서드가 오버라이딩되었다면 부모 객체의 메서드는 숨겨지기 때문에, 자식 객체에서 메서드를 호출하면 오버라이딩된 자식 메서드가 호출된다.

 

메서드 오버라이딩 조건

  1. 오버라이딩이란 메서드의 동작만을 재정의하는 것이므로, 메서드의 선언부는 기존 메서드와 완전히 같아야 한다.
    (반환형, 메서드 이름, 매개변수 개수, 매개변수 자료형)
  2. 메서드의 반환 타입은 부모 클래스의 반환 타입으로 타입 변환할 수 있는 타입이라면 변경할 수 있다.
  3. 부모 클래스의 메서드보다 접근 제어자를 더 좁은 범위로 변경할 수 없다.
    (부모 메서드가 public 접근제한을 가지고 있을 경우, 오버라이딩하는 자식 메서드는 default나 private 접근 제한으로 수정할 수 없다.)
  4. 새로운 예외(Exception)를 throws 할 수 없다.

 

예제

부모 클래스의 지급 금액을 구하는 메서드

public int calcPrice(int price){
    bonusPoint += price * bonusRatio;
    return price;
}

 

부모 클래스의 calcPrice 메서드를 오버라이딩한 자식 클래스의 calcPrice 메서드 재정의

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

 

@Override 애노테이션(Annotation)

애노테이션은 영어로 주석이라는 의미다.

@ 기호와 함께 사용하며 '@애노테이션 이름'으로 표현한다.

자바에서 제공하는 애노테이션은 컴파일러에게 특정한 정보를 제공해 주는 역할을 한다.

 

표준 애노테이션

애노테이션 설명
@Override 재정의된 메서드라는 정보 제공
@FuctionalInterface 함수형 인터페이스라는 정보 제공
@Deprecated 이후 버전에서 사용되지 않을 수 있는 변수, 메서드에 사용됨
@SuppressWarnings 특정 경고가 나타나지 않도록 함

 


가상 메서드(virtual method)

자바의 클래스는 멤버 변수와 메서드로 이루어져 있다.

클래스를 생성하여 인스턴스가 만들어지면 멤버 변수는 힙 메모리에 위치한다.

 

변수가 사용하는 메모리와 메서드가 사용하는 메모리가 다르다.

변수는 인스턴스가 생성될 때마다 새로 생성되고, 메서드는 실행해야 할 명령 집합이기 때문에 인스턴스가 달라도 같은 로직을 수행한다.

즉, 같은 객체의 인스턴스를 여러 개 생성한다고 해서 메서드도 여러 개 생성되지 않는다.

 

예제

메서드 호출

public class TestA {
    int num;
    
    void aaa(){
        System.out.println("aaa() Ãâ·Â");
    }

    public static void main(String[] args){	
        TestA a1 = new TestA();
        a1.aaa();
        TestA a2 = new TestA();
        a2.aaa();
    }
}

 

출력 결과

aaa() 출력
aaa() 출력

 

위 코드가 실행되는 메모리의 상태를 그림으로 나타내면 다음과 같다.

 

  • main( ) 함수가 실행되면 지역 변수는 스택 메모리에 위치한다.
  • 각 참조 변수 a1과 a2가 가리키는 인스턴스는 힙 메모리에 생성된다.
  • 메서드의 명령 집합은 메서드 영역(코드 영역)에 위치하고 메서드를 호출하면 메서드 영역의 주소를 참조하여 명령이 실행된다.
  • 따라서 인스턴스가 달라도 동일한 메서드가 호출된다.

 

가상 메서드의 원리

일반적으로 프로그램에서 메서드를 호출한다는 것은 그 메서드의 명령 집합이 있는 메모리 위치를 참조하여 명령을 실행하는 것이다.

가상 메서드의 경우에는 '가상 메서드 레이블'이 만들어진다.

 

가상 메서드 테이블은 각 메서드 이름과 실제 메모리 주소가 짝을 이루고 있다.

어떤 메서드가 호출되면 이 테이블에서 주소 값을 찾아서 해당 메서드의 명령을 수행한다.

 

다음은 Customer 클래스와 VIPCustomer 클래스의 가상 메서드 테이블이다.

 

  • calcPrice( ) 메서드는 두 클래스에서 서로 다른 메서드 주소를 가지고 있다.
  • 이렇게 재정의 된 메서드는 실제 인스턴스에 해당하는 메서드가 호출된다.
  • showCustomerInfo( )와 같이 재정의되지 않은 메서드인 경우는 메서드 주소가 같으며 상의 클래스의 메서드가 호출된다

 


반응형

'Back-End > Java' 카테고리의 다른 글

[Java] 다운 캐스팅과 instanceof  (0) 2023.02.06
[Java] 다형성(polymorphism)  (0) 2023.02.06
[Java] 상속에서 클래스 생성과 형 변환  (0) 2023.02.05
[Java] 상속(inheritance)  (0) 2023.02.05
[Java] 배열 응용 프로그램  (0) 2023.02.05