공통 기능의 함수를 하나의 이름으로 묶어주는 것을 말한다
public static void main(String[] args) {
OverloadingMethods om = new OverloadingMethods();
om.print();
System.out.println(om.print(3));
om.print("Hello!");
System.out.println(om.print(4, 5));
}
}
class OverloadingMethods {
public void print() {
System.out.println("오버로딩1");
}
String print(Integer a) {
System.out.println("오버로딩2");
return a.toString();
}
void print(String a) {
System.out.println("오버로딩3");
System.out.println(a);
}
String print(Integer a, Integer b) {
System.out.println("오버로딩4");
return a.toString() + b.toString();
}
}
오버로딩1
오버로딩2
3
오버로딩3
Hello!
오버로딩4
45
위 예제는 print라는 같은 이름을 가진 네개의 메소드가 매개변수의 개수와 타입를 다르게 지정하여 지정하는 것이 가능하지만 '리턴 값'만 다르게 지정하는 것은 오버로딩할 수 없다.
즉 오버로딩은 매개변수의 차이로만 구현할 수 있다
오버로딩을 사용하는 이유는 동일한 기능을 하는 메서드를 하나의 이름으로 처리할 수 있고 메소드의 이름을 절약할 수 있기 때문이다.
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것
public class OverridingTest {
public static void main(String[] args) {
Person person = new Person();
Child child = new Child();
Senior senior = new Senior();
person.cry();
child.cry();
senior.cry();
}
}
class Person {
void cry() { ★여기서 default은 아무것도 적지 않아도 된다.
System.out.println("흑흑");
}
}
class Child extends Person {
@Override
protected void cry() {
System.out.println("잉잉");
}
}
class Senior extends Person {
@Override
public void cry() {
System.out.println("훌쩍훌쩍");
}
}
오버라이딩은 재정의 하려는 메서드의 파라미터값을 변경해서도 안되고 이름을 변경해서도 안된다.
또한 부모 클래스의 메서드보다 자식 클래스의 메서드 접근제한이 동일 하거나 넓어야 한다.
즉 자식 클래스의 메서드가 부모 클래스의 메서드를 대체할 수 있어야 한다.
※접근 영역: public > protected > default > priva
ex) 부모클래스에서 protected가 선언되면 protected보다 좁은 private나 default는 올 수 없다
오버라이딩을 사용하는 이유는자식클래스가 부모클래스의 메서드를 상속 받아도 다른 기능을 사용할 수 있기 때문이다.