반응형

메소드 오버로딩과 메소드 오버라이딩

메소드 오버로딩과 메소드 오버라이딩은 이름이 비슷하여 영어보다는 한글로 뜻을 기억하면 헷갈리지 않으니 참고하자.

overloading: 중복

overriding: 재정의

즉, 메소드 중복과 메소드 재정의로 이해하는 것이 쉬울 것이다.

 

메소드 중복(Method Overloading)

하나의 클래스에서 같은 이름의 메서드를 여러 개 사용하는 것이 메소드 오버라이딩, 즉 메소드 중복이다.

어떻게 동일한 이름의 메서드를 한 개가 아니라 여러 개를 사용할 수 있을까? 매개 변수의 자료형이나 개수를 변경해서 이를 실현시킨다.

class Calculate {
    public int cal(int a, int b) {
	return a - b;
    }
    public float cal(float a, float b) {
	return a - b;
    }
    public double cal(double a, double b) {
    	return a + b;
    }
    public int cal(int a, int b, int c) {
    	return a + b + c;
    }
}

위 예시 코드를 보면 잘 와닿을 것이다. Calculate라는 클래스 안에 cal이라는 같은 이름의 메서드가 무려 4개나 존재하는데 이 코드는 정상적으로 수행된다. 왜냐하면 메서드 오버로딩이 적용되었기 때문인데, 매개변수의 자료형을 int, float, double로 각각 다르게 지정해줬고, int의 경우 첫 번째, 네 번째 코드가 겹치지만 매개변수의 개수를 2개와 3개로 다르게 지정하여 이를 가능하도록 하였다.

 

메소드 재정의(Method Overriding)

재정의는 상속과 관련된 개념인데, 부모 클래스에서 정의한 메소드와 이름, 매개 변수의 자료형 및 개수는 같지만 수행하는 기능을 다르게 새롭게 재정의하는 것이다.

class A {
	void abc() {
    	System.out.println("aaa");
    }
}

class B extends A {
	void abc() {
    	System.out.println("abc");
    }
}

위 코드를 보면 A가 부모 클래스이고 이를 B 클래스가 자식 클래스로 상속받는 관계이다.

이때 자식 클래스인 B 클래스는 부모 클래스인 A 클래스의 abc() 메서드를 상속받는다. 그런데 B 클래스 내부에서 abc를 재정의하여 B 클래스의 인스턴스가 만약 abc() 함수를 호출한다면 부모 클래스의 abc() 메서드를 호출할 때 "aaa"가 출력되는 것과는 다르게 "abc"가 출력된다.

 

중복, 재정의, 오버로딩, 오버라이딩

잘 기억하자.