Programing/JAVA

Java Method Overriding, Overroading 자바 메서드 오버로딩과 오버라이딩

리커니 2018. 7. 26.
반응형

Java Method Overriding, Overroading 자바 메서드 오버로딩과 오버라이딩

 

메서드 오버로딩과 오버라이딩에 대해서 알아보겠습니다.

둘을 혼동하는 사람들이 꽤 있는데, 이 둘은 '오버' 로 시작하는 것 말고는

비슷한 점이 없습니다.

 

우선 오버로딩은

'하나의 클래스에 이름이 같은 메서드를 파라미터의 타입과 개수만 다르게 해서 복수로 만드는 것'

을 말합니다.

 

간단한 예를 통해 알아보도록 하겠습니다.

 

1
2
3
4
5
6
7
8
9
10
public class Overloading {
 
     private static void getSum(int a, int b){
          System.out.println(a+b);
     }
 
     public static void main(String[] args){
          getSum(1,2);
     }
}
cs

 

위와 같은 Overroding 클래스에

두 값의 합을 구하는 getSum 이라는 메서드가 있다고 합시다.

그런데 같은 메서드명으로 세수의 합, 네수의 합을 구하고 싶다고 하면

아래와 같이 같은 이름의 메서드를 파라메터 갯수만 다르게 생성할 것입니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class Overloading {
 
     private static void getSum(int a, int b){
          System.out.println(a+b);
     }
 
     private static void getSum(int a, int b, int c){
          System.out.println(a+b+c);
     }
 
     private static void getSum(int a, int b, int c, int d){
          System.out.println(a+b+c+d);
     }
 
     public static void main(String[] args){
          getSum(1,2);
          getSum(1,2,3);
          getSum(1,2,3,4);
     }
}
cs

 

위와 같이 메서드의 이름은 같지만 파라메터의 개수나 타입을 다르게 구현하는 것오버로딩한다.

라고 합니다.

이해가 되셨나요?

그런데 만약 파라메터 개수가 무한정으로 늘어난다면? 메서드의 개수도 그만큼 늘어나게 되겠죠?

개발자가 멀리해야될 방법입니다..

그래서 자바에서는 오버로딩을 피하는 수만가지 방법을 제공합니다.

예를들면, Generic 이라던지. Variable Argument와 같은...

이런 것들은 차차 알아보기로 하고 이제 오버라이딩에 대해서 알아보겠습니다.

 

오버라이딩은 상속의 개념이 들어가는데요. 우선 상속은 부모(super) 클래스의 변수나 메서드를 자식(sub) 클래스가 가져다 쓸 수 있는 방법 정도만 알고 넘어가도록 합니다. (상속 포스팅이 아니니..)

 

예를 들어 보겠습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Phone{
     void call(){
          System.out.println("전화를 걸어라");
     }
}
 
class SmartPhone extends Phone{
     void call(){
          System.out.println("영상도 보여주고 전화도 걸어라");
     }
}
 
class Overriding {
     public static void main(String[] args){
          SmartPhone sp = new SmartPhone();
          sp.call();
     }
}
cs

 

Phone 클래스가 있고 그 phone을 상속받은 SmartPhone 클래스가 있습니다.

메인메소드에서 SmartPhone을 인스턴스화 해서 call 메소드를 실행하는데요.

출력값은 무엇이 나올까요?

call 메소드와 이름이 같고 파라메터도 없는 것이 똑같은 메소드가 Phone과 SmartPhone 클래스에 둘다 있습니다.

 

결론부터 말씀드리면 SmartPhone의 call 메소드. '영상도 보여주고 전화도 걸어라' 가 콘솔창에 출력됩니다.

SmartPhone 클래스를 생성해서 call 메소드를 호출했으니 SmartPhone의 call 메소드가 실행이 되는 것일까요?

그럼 super 클래스의 레퍼런스 변수는 sub 클래스의 인스턴스를 참조할 수 있으니

Phone sp = new SmartPhone(); 이라고 하면 결과가 뭐가 나올까요?

 

결론은 같습니다. 이게 오버라이딩인데요.

오버라이딩의 정의는 super 클래스에서 정의한 메서드의 이름, 리턴타입, 파라미터 개수, 파라미터 타입까지 완전히 똑같은 메서드를 재정의 하는 것 입니다.

 

그리고 오버라이딩이 적용된 메서드를 호출하게 되면 항상 최 하위 sub 클래스에서 정의된 메소드가 실행됩니다.

그렇기 때문에 SmartPhone 클래스의 call 메소드가 실행되는 것 입니다.  

 

한 가지 더. Phone sp = new SmartPhone(); 이 처럼 super 클래스의 레퍼런스 변수가 sub 클래스의 인스턴스를 참조할 수는 있지만. Overriding 되지 않은 메서드의 호출은 불가합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Phone{
     void call(){
          System.out.println("전화를 걸어라");
     }
}
 
class SmartPhone extends Phone{
 
     void call(){
          System.out.println("영상도 보여주고 전화도 걸어라");
     }
     void setApp(){
          System.out.println("어플을 설치해라");
     }
}
 
class Overriding {
     public static void main(String[] args){
          Phone sp = new SmartPhone();
          sp.setApp();
     }
}
cs

 

위와 같이 참조는 할 수있지만, sp.setApp()에서 컴파일 오류가 발생합니다.

물론, 실제 해당 메서드를 소유한 클래스로 강제 형변환을 해주면 가능하긴 합니다. ((SmartPhone) sp).setApp();

하지만 Override가 되게되면 강제 형변환이 필요없게 되는 것이죠.

 

1
2
3
4
/* 컴파일 에러 없음 */
SmartPhone sp = new SmartPhone();
 
sp.call(); 
cs

 

여기까지 Overloading과 Overriding에 대해서 알아보았습니다.

단순히 단어의 정의가 아닌 확실한 개념을 잡고 가시기 바랍니다.

 

반응형

댓글

💲 추천 글