본문 바로가기

Java

Overloading / Overriding

오버로딩(Overloading) vs.오버라이딩(Overriding)



오버로딩(Overloading): 중복정의

1-1. Overloading의 정의

매개변수의 개수나 형식이 다를 때 같은 메소드명을 사용할 수 있게 지원하는 기능이다.

1-2. Overloading의 조건

    • 메소드명이 같아야 한다.
    • 매개변수의 타입이나 개수는 달라야 한다.
    • 매개변수는 같으나 반환형이 다르면 오버로딩이 불가하다.

1-3. Overloading 예제

1
2
3
4
5
6
7
8
9
10
11
class Dog{
    public void bark(){
        System.out.println("woof ");
    }
    //overloading method
    public void bark(int num){
        for(int i=0; i<num; i++){
            System.out.println("woof ");
        }
    }
}
cs
위 예제에서 bark() 메서드는 다른 매개 변수를 사용하여 호출할 수 있다. 

단순 bark()를 호출하면 "woof"를 출력할 것이고
bark(2)를 호출하면 "woof"를 2번 출력할 것이다. 

컴파일러는 메소드 signature (메소드명과 파라미터)가 다르므로 서로 다르다는 것을 알고 있다.


오버라이딩(Overriding): 재정의

2-1. 오버라이딩(Overriding) : 재정의

부모(슈퍼클래스)로부터 메소드를 상속받았지만 슈퍼클래스의 메소드를 사용하는 것이 아니라, 
서브클래스에서 메소드를 재정의해서 사용하는 것이다.


2-2. 오버라이딩의 조건:
    • 메소드명이 같아야 한다.
    • 매개변수의 개수, 타입이 같아야 한다.
    • 리턴타입이 같아야 한다. 

Overriding 예제
class Dog{
public void bark(){
System.out.println("woof ");
}}class Hound extends Dog{
public void sniff(){
System.out.println("sniff ");
}
public void bark(){
System.out.println("bowl");
}}
public class OverridingTest{
public static void main(String [] args){
Dog dog = new Hound();
dog.bark();
}}
결과:
bowl
위의 예에서 dog 변수는 Dog 객체로 선언되었다. 컴파일하는 동안 컴파일러는 Dog 클래스에 bark() 메소드가 있는지 확인할 것이다.
확인결과 Dog 클래스가 bark () 메소드를 가지고 있으면, 코드컴파일러 실행시간에 Hound가 생성되어 dog에게 할당된다. 

JVM은 dog가 Hound의 객체를 참조하고 있음을 알고 있으므로 Hound의 bark () 메소드를 호출하는데 이를 동적 다형성(Dynamic Polymorphism) 이라고 한다.