티스토리 뷰

 자바에는 Overloading과 Overriding이 있습니다. 이 두 가지는 이름도 비슷하고 메소드를 재정의하는 일을 하기에 자주 헷갈리는 개념입니다. 먼저 단어의 뜻부터 한번 보겠습니다. Overloading을 네이버에 검색하면 '과적의'라는 뜻이 뜹니다. 과적의, 그러니까 뭔가 많이 실려 있다는 뜻입니다. Overriding을 네이버에 검색하면 '우선시 되는' 등의 뜻이 뜹니다. 다른 것보다 우선시 된다는 뜻이겠죠? 이렇게 한글로 변역해서 보면 뜻부터 큰 차이가 납니다.


Overloading(과적의)
 
 과적의, 많이 실려 있다는 뜻의 Overloading부터 알아보도록 하겠습니다. Overloading은 한 클래스 내에서 메소드의 재정의를 뜻하는 말입니다. 만약에 우리가 계산기를 만든다고 가정해봅시다. 최초 설계대로 인자를 두 개 받는 계산기를 만들었습니다. 그런데, 만들고 나서 보니 인자를 세 개 받아야 할 경우도 있고 네 개를 받아야 할 경우도 생겼습니다. 그런데 메소드를 다시 이름 붙여서 만들기는 부적절해 보입니다. 어차피 똑같은 행동을 수행하고 인자 갯수만 다른 메소드인데 새로 이름 붙여서 만드는 것은 생산성이 떨어지는 행동이죠. 특히나 메소드나 변수 이름을 붙이는데 가장 큰 고민을 하는 개발자 입장에서는 더더욱 말이죠. 그래서 나온게 바로 오버로딩입니다. 먼저 아래 코딩을 보시겠습니다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package blog;
 
public class Ex_class {  
    public static void main(String[] args) {  
        calculator cal = new calculator();  
        cal.plus(35);  
        cal.division(102);  
        cal.minus(61);  
        cal.multiple(93);    
        cal.plus(345); 
        cal.plus(43105); 
    }
}
 
class calculator {  
    public void plus(int num, int num2) {  
        System.out.println(num + num2); 
    }  
    public void minus(int num, int num2) {  
        System.out.println(num - num2); 
    }  
    public void multiple(int num, int num2) { 
        System.out.println(num * num2); 
    }  
    public void division(int num, int num2) {  
        System.out.println(num / num2); 
    }  
    public void plus(int num, int num2, int num3) { 
        System.out.println(num + num2 + num3); 
    } //overloading  
    public void plus(int num, int num2, int num3, int num4) {  
        System.out.println(num + num2 + num3 + num4); } //overloading 
    /*public void plus2(int num, int num2, int num3) {  System.out.println(num + num2 + num3); }*/  
}
cs


위 코딩을 보면 plus 메소드가 같은 이름으로 재정의 되어 있는 것을 확인할 수 있습니다. 첫 번째 plus 메소드는 인자를 두가지 받고 두 번째 plus 메소드는 인자를 셋, 세 번째 plus 메소드는 인자를 네개 받도록 되어 있습니다. 이를 메소드를 재정의한다, 즉 오버로딩한다라고 할 수 있습니다. 가장 밑에 주석처리한 plus2는 위에서 설명했듯이 생산성도 떨어지고 혼란을 줄 수 있기에 위와 같이 오버로딩이 탄생하게 된겁니다. 개발자들은 이를 통해서 또다시 이름을 지어야 한다는 커다란 부담감에서 벗어날 수 있게 되었습니다.


Overriding(우선시 되는)
 
 그럼 이번에는 우선시 된다는 뜻을 가진 Overriding을 알아보겠습니다. 오버라이딩은 상속과 관련 된 용어입니다. 우리가 계산기를 만드는데 기본 틀이 되는 계산기를 이미 만들어 놓았다고 가정해봅시다. 여기에 다른 기능이 추가되는 다른 계산기를 만들기 위해 기본 계산기를 상속 받았습니다. 그런데, 기존에 있던 기능들을 고쳐서 사용하고 싶습니다. 하지만, 기본 틀을 고치기에는 이미 많은 계산기들이 이 기본틀을 상속 받았기에 건드리기가 어렵습니다. 이럴 때 사용되는 것이 오버라이딩입니다. 아래 코딩을 보겠습니다. 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package blog;
 
public class Ex_class {  
    public static void main(String[] args) {  
        calculator cal = new calculator();  
        cal.plus(35);  
        cal.division(102);  
        cal.minus(61);  
        cal.multiple(93);    
        superCalculator scal = new superCalculator();  
        scal.plus(43);   
    }
}
 
class calculator {  
    public void plus(int num, int num2) {  
        System.out.println(num + num2); 
    }  
    public void minus(int num, int num2) {  
        System.out.println(num - num2); 
    }  
    public void multiple(int num, int num2) {  
        System.out.println(num * num2); 
    }  
    public void division(int num, int num2) {  
        System.out.println(num / num2); 
    }  
}
 
class superCalculator extends calculator { 
    public void sqrt(int num) {  
        double sqrtResult = Math.sqrt(num);  
        System.out.println(sqrtResult); 
    }  
    public void plus(int num, int num2) {  
        System.out.println("결과 값은 " + (num + num2) + "입니다.");  
    } //Overriding}
}
cs


 위 코딩을 보면 calculator 클래서를 상속 받은 superCalculator에 plus라는 메소드가 재정의 되어 있는 것을 확인할 수 있습니다. 그 후에 메인 부에서 superCalculator의 인스턴스를 만든 후 plus 메소드를 실행시키면 superCalculator에서 재정의 된 메소드가 실행되는 것을 확인할 수 있습니다. 이처럼 부모 클래스에서 물려 받은 메소드를 자식 클래스에서 재정의하면 자식 클래스의 메소드를 실행하는 것을 오버라이딩이라고 합니다.

 지금까지 오버로딩과 오버라이딩에 대해서 알아보았습니다. 결론적으로 간단히 말하면 두 가지가 하는 일을 비슷하나 활동하는 영역이 다르다고 할 수 있겠습니다. 오버로딩은 한 클래스 내에서 메소드를 재정의하고, 오버라이딩은 부모 자식 간에서 메소드를 재정의합니다. 계속 헷갈리시는 분들은 제가 그랬듯이 간단하게 영어 단어 뜻을 외우는 것도 좋은 방법이라고 생각합니다.

 

'IT > Java' 카테고리의 다른 글

Java - enum  (0) 2017.03.05
Java - Interface(인터페이스)  (0) 2017.03.05
Java - abstarct class(추상 클래스)  (0) 2017.03.05
Java - 상속(Inheritance)  (0) 2017.03.05
Java - Class와 instance  (0) 2017.02.26
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday