본문 바로가기

JAVA

[JAVA] 메서드 오버로딩(Method Overloading) 과 오버라이딩(Method Overriding)


1. 메서드 오버 로딩이란?


같은 이름의 메서드를 여러 개 가지면서 매개변수의 유형과 개수가 다르도록 하는 기술입니다.

즉, 메서드의 signature가 다르면 된다. ( signature : 매개변수의 타입, 개수)

 

public class Test(
	public static void main(String[] args){
    	Overload ov = new Overload();
        ov.hap(34.6f, 46);
        ov.hap(34, 62);
        ov.hap(74.6f, 26.6f);
    }
)

예를 들어, Overload라는 클래스가 있고 hap이라는 메서드가 있다고 가정합니다.

위의 코드에서 Overload인스턴스를 만들고 hap이라는 메서드를 호출하는데, 3개의 메서드 모두 매개변수의 타입이 다르다는 것을 알 수 있습니다.

첫 번째 hap의 첫번째 매개변수는 float형, 두 번째 매개변수는 int형

두번째 hap의 첫번째 매개변수는 int형, 두번째 매개변수도 int형

세 번째 hap의 첫 번째 매개변수를 float형, 두 번째 매개변수도 float형

 

public class Overload{
	
    public void hap(int a, int b){
    }
    
    public void hap(float a, float b){
    }
    
    public void hap(float a, float b){
    }
}

JAVA에서는 이것을 가능하게 하는데, 이것을 메서드 오버 로딩이라고 합니다.

메서드의 이름이 같아도 매개변수의 개수가 다르거나 혹은 매개변수의 개수가 같지만, 매개변수의 타입이 같은 이름의 메서드와 다르다면 가능합니다.

 

오버 로딩을 많이 사용하면 성능이 저하되지 않을까?


정답은 NO입니다.

그 이유는 해당 파일을 컴파일할 때 메서드 이름이 바뀌기 때문입니다.

정적 바인딩

hap_int_int(int a, int b)

hap_float_int(float a, int b)

hap_float_float(float a, float b)

 

컴파일되기 전 소스파일에서는 이름이 hap으로 동일했지만

컴파일러가 만들어낸 파일의 메서드 이름은 메서드 이름_(매개변수 타입)으로 변경이 되기 때문에 찾기가 쉬워 성능이 저하되지 않습니다.

 

정정 바인딩이란?


컴파일 시간에 성격이 결정되는 것으로, 컴파일 시간에 많은 정보로 결정되므로 실행 효율이 높습니다.

오버 로딩의 경우 정적 바인딩이므로 성능이 저하되지 않습니다.

 

 

2. 메서드 오버 라이딩이란?


상속관계에서 상속받은 하위 클래스가 상위 클래스의 동작을 수정하는 것입니다.

 

위와 같이 Animal클래스가 있고 eat이라는 메서드가 있습니다.

Dog클래스와 Cat클래스는 Animal를 상속하며 수평구조입니다. 두 개의 클래스가 마찬가지로 eat메서드를 가지고 있습니다.

 

오버 라이딩 첫 번째 경우


Dog dog = new Dog();
dog.eat();

Dog의 경우 상속한 객체의 타입을 Animal로 하지 않고 Dog로 객체를 생성하였습니다.

 

메모리에서는 Dog가 상속한 Animal이 먼저 생성이 되고 그다음에 Dog가 생성이 됩니다.

Dog는 Animal을 상속한 상태이기 때문에 Dog영역뿐만 아니라 Animal을 포함한 전체 영역을 Dog타입으로 볼 수 있습니다.

그렇다면 현재 Animal의 eat메서드와 Dog의 eat메서드가 공존하고 있습니다.

(만약 Dog클래스에 eat 메서드가 없어도 eat메서드를 사용할 수 있으며, 이 eat 메서드는 Animal클래스의 eat메서드 입니다)

이렇게 되면, 위의 코드에서 d.eat( )는 Animal의 eat가 아닌 Dog의 eat가 호출됩니다.

 

이 경우는 Dog클래스의 모든 동작을 알고 있을 경우에는 사용해도 괜찮지만, 그렇지 않을 경우에는 좋지 않은 방법입니다.

예를 들어, 지금은 Dog클래스에 eat메서드가 있다는 것을 알고 있는 상태이기에 dog.eat( )을 사용했지만 만약 Dog의 소스코드를 알지 못한 상태에서는 dog.eat( )을 사용할 수 없을 것입니다.

 

오버 라이딩 두 번째 경우


Animal cat = new Cat();
cat.eat();

이 경우는 Cat의 부모 클래스인 Animal을 타입으로 객체를 생성해 eat메서드를 호출한 경우입니다.

이렇게 자식의 타입을 부모 클래스로 가지는 경우를 upcasting이라고 합니다.

 

이 경우에는 Animal타입으로 생성했기 때문에 cat.eat( )은 Animal의 eat가 실행되는 것이 일반적이지만,

Cat클래스에서도 eat 메서드를 정의했기 때문에 Animal의 eat메서드가 아닌 Cat의 eat메서드가 실행하게 됩니다.

즉, 상위 클래스는 하위 클래스가 재정의한 메서드를 찾고, 찾았다면 자식의 메서드를 실행시킵니다.

재정의, 오버 라이딩은 동적 바인딩이라고 불립니다.

 

동적 바인딩이란?


실행 시간에 성격이 결정되는 것입니다.

호출될 메서드가 실행 시점에서 결정되는 바인딩입니다.

위의 코드인 cat.eat( )을 실행시키면 동적 바인딩이 일어나 재정의된 메서드를 찾아가기 때문에 실행 전에는 모르다가 eat메서드를 실행될 시점에 사용될 메서드가 결정되는 것입니다.

그렇기 때문에 성능 저하에 문제가 될 수 있는데, 하위 클래스의 동작 방식을 모르지만 부모 클래스를 가지고 자식 클래스를 동작시킬 수 있다는 점이 장점입니다.

 

그리고 그렇게 하는 것이 효과적이고 확장성이좋은 프로그램을 만들 수 있습니다.

 

출처

https://www.inflearn.com/course/

 

Java TPC(생각하고, 표현하고, 코딩하고) - 인프런 | 강의

생각하고, 표현하고, 코딩하는 훈련을 통해 Java 프로그래밍을 쉽게 이해하고 접근 할 수 있다. 프로그래밍 요소들의 관계를 이해하고 객체지향 프로그래밍의 정확한 개념 정리를 통한 향후 Java A

www.inflearn.com


'JAVA' 카테고리의 다른 글

[JAVA] ArrayList  (0) 2022.12.04
[JAVA] 추상클래스와 인터페이스  (0) 2021.12.21
[JAVA] 메서드가 메모리에 저장되는 과정  (0) 2021.12.18
[JAVA] 변수선언과 할당  (0) 2021.12.16
[JAVA] 자바 구동방식  (0) 2021.12.16