메소드 오버로딩은 이름이 같고 인자 목록이 다른 메소드 두 개를 만드는 것이다. 오버로딩을 활용하면 호출하는 쪽의 편의를 위해 같은 메소드를 서로 다른 인자 목록을 가진 여러가지 버전으로 만들 수 있다.
예)
public calss Overloads{
String uniqueID;
public int addName(int a, int b){
return a+b;
}
public double addName(double a, double b){
return a+b;
}
public void setUniqueID(String theID){
uniqueID = theID;
}
public void setUniqueID(int ssNumber){
String numString = "" + ssNumber;
setUniqueID(numString);
}
}
리턴유형이 달라도 된다.
-> 메소드를 오버로드 할때는 인자 목록만 다르면 리턴유형은 달라도 된다.
리턴 유형만 바꾸는 것은 x
-> 인자목록이 같은 상황에서 리턴 유형만 다른 것은 오버로딩이 아니다. 오버로딩은 러턴 유형과는 관계없이 인자목록이 달라야한다
이번에 공부하면서 알게된 점은 오버로딩은 상속이나 다형성과는 관계가 없다는 것이다. 오버로딩된 메소드들은 이름만 같을 뿐 서로 다른 메소드들이다.
오버라이딩은 상위 클래스가 가지고 있는 메소드를 하위 클래스에서 재정의하여 사용하는 것이다. 이 때, 하위 클래스에서 재정의한 메소드는 상위 클래스에서 정의한 메소드와 이름과 리턴 유형이 같아야 한다.
예)
class Animal{
void speak(){
System.out.println("~~~~~~");
}
}
class Dog extends Animal{
void speak(){
System.out.println("bark bark");
}
}
인자는 똑같아야 하고, 리턴 유형은 호환 가능해야한다.
-> 상위 클래스에서 어떤 인자를 받아들이든 오버라이드하는 메소드에서는 똑같은 인자를 사용해야 한다. 그리고 상위클래서에서 어떤 리턴 유형을 선언하든지 오버라이드하는 메소드에서는 똑같은 유형이나 하위클래스 유형을 리턴해야 한다.
메소드를 더 접근하기 어렵게 하면 안된다.
-> 상위클래스의 계약서에서는 다른 코드에서 어떻게 메소드를 사용할 수 있는지에 대해 정의한다. 즉, 접근 단계는 그대로 유지하거나 완화시켜야한다. 예를 들면 public 메소드를 오버라이드 해서 private메소드를 만들 수 없다는 것이다.