엄연히 다른 조건을 가지고 있지만 막상 사용하려 하면 비슷하게 느껴져 많은 혼동을 주었다.
오버 로딩과 오버 라이딩에 이해가 부족하여 코드 작성 시 많은 이슈가 발생하였고,
코드의 가독성도 떨어질뿐더러 전체적으로 보았을 때 생산성도 떨어지게 되었다.
이를 정리함으로써 개념을 바로 잡고자 한다.
오버 로딩(Overloading)
오버 로딩이란 메서드의 구별이라고 할 수 있다.
Java에서는 한 클래스 안에서 같은 이름을 가진 여러 메서드를 사용할 수 있다.
하지만 메서드 명이 모두 같다면 컴파일러는 어떤 메서드를 사용해야 할지 혼동을 한다.
이러한 이슈를 방지하기 위해 오버 로딩을 사용하는 것이다.
그럼 메서드를 구별하기 위해서 어떻게 해야 할까?
오버 로딩은 다음과 같은 조건을 갖는다.
- 메서드 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
다음과 같은 조건으로 작성된 매서드들은 메서드 이름이 같더라도 매개변수가 다르게 구성되었기 때문에
구별이 가능한 것이다.
그렇다면 오버 로딩을 사용하는 데에 이점이 무엇이 있을까?
메서드를 생성할 때를 생각해보자 이름으로만 구별이 된다면 한 클래스 안에서 매번 생성할 때마다 새로운 이름을
지어줘야 한다. 그렇게 된다면 같은 기능을 하는 메서드이지만 이름을 작성하기에 어려움을 느낄 수 있고, 사용할 때에
메서드 이름을 모두 기억하고 있어야 하는 불편한 점이 있다.
하지만 오버 로딩을 통해 하나의 메서드 이름만 기억하면 사용할 수 있어 메서드 이름을 지어줄 때 고민을 덜 수 있고, 또한 어떤 기능을 하는지 추측이 가능 다는 장점이 있다.
오버 라이딩(OverRiding)
상속의 개념 안에서 사용되는 것이다.
부모 클래스로부터 상속받은 메서드의 내용을 변경하는 것으로 상속받은 메서드 내용을 자식 클래스에 맡게 내용을 변경해야 하는 경우가 있다. 이러한 작업을 오버 라이딩이라 한다.
오버 라이딩의 성립 조건은 무엇일까?
오버 라이딩은 다음과 같은 조건을 가진다.
- 부모 클래스의 메서드와 이름이 같아야 한다.
- 매개변수가 같아야 한다.
- return타입이 같아야 한다.
또 하나 주의해야 할 것!
접근 제어자와 예외는 제한된 조건에서만 변경이 가능하다.
접근 제어자는 부모 클래스의 메서드보다 좁은 범위로 변경할 수 없다. 즉 부모 클래스에서 정의된 메서드의 접근제어 자보다 넓은 범위의 접근제어자로만 변경이 가능하다.
또 부모 클래스의 메서드보다 많은 예외를 선언할 수 없다.
부모 클래스에 정의된 메서드의 예외 수 보다 자식 클래스에 상속된 메서드의 예외 수가 적어야만 오버 라이딩이 가능하다.
정리
정리하고 보면 오버 로딩과 오버 라이딩 둘의 차이는 명확히 나뉜다.
오버 로딩은 새로운 메서드를 정의하는 것이고,
오버 라이딩은 부모 클래스로부터 상속받은 메서드 내용을 변경하는 것이다.