3월 25, 2024

오버로딩과 오버라이딩 차이 (overloading vs. overriding)

1. 오버로딩 (overloading)과 오버라이딩 (overriding)의 차이

Java에서 흔히 혼동되는 개념으로 오버로딩과 오버라이딩이 있다. 

이 두 개념은 매우 간단하지만 기술면접에도 자주 등장하는 주제이기 때문에 정확히 알아두면 좋다. 

각각의 차이점과 개념을 정확히 알아두자.


1) overloading : 오버로딩

메서드의 매개변수의 유형과 개수를 다르게 하면서 같은 이름의 메서드를 가지는 것

 

overloading의 예시를 들어보면 아래와 같다.

void greetings(String s){
System.out.println(s);
}

void greetings(String person, String s){
System.out.println("Say" + s+ " to "+person); //person에게 s라고 인사해라
}

위와 같이 두 메소드 모두 인사를 하는 메소드임에도 불구하고 상황에 따라서 매개변수가 다르게 들어가는 경우가 있다. 

 

물론 이러한 경우에 method의 이름을 다르게 정의한다면 해결되는 일이지만, 코드상으로 같은 기능을 가지는데 이름을 다르게 정의하는 것은 좋은 코딩이 아니다.

 

이런 것을 방지하기 위해 Java에서 제공하는 기능이 overloading 인 것이다. C++의 경우 연산자 overloading이라는 기능 또한 제공하지만 Java에서는 연산자 overloading은 제공하지 않는다라는 것을 추가적으로 알아두면 좋을 것 같다.


2) overriding: 오버라이딩

상위 클래스가 가지고 있는 메서드를 하위 클래스에서 재정의해서 사용하는 것을 overriding이라고 한다. 상속을 하다 보면 하위 클래스에서 똑같은 메서드를 구현하지만 변형이 필요할 때가 있다. 이 또한 예시를 들어 설명해보겠다.

 

만약 Human 이라는 class가 상위클래스이고, 이를 상속받은 Student라는 class가 있다고 해보자. 그럴 경우, 두 class 모두 who 라는 메서드를 가질 수 있고 이 메서드는 해당 객체가 어떤 사람인지를 출력해주는 것이라고 해보자. 그러면 모든 사람은 이름을 가지기 때문에 아래와 같이 작성할 수 있다. 

 

class Human{ //부모클래스
    public String name;

    public void who(){
        System.out.println("이 사람의 이름은 "+name+"입니다.");
    }
    
}

반면 Student라는 class는 여기에 더해, 이 학생이 다니고 있는 학교 이름까지 담고 있을 수 있고, who 라는 메서드에서 이러한 정보도 같이 출력하고 싶을 수 있다. 

class Student extends Human{ //자식 클래스
	String school; 
    public void who(){
        System.out.println("이 사람의 이름은 "+name+"이고 학교는 "+school+"학교에 다닙니다");
    }
    
}

위에서 알 수 있듯이 Student class의 who 메서드는 상위클래스에서 적용된 who 메서드에 school 정보까지 출력하고 있다는 것을 알 수 있다. 

 

즉 위와 같이 같은 이름의 메서드이지만 상위클래스의 메서드를 하위클래스에서 다시 덮어쓰는 방식을 우리는 overriding이라고 한다. 

 


overloading과 overriding은 Java에서 다형성을 구현하는 데 핵심이 되는 기능이다. 

이러한 기능을 잘 사용하면 Java의 OOP적인 특성을 더 강화할 수 있고 코드를 더 compact하게 작성할 수 있다는 장점이 있으니 최대한 활용해보길 권장한다.