Dev.GA

[JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding) 본문

Dev.Back-End/JAVA

[JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding)

Dev.GA 2018. 3. 8. 14:46


[JAVA] 오버로딩(Overloading)과 오버라이딩(Overriding)



오버로딩(Overloading)과 오버라이딩(Overriding)


이름부터 너무나 비슷해서 항상 헷깔리는 개념이다. 더군다나 왜 이렇게 항상 반대로 착각하는지...

그래서 오늘은 오버로딩과 오버라이딩에 대해서 알아보고 개념을 확실하게 알아두는 시간을 가지도록 하자.


사실 오늘 포스팅하는 오버로딩과 오버라이딩은 앞서 조금씩 다뤘다.

다형성과 상속이란 개념에서 나올 수 있는 이야기인데 오늘은 자세히 알아보자.




1. 오버로딩(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
public class Overloading {
 
    public void Calculator(){
        System.out.println("매개변수가 없습니다.");
    }
    
    public void Calculator(int num1){
        System.out.println("인수 : " + num1);
        
    }
    
    public void Calculator(int num1, int num2){
        System.out.println("인수1 : " + num1);
        System.out.println("인수2 : " + num2);
        System.out.println("합계 : " + num1+num2);
    }
    
    public static void main(String[] args) {
        Overloading over = new Overloading();
        
        over.Calculator();
        over.Calculator(1);
        over.Calculator(12);
 
    }
 
}
cs


위의 코드를 실행하면 다음과 같은 결과가 나온다.


매개변수가 없습니다.

인수 : 1

인수1 : 1

인수2 : 2

합계 : 12


동일한 이름의 Calculator()라는 메소드가 3개가 있다. 메소드 명은 동일하나 매개변수의 갯수가 전부 다르기때문에 main함수에서 3번의 다른 매개변수로 호출할 수 있다.


2. 오버라이딩(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
39
40
41
42
43
44
public class Overriding {
    
    public class ParentClass{
        
        public void Parent(){
            System.out.println("I am a Parent Method");
        }
    }
    
    public class ChildClass1 extends ParentClass{
        
        public void Parent(){
            System.out.println("I am a Child1 Method");
        }
    }
    
    public class ChildClass2 extends ParentClass{
        
        public void Parent(){
            System.out.println("I am a Child2 Method");
        }
    }
    
    public static void main(String[] args){
    
        Overriding over = new Overriding();
        
        ParentClass pc = over.new ParentClass();
        pc.Parent();
        
        ParentClass pc1 = over.new ChildClass1();
        pc1.Parent();
        
        ParentClass pc2 = over.new ChildClass2();
        pc2.Parent();
        
        ChildClass1 cc1 = over.new ChildClass1();
        cc1.Parent();
        
        ChildClass2 cc2 = over.new ChildClass2();
        cc2.Parent();
    }
 
}
cs


위의 실행결과를 보면


I am a Parent Method

I am a Child1 Method

I am a Child2 Method

I am a Child1 Method

I am a Child2 Method


이렇게 나온다.


위의 예시 코드 중 5번의 Parent() 메소드를 호출했는데, 31번째 라인)34번째 라인)을 보면 자식클래스(ChildClass)를 부모클래스(ParentClass)로 인스턴스화 하였다. Parent()라는 메소드는 모두 동일한데 부모로부터 상속받은 Parent() 메소드를 자식클래스에서 재정의하여 사용한다고 보면된다. 그래서 pc1, pc2의 Parent()메소드를 호출해도 ChildClass의 Parent()메소드가 실행되는 것이다.

Comments