" async="async"> ', { cookie_domain: 'auto', cookie_flags: 'max-age=0;domain=.tistory.com', cookie_expires: 7 * 24 * 60 * 60 // 7 days, in seconds }); Java 메서드 오버로딩과 오버라이딩(Method Overloading & Overriding) :: 일단

자바의 메서드 오버로딩(Overloading)과 오버라이딩(Overriding)에 대해서 정리해보자.

 

대학교 주관식 시험문제로 나왔던 것이 기억나고 입사 교육 때도 차이점에 대해서 배웠고 입사 후 사수가 차이점을 아느냐고 물어보기도 했었다. 시간이 지날수록 대답은 짧아져갔던 것 같다.

 

두 용어는 메서드와 관련된 개념인데 실제 업무를 할 때 직접 만들어 써 본 적은 없다. (만들어져 있는 것은 보았어도 ex. println())

하지만 대학교 시험문제에 나왔던것 중에 중요하지 않았던 것은 없었다. 아니 대학교에서 배운 것들 전부.

 

0. 메서드 오버로딩 & 오버라이딩

두 개념은 자바의 핵심 개념이고 알아둘 필요가 있다.

개념을 정확하게 알고 손 코딩할 수 있을 정도의 예제도 알아두자!

 

1. 메서드 오버로딩(Method Overloading)

사전적 의미로 보면 메서드가 적재가 된다. 쌓인다. 여러 개다. 등으로 보인다.

Java Docs에서 검색해보았더니 아래와 같다.

메서드 네이밍에 대해서 설명하다 메서드 오버로딩이라는 단어가 나왔다.

메서드는 클래스 안에서 유니크한 이름을 가진다. 그

러나 다른 메서드와 같은 이름을가질 수도 있다.왜? 메서드 오버로딩 때문에!

즉, 같은 이름을 가진 메서드를 오버로딩된 메서드라고 한다.

 

자바 언어는 오버로딩 메서드를 지원하고 다른 메서드 시그니처를 가진 메서드를 구별할 수 있다.(메서드 시그니처는 메서드명과 파라미터를 말한다) 이 말은 한 클래스 내에 있는 메서드는 같은 이름을 가질 수 있는데 그 메서드가 다른 파라미터 리스트를 가졌을 경우라고 설명되어 있다. 그리고 인터페이스와 상속 부분에서 좀 더논의될 거라고 한다.

 

예제 코드를 두고 설명을 하고 있다. DataArtist라는 클래스에 같은 이름을 가진(draw) 메서드가 존재하는데존재하는데 그러기 위해서는 각메서드들은서로 다른 argument가 필요하다. (여기서 argument가아니라 parameter 일 것 같다는 생각이드는데... 자바독이 잘못되었을 리는 없을 것 같고같고 누가 좀 알려주세요.)

아래 예제에서 보듯이 같은 draw 메서드명을 사용하였지만 각각 String s, int i, double f, int i, double f와 같이 각기 다른 argument를 사용하기 때문에 에러가 발생하지 않고 구별할 수 있다. 만약 같은 argument를 사용한다면 에러가 발생한다. 왜냐하면 자바 컴파일러도 구분할 수 없기 때문이다.

public class DataArtist {
    ...
    public void draw(String s) {
        ...
    }
    public void draw(int i) {
        ...
    }
    public void draw(double f) {
        ...
    }
    public void draw(int i, double f) {
        ...
    }
}

컴파일러는 리턴 타입은 고려하지 않는다. 아래와 코드와 같이 리턴 타입이 다를지라도 같은 시그니처를 가진 메서드는 선언할 수 없다.

public class DataArtist {
    ...
    public int draw(int i) {
        ...
    }
    public double draw(int i) {
        ...
    }
}

 

정리하자면 메서드 오버로딩은 한 클래스 내에 같은 이름의 메서드를 사용할 수 있는데 그 조건으로 arguments로 작성된 데이터 타입이 다르거나 수가 달라야 한다. 그리고 리턴 타입은 상관이 없다.

 

오버로딩된 메서드는 가독성이 떨어질 수 있기에 남발하지 마라.

 

 

 

2. 메서드 오버라이딩(Method Overriding)

구글 번역기에서는 무시하는 이라고 되어있고 보통 재정의라고도 한다.

 

자바에서는 오버라이딩을 부모 클래스에서 정의한 메서드를 자식 클래스에서 변경하는 것이라고 한다. 그리고 변경하기 위해서는 자식 클래스가 부모 클래스를 상속해야 한다.

 

아래 Vehicle이라는 클래스가 있다.

public class Vehicle {

    public String accelerate(long km){
        return "The vehicle accelerate at : " + km + " km.";
    }

    public String stop(){
        return "The vehicle has stopped.";
    }

    public String run(){
        return "The vehicle is running.";
    }
}

그리고 Vehicle 클래스를 상속받는 Car 클래스가 있다.

public class Car extends Vehicle {
    public String accelerate(long km){
        return "The car accelerate at : " + km + " km.";
    }
}

메인 메서드에서 Car 클래스의 accelerate 메서드를 실행하면 결과는 "The car accelerate at : 100 km."가 나온다.

public class Main{
    public static void main(String arg[]){
        System.out.println("Test Overriding!");
        Car car = new Car();
        System.out.print(car.accelerate(100));
    }
}

 

부모 클래스(Vehicle)의 accelerate 메서드를 자식 클래스(Car)에서 재정의(오버로딩)한 것이다.

여기서도 조건이 있다.

메서드 명이 같아야 하고 파라미터와 리턴 타입이 같아야 한다는 것이다.

(위 오버라이딩 내용은 인스턴스 메서드의 경우이고 static 메서드의 경우는 조금 다르다.)

 

 

참고

https://docs.oracle.com/javase/tutorial/java/javaOO/methods.html (메서드 오버로딩)

https://docs.oracle.com/javase/tutorial/java/IandI/override.html (메서드 오버라이딩)

 

 

+ Recent posts