본문으로 바로가기

자바 객체지향(OOP) 특징 하나인 다형성을 지원하는 방법으로 메소드 오버로딩, 오버라이딩이 있다.

오버로딩과, 오버라이딩을 간단히 정의하자면 다음과 같다.

 

  • 오버로딩 : 동일한 이름을 가지는 메소드를 매개변수의 타입과 갯수로 구분짓도록 하는것을 오버로딩 이라고 한다.
  • 오버라이딩 : 부모(상위) 클래스의 메소드를 재정의 하여 사용하는 것을 오버라이딩 이라고 한다.

 

1. 오버로딩

 

오버로딩은 일반적으로 메소드 오버로딩과 생성자 오버로딩이 있다. 하지만 크게 구분짓지는 않는다.

다음 예제소스를 통해서 확인해 보자.

 

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
public class exOverloading {
    public String strTest;
 
    //기본생성자 - 매개변수 없는 타입의 생성자
    public exOverloading() {
        this.strTest = "기본생성자";
    }
    
    //매개변수가 있는 생성자 - new 클래스명(파라미터)로 객체를 생성하면 해당 생성자가 실행된다.
    public exOverloading(String msg) {
        this.strTest = msg;
    }
    
    //매개변수가 없는 메소드 - 인스턴스변수를 출력
    public void print() {
        System.out.println(this.strTest);
    }
    
    //매개변수가 있는 메소드 - 매개변수를 출력해 준다.
    public void print(String msg) {
        System.out.println(msg);
    }
    
    
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        exOverloading overloading = new exOverloading();
        exOverloading overloading2 = new exOverloading("생성자 오버로딩 테스트");
        
        //생성자 오버로딩에 대한 인스턴스 변수 확인
        System.out.println(overloading.strTest);
        System.out.println(overloading2.strTest);
        
        System.out.println();
 
        //메소드 오버로딩 결과 확인
        overloading2.print();
        overloading2.print("메소드 오버로딩 테스트");
    }
}
 
 

 

 

결과)

    기본생성자
    생성자 오버로딩 테스트

    생성자 오버로딩 테스트
    메소드 오버로딩 테스트

 

 

예제소스를 보면 있듯이 동일한 메소드 생성자 라도 매개변수에 따라 서로다른 메소드 생성자를 호출할 있다는것을 있다.

 

 

 

2. 오버라이딩

 

부모(상위) 클래스의 메소드를 재정의 하여 사용하는 기능을 말한다. 상속을 받았지만 자식클래스 고유의 기능을 별도로 정의할 필요가 있을때 메소드 오버라이딩을 이용한다.  이부분은 상속에서 기본적으로 사용하는 기능이니 숙지하고 넘어 가도록 하자.

 

parent.java

1
2
3
4
5
6
public class parent {
    
    public void print() {
        System.out.println("부모클래스에서 print() 메소드");
    }
}
 
 

 

 

exOverRidding.java

1
2
3
4
5
6
7
8
9
10
11
public class exOverRidding extends parent{
    
    public void print() {
        System.out.println("자식 클래스에서의 print() 메소드");
    }
 
    public static void main(String[] args) {
        parent test = new exOverRidding();
        test.print();
    }
}
 
 

 

 

결과)

	자식 클래스에서의 print() 메소드


자식클래스에서 print()메소드를 재정의 하였다. 객체를 생성하고 메소드를 호출하면 자식클래스에서 재정의한 메소드가 호출되는것을 확인할 있다.

 

 

 

3. 특성에 따른 사용가능 조건

 

구분

오버로딩

오버라이딩

매개변수 개수 타입

 메소드 별로 서로 달라야 사용 가능

 부모클래스와 동일해야함

메소드 이름

 오버로딩 하는 메소드는 모두 동일해야함

 부모클래스와 동일해야함

리턴타입

 조건없음

 부모클래스와 동일해야함

 

표에서 있듯이, 오버라이딩은 말그대로 재정의 이기 때문에 반드시 부모클래스와 매개변수 개수, 타입, 리턴타입, 이름이 동일해야하며 오버로딩은 메소드이름을 제외한 나머지 모두 달라야 사용가능함을 있다.

 

 

 

4. 오버라이딩과 static 메소드

 

static메소드는 실행되기 전에 이미 메모리에 적재되어 있는 것을 말한다. static메소드는 재정의를 위해 사용하는 것은 아니지만 재정의를 한다고 해서 오류가 발생하지는 않는다.

만약 static메소드가 있는 부모 클래스를 상속받아서 해당 static메소드를 재정의하면 자식 클래스에 있는 해당 메소드는 사용할 없다. 이를 하이딩(hidding)이라고 한다.

 

2챕터에서 오버라이딩 예제소스중 print메소드를 static으로 변형한 후에 결과를 확인해 보자.

 

parent.java

1
2
3
4
5
6
7
public class parent {
    
    //static으로 메소드 선언
    public static void print() {
        System.out.println("부모클래스에서 print() 메소드");
    }
}
 
 



exOverRidding.java

1
2
3
4
5
6
7
8
9
10
11
12
public class exOverRidding extends parent{
    
    //부모클래스의 static메소드를 재정의해보자.
    public static void print() {
        System.out.println("자식 클래스에서의 print() 메소드");
    }
 
    public static void main(String[] args) {
        parent test = new exOverRidding();
        test.print();
    }
}
 
 

 

 

결과)

	부모클래스에서 print() 메소드

 

 

2챕터에서의 결과와는 반대로 자식객체를 생성하여 메소드를 호출했는데도 불구하고 부모클래스의 메소드가 수행되었음을 확인할 있다.