메서드의 이름은 같고 매개변수의 유형과 개수가 다르도록 하는 것을 의미한다.
→ 기존에 없던 새로운 메서드를 정의하는 것이다.
class OverloadingMethods{
public void print(){
System.out.println("오버로딩1");
}
String print(Integer a){
System.out.println("Integer -오버로딩2");
return a.toString();
}
void print(String a){
System.out.println("String - 오버로딩3");
System.out.println(a);
}
String print(Integer a , Integer b){
System.out.println("Integer , Integer - 오버로딩4");
return a.toString() + b.toString();
}
}
class OverloadingTest{
public static void main(String[] args){
OverloadingMethods om = new OberloadingMethods();
om.print();
System.out.println(om.print(3));
om.print("Hello");
System.out.println(om.print(4,5));
}
}
-> 실행결과
오버로딩1
Integer - 오버로딩2
3
String - 오버로딩3
Hello
Integer , Integer - 오버로딩4
45
매서드의 이름을 중복하여 사용할 수 있다는 장점이 있다.
오버로딩은 매개변수의 타입이 달라야하며 , 매개변수의 개수가 달라야하며 , 매개변수의 순서가 달라야 사용할 수 있다
상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것을 의미한다.
(메서드의 이름은 물론 파라미터의 개수나 타입도 동일해야하며 , 주로 상위 클래스의 동작을 상속받는 하위 클래스에서 변경하기 위해 사용된다)
→ 즉 오버라이딩은 상속받은 메서드의 내용만 변경하는 것이다.
메서드의 이름이 서로 같고 , 매개변수가 같고 , 반환형이 같을 경우에 상속받은 메서드를 덮어 쓴다
class SuwonMember{
String test(){
return "저는 수원에 거주중입니다"
}
}
class SuwonMember extends SuwonMember{
'extends SuwonMember를 통해 부모클래스를 상속을 받는'
String test(){
return "저는 수원 입니다"
}
}
public class OverridingTest{
public static void main(String[] args){
SuwonMember sm = new SuwonMember();
System.out.println(sm.test());
}
}
주의 할 점
자식 클래스에서 오버라이딩하는 메소드의 접근 제어자는 부모 클래스보다 더 좁게 설정할 수 없다.
예외는 부모 클래스의 메소드보다 많이 선언 할 수 없다.
static 메서드를 인스턴스의 메서드로 또는 그 반대로 바꿀 수 없다.
(상위 클래스의 static 메서드는 클래스에 속하는 메서드이기 때문에 상속되지 않고 따라서 오버라이딩 되지 않는다 또한 final이 지정된 메서드 역시 오버라이딩이 불가능하다.
🦖 오버라이딩과 오버로딩의 차이점private 접근 제어자를 가진 메서드는 상속 자체가 불가능하기 때문에 오버라이딩이 성립되지 않는다).
오버라이딩
접근제어자 : 부모 클래스의 메소드의 접근 제어자보다 더 넓은 범위의 접근 제어자를 자식 클래스의 메소드에서 설정 할 수 있다
리턴형:동일해야 한다.
메소드명 :동일해야 한다.
매개변수 :동일해야한다.
적용범위 :상속관계에서 적용된다
오버로딩
접근 제어자 :모든 접근 제어자를 사용할 수 있다
리턴형:달라도 된다.
메소드명 :동일해야 한다.
매개변수 :달라야 한다.
적용범위 :같은 클래스 내에서 적용된다.