먼저 자바의 Overloading에 대해서 알아보겠습니다. 자바의 Overloading은
함수의 다형성을 지원하기 위하여 탄생한 개념입니다.
자바에서 Overloading은 클래스 내부에 동일한 이름을 가지는 메소드가 이미 존재할 때
이 메소드와 같은 이름을 가지면서 매개변수의 타입 또는 개수가 달라지도록
설정하는 방법입니다.
가장 쉬운 예로 자바에는 System.out.println() 이라는 출력 메소드가 존재합니다.
우리는 이 메소드에 int타입을 매개변수로 주던, String 타입을 매개변수로 주던
모두 동일한 System.out.println() 이라는 함수를 호출합니다.
이러한 다형성을 지원하기 위해 만들어진 개념이 바로 Overriding입니다.
메소드 오버로딩을 하기 위해서는 몇 가지 조건이 존재하며 그 조건은 다음과 같습니다.
1. 오버로딩 하려는 메소드의 이름이 같아야 한다.
2. 매개변수의 개수 혹은 타입이 달라야 한다.
3. 리턴값만 다른 것은 오버로딩할 수 없다.
간단해 보이지만 꼭 지켜줘야 하는 규칙들입니다. 이 세 가지의 규칙을
모두 지켜줘야 자바 컴파일러는 메소드 오버로딩을 성공적으로 처리할 수 있습니다.
오버로딩은 어떤 경우에 필요하고, 오버로딩을 하게 된다면 개발자는 어떤 이점을
얻을 수 있을까요? 크게 얻을 수 있는 이점은 여러 가지가 있지만 하나를 생각한다면
동일한 기능을 하는 메소드를 하나의 이름으로 처리할 수 있다는 장점이
가장 큰 장점인 것 같습니다. 위에서 보았던 println은 int를 출력하던
char를 출력하던 모두 동일한 기능을 제공하지만, 타입에 따른 호출명이 다르다면
그 메소드를 사용하려는 입장에서는 사용하려는 형태마다 모두 함수 이름을 알고 있어야
하기 때문에 굉장히 불편한 상황이 오게 됩니다. 따라서 개발자의 편의성을
고려하고 함수의 다형성을 지원하기 위해 고안된 개념이라고 생각하면 될 것 같습니다.
메소드 오버라이딩이란 상속 관계에서, 부모 클래스로부터 상속받은 메소드를
자식 클래스에서 재정의 하는 행위를 오버라이딩이라고 합니다.
객체지향 디자인 패턴에서 중요한 개념인 상속 관계에서는 어떠한 클래스가 다른 클래스를
상속받는 경우가 많이 있습니다. 실제로 자바에선 모든 참조 클래스의 부모로 Object라는
클래스가 존재하죠 이처럼 부모에게 상속받은 메소드를 그대로 사용할 수도 있지만
이 메소드를 자식 클래스에서 상황에 맞게 수정해야 하는 경우에 바로 메소드 오버라이딩을
사용하게 됩니다.
오버로딩과 마찬가지고 오버라이딩에도 조건이 필요합니다. 오버라이딩을 하기 위해서는
1. 오버라이딩하려하는 메소드의 이름, 매개변수, 리턴 값이 모두 동일해야 한다.
2. @Override라는 Annotation을 표기해주어야 한다 ( 필수는 아니지만, 필수라고 생각하자 )
3. 부모의 접근 제어자보다 축소된 범위를 가질 수 없다
오버라이딩의 규칙은 오버로딩과 조금 다른데 오버로딩은 내부의 동작을 재정의하는 행동이므로,
메소드의 이름, 매개변수, 리턴값이 모두 부모와는 동일해야 합니다.
또한 3번이 굉장히 중요한데, 만약 오버라이딩하려는 메소드의 접근 제어자를 부모가
public으로 선언했다면, 오버라이딩 메소드는 이 범위보다 좁은 범위의 접근 제어자를
사용할 수 없습니다.
접근 제어자의 범위는 ( public > protected > package-private > private ) 순서인데
만약 부모다 private으로 접근 제어자를 설정했다면 자식의 오버로딩 메소드는 public으로 선언이 가능합니다.
하지만 부모가 public으로 선언했다면 자식은 무조건 public으로밖에 선언할 수 없습니다 !
위에서도 말했듯이, 자식 클래스가 부모 클래스의 메소드를 상속받아도 다른 기능을
수행하고자 하는 경우가 생깁니다. 가장 흔한 경우가 바로 Object Class의 toString 기능입니다.
모든 참조 클래스는 Object 클래스를 기본적으로 상속받기 때문에 toString() 메소드가 존재하는데
우리는 새롭게 선언한 클래스가 Object 클래스의 toString과는 다른 String 값을
출력하도록 설정해야 하는 경우가 종종 존재합니다. 이런 경우에 메소드 오버라이딩을 사용합니다.