본문 바로가기

Language/JAVA

[JAVA] method Overloading vs. Overriding(메소드 오버로딩 vs. 오버라이딩)

JAVA method 메소드 Overloading 오버로딩 vs. Overriding 오버라이딩

 

자바 메소드 Method의 오버로딩 Overloading과 오버라이딩 Overriding에 대해 알아봅니다.

 


❗오버로딩과 오버라이딩은 전혀 다른 의미지만
명칭이 비슷해서 혼동하기 쉬우니 유의!

 

메소드 오버로딩 Overloading

한 클래스 안에서 메소드명이 같은 메소드를 2개 이상 정의할 경우, 메소드 오버로딩(중복정의)이라고 합니다.

오버로딩을 통해 객체지향의 다형성의 특징을 구현합니다.

메소드명을 같게 하면 시스템은 어떻게 구분할까요?

JVM은 같은 이름의 메소드가 여러개 정의되어 있으면 메소드의 파라미터 개수파라미터의 데이터 타입으로 구분하여 각각 다른 메소드로 인식합니다.

메소드 사용 범위를 제한하는 접근 제한과 반환 데이터 타입은 고려하지 않습니다.

파라미터만 다른 사실상 같은 내부 로직을 갖는 메소드를 각각 다른 이름으로 여러개 정의한다면, 가독성이 떨어지죠.

 

따라, 메소드 오버로딩을 구현하려면

  • 메소드명같고
  • 파라미터 개수 또는 파라미터 데이터 타입 다르게

정의하면 됩니다.

class Calc {

    int sumForInt(int a, int b) {
        return a + b;
    }
    double sumForDouble(double a, double b) {
        return a + b;
    }

    // overloading
    int sum(int a, int b) {
        return a + b;
    }
    double sum(double a, double b) {
        return a + b;
    }
    
    
    public static void main(String[] args) {
        Calc cal = new Calc();
        
        // 가독성 안좋음
		int sumInt = cal.sumForInt(5 + 3);
    	double sumDouble = cal.sumForDouble(3.7 + 8.5);

		// overloading
        int sumInt = cal.sum(5 + 3);
        double sumDouble = cal.sum(3.7 + 8.5);
    }
}

 


 

메소드 오버라이딩 Overriding

클래스를 확장하여 사용하기 위해 상속관계의 클래스를 정의하였습니다.

부모의 멤버함수를 이름은 같게 쓰고 싶은데 내부 구현체를 변경하고 싶을 경우, 자식 클래스는 부모 클래스의 멤버함수를 override 키워드로 오버라이딩(재정의)할 수 있습니다.

class Person {
	String name;
    int age;
    
    void printInfo() {
    	System.out.println("Name : " + this.name + ", Age : " + this.age);
    }
}

class Student extends Person {
	int classNo;
    // 부모 멤버함수 재정의
    @Override
    void printInfo() {
    	System.out.println("Name : " + this.name + ", Class No. : " + this.classNo);
    }
}

 

부모 함수를 오버라이딩하면 부모 함수의 내부 로직이 덮어써지는데요.

덮어쓰는게 아니라 확장하고 싶다면 아래와 같이 정의할 수 있습니다.

@Override
void printInfo() {
	super.printInfo();	// 부모 멤버함수 호출
    // 확장 로직 작성
    System.out.println("I'm Student.");
}

 

728x90