자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
1. 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있습니다.
콘솔창에 텍스트를 출력할 때 사용하는 println 이라는 메소드 대표적인 오버로딩의 예입니다.
println의 인작값으로 int, double, boolean, String 등 다양한 타입의 매개변수를 넣어도 콘솔창에 문제 없이 잘 출력되는데, 이렇게 '출력하다' 라는 같은 기능을 가진 메소드들을 println 이라는 하나의 이름으로 정의가 가능한것입니다!
2. 메소드의 이름을 절약할 수 있습니다.
1번 이유에서 예로 들었던 println 메소드를 매개변수의 종류에 따라 다르게 지정하면 printlnInt, printDouble, printBoolean 등 수많은 메소드들의 이름을 정해주어야합니다.
이는 프로그래머의 입장에서는 메소드의 네이밍에 고민을 가중시키고, 이런 이름들은 다른 곳에 사용해야하는 가능성도 생기게됩니다.
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩이라고합니다.
상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생깁니다.
메소드의 선언부는 기존 메소드와 완전히 같아야합니다. (이름, 매개변수, 리턴타입)
접근제어자를 좁은 범위로 변경할 수 없다.
ex. 조상의 메소드가 Protected 라면, 범위가 같거나 넓은 Protected or public으로만 변경할 수 있다.
비교 요소 | 메소드 오버로딩 | 메소드 오버라이딩 |
---|---|---|
선언 | 같은 클래스나 상속 관계에서 동일한 이름의 메소드 중복 작성 | 서브 클래스에서 슈퍼 클래스에 있는 메소드와 동일한 이름의 메소드 재작성 |
관계 | 동일한 클래스 내 혹은 상속 관계 | 상속 관계 |
목적 | 이름이 같은 여러 개의 메소드를 중복 작성하여 사용의 편리성 향상, 다형성 실현 | 슈퍼 클래스에 구현된 메소드를 무시하고 서브 클래스에서 새로운 기능의 메소드를 재정의하고자 함. 다형성 실현 |
조건 | 메소드 이름은 반드시 동일하고, 매개변수 타입이나 개수가 달라야 성립 | 메소드의 이름, 매개변수 타입과 개수, 리턴 타입이 모두 동일하여야 성립 |
바인딩 | 정적 바인딩, 호툴될 메소드는 컴파일 시에 결정 | 동적 바인딩, 실행 시간에 오버라이딩된 메소드를 찾아 호출 |
정보가 많아서 도움이 많이 됐습니다.