# 오버로딩과 오버라이딩
오버로딩과 오버라이딩에 대한 내 생각 💭
오늘은 오버로딩과 오버라이딩에 대해 정리해보려고 한다. 사실 처음에는 헷갈리기도 했고, 지금도 완벽하게 이해한 건 아니지만, 그래도 내 생각을 풀어보려고 한다.
오버로딩 (Overloading) 🔧
오버로딩은 "과적하다"는 의미가 있다고 했다. 이름이 같아도 매개변수의 개수, 타입, 순서를 다르게 해서 같은 이름으로 여러 메서드를 정의할 수 있다는 거였다. 예를 들어 add(int a, int b)
랑 add(double a, double b)
같은 거였다. 이런 게 왜 필요할까?
처음엔 왜 이름을 같은 걸로 써야 할까? 싶었다. 매개변수가 다르면 메서드 이름도 달리 해야 하는 거 아닌가? 그런데, 이렇게 같은 이름을 쓰는 이유는 유연하게 메서드를 호출할 수 있고, 코드를 깔끔하게 유지할 수 있기 때문이었다. 매개변수만 다르게 해서 같은 이름으로 여러 가지 처리를 할 수 있다는 게 직관적이어서 좋은 거였다.
그리고 오버로딩은 같은 클래스 내에서만 사용한다고 했다. 다른 클래스에서 오버로딩을 할 수 없다는 점도 궁금했는데, 아마 메서드를 하나로 묶어서 관리할 수 있기 때문인 것 같다.
오버라이딩 (Overriding) 🌟
다음은 오버라이딩이다. 오버라이딩은 상위 클래스의 메서드를 하위 클래스가 재정의하는 거였다. 상속 관계에서 주로 사용된다. 근데 상속받은 메서드를 왜 다시 정의해야 할까? 그냥 부모 클래스의 메서드를 쓰면 되지 않나?
그런데, 하위 클래스에서 부모 클래스의 메서드를 그대로 쓸 수도 있지만, 그 메서드가 하위 클래스의 상황에 맞게 변경이 필요할 때 오버라이딩을 사용해야 한다는 거였다. 예를 들어 동물 클래스에서 makeSound()
메서드를 상속받은 고양이는 "야옹", 개는 "멍멍"처럼 각각 소리를 내게 만들 수 있다. 이럴 때 오버라이딩이 유용하다.
오버라이딩이 안 되는 경우도 있다고 했다. static
메서드나 final
메서드는 오버라이딩이 불가능하다. static
은 클래스 레벨에서 관리되니까 인스턴스 레벨에서 재정의할 수 없고, final
은 재정의를 막기 위해서 그렇다.
마무리 🤔
- 오버로딩은 매개변수 차이에 따라 같은 이름의 메서드를 여러 번 정의해서 코드가 유연해지고 깔끔해진다.
- 오버라이딩은 상속받은 메서드를 하위 클래스에서 재정의해서, 각 객체가 특화된 동작을 하게 만든다.