이와 같이 메소드의 이름은 같도록 하고, 매개 변수만을 다르게 하는 것을 바로 오버로딩(Overloading)이라고 한다.
예제 코드
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | public class ReferenceOverloading { public static void main(String[] args){ ReferenceOverloading reference = new ReferenceOverloading(); } public void print(int data){ } public void print(String data){ } public void print(int intData, String stringData){ } public void print(String stringData, int intData){ } } | cs |
자식 클래스에서 부모 클래스에 있는 메소드와 동일하게 선언하는 것을 메소드 Overriding
이라고 한다. 접근 제어자, 리턴 타입, 메소드 이름, 매개 변수 타입 및 개수가 모두 동일해야만 메소드 Overriding이라고 한다. Overriding이라는 단어의 사전적 의미는 "다른 무엇보다 더 중요한, 최우선시 되는" 이라는 뜻이다.
예제 코드
ParentOverriding 클래스
1 2 3 4 5 6 7 8 9 10 11 | package Overriding; public class ParentOverriding { public ParentOverriding(){ System.out.println("ParentOverriding Constructor"); } public void printName(){ System.out.println("printName() - ParentOverriding()"); } } | cs |
ChildOverriding 클래스
1 2 3 4 5 6 7 8 9 10 11 12 | package Overriding; public class ChildOverriding extends ParentOverriding{ public ChildOverriding(){ System.out.println("ChildOverriding Constructor"); } public void printName(){ System.out.println("printName() - ChildOverriding()"); } } | cs |
InheritanceOverriding 클래스
1 2 3 4 5 6 7 8 9 | package Overriding; public class InheritanceOverriding { public static void main(String[] args){ ChildOverriding child = new ChildOverriding(); child.printName(); } } | cs |
결과는 다음과 같이 출력된다.
ParentOverriding 클래스에 선언된 printName() 메소드가 수행된 것이 아니라, ChildOverriding 클래스에 선언된 printName() 메소드가 호출된 것을 볼 수 있다. 다시 말해서 부모 클래스에 선언되어 있는 메소드와 동일하게 선언되어 있는 메소드를 자식 클래스에 선언하면 자식 클래스의 메소드만 실행된다. 생성자의 경우 자동으로 부모 클래스에 있는 생성자를 호출하는 super()가 추가되지만, 메소드는 그렇지 않다. 이게 바로 메소드 Overriding이다.
그리고 동일하게 선언되어 있다는 말은 동일한 시그니처
를 가지고 있다는 말과 동일하다. 여기서 시그니처는 메소드 이름과 매개 변수의 타입 및 개수를 의미한다. 또한 부모 클래스를 Overriding한 메소드의 리턴 타입을 다르게 리턴하면 안 된다. 또한 접근 제어자가 더 확대되는 것은 문제가 안 되지만, 축소되는 것은 문제가 발생한다. 즉, public > package-private > private(오른쪽으로 갈수록 접근 권한이 좁아짐)의 순인데, 예를 들어 부모 클래스에서 public으로 선언한 것을 자식 클래스에서 private으로 선언할 수 없다. 부모가 만약 private으로 선언했으면 자식은 어떤 것으로 선언하든지 상관 없다.
Overriding에 대해 정리하면 다음과 같다.
참고