SW 배움터/자바

(자바) 오버로딩과 오버라이딩의 차이 정리

kusson 2022. 9. 1. 22:15
반응형
728x170

객체 지향 프로그램에서 가장 혼동하기 쉬운 용어 중 하나가 오버로딩과 오버라이딩일 것이다. 지금부터 두 용어의 의미와 정확한 사용예를 들어 보면서 두 용어의 차이를 이해해 보자.

 

1.오버로딩

오버로딩은 우리말로 다중 정의라고 번역한다. 즉 여러개의 메서드로 만들 수 있다는 의미가 된다. 좀더 자세히 설명하면 한 클래스 내에서 같은 이름의 메서드를 인수와 메서드 안의 내용, 리턴값을 다르게 하여 여러 번 정의 하는 것이다.

예를 들어 보자.

ex)

public class Calc {

      int plus(int a, int b) {                                             <-- plus() 메서드의 인수가 2개이다.

            int s = a + b;
            return s;
      }

      double plus(double a, double b, double c) {         <-- 인수가 3개이다.(메서드 이름은 같다)
            double k = a + b + c;                                       <-- 실행 내용도 달라졌다.
            return k;                                                           <-- 리턴값도 다르다.
      }

      void plus() {                                                          <-- 인수가 없다.(메서드 이름은 같다)
            System.out.println("더하기!");                        <-- 실행 내용도 달라졌다.
      }
}

위의 오버로딩에서 정의한 Calc 클래스를 이용하여 오버로딩한 메서드를 호출하는 프로그램을 작성해 보자. 오버로딩이 어떻게 적용되는지 쉽게 이해 할 수 있을 것이다.

ex)
public class CalcTest {

    public static void main(String[] args) {

        Calc calc = new Calc();                                <-- calc 객체 생성.

        calc.plus();                         <-   인수가 없는 메서드를 호출함.
 
        System.out.println(calc.plus(3, 5));              <- 인수가 두개인 메서드를 호출함.

        System.out.println(calc.plus(2.5, 3.5, 5.5)); <- 인수가 세개인 메서드를 호출함.

    }
}
 
실행 결과)
더하기!
7
12.0
 
이제 오버로딩이 무엇인지는 정확히 알았을 것이다. 다음은 오버라이딩에 대해서 알아보자.
 
 
 
 
 
 

2.오버라이딩

오버라이딩은 우리말로 재 정의 또는 덮어쓰기라고 번역한다. 상위 클래스의 메서드를 상위 클래스를 상속받은 하위 클래스에서 다시 정의 하는 것이다. 이때 메서드의 이름과 인수는 같으면서 메서드의 내용만 달라지는 것이다.

예를 들어 보자.

ex)

class Subject {                                                       <-- 상위 클래스
 
    String name;
 
    void printInfo() {                                                  <- printInfo() 메서드 정의
 
        System.out.println("교과명: " + name);
    }
}
 
class MajorSubject extends Subject { <-- MajorSubject는 Subject를 상속받은 하위 클래스
 
    String targetGrader;
 
    void printInfo() { <- printInfo() 메서드 오버라이딩(메서드의 이름, 인수 같고 내용만 다름)
 
        super.printInfo();                                         <-- 상위클래스의 printInfo() 메서드 호출
 
        System.out.println("타깃학년: " + targetGrader);
    }
}
 
 
위에서 정의한 클래스들을 이용하여 객체를 만드는 프로그램을 작성해 보자. 오버라이딩이 어떻게 적용되는지 쉽게 이해 할 수 있을 것이다.
 
ex)
public class SubjectExample {
    public static void main(String[] args) {                             <-- 메인 메서드
       
        MajorSubject sub = new MajorSubject();                    <-- sub 객체 생성

        sub.name = "컴퓨터 프로그래밍";

        sub.targetGrader = "1학년";

        sub.printInfo();                                                            <-- 하위 클래스의 printInfo() 메서드 호출
       
    }
}
 
 
프로그램을 실행해 보면 
 
실행결과)
교과명 : 컴퓨터 프로그래밍
타깃 학년 : 1학년
으로 나온다.
 
이제 오버로딩과 오버라이딩의 차이를 확실히 이해했을 것이다. 

  

 
반응형
그리드형