자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.
class Car{
int modelNum;
String modelName;
public int setModel(int modelNum){
this.modelNum = modelNum;
return this.modelNum;
}
public String setModel(int modelNum, String modelName){
this.modelName = modelName + modelNum;
return this.modelName;
}
}
public class Overloading {
public static void main(String[] args) {
Car car = new Car();
car.setModel(1234);
System.out.println(car.modelNum);//1234
car.setModel(1234, "car");
System.out.println(car.modelName);//car1234
}
}
위에 코드에서 보면 Car 클래스에는 setModel 이라는 메소드가 2개 있다.
한개는 int 형식을 받아 Car 의 모델 넘버를 return 하며, 다른 메소드는 int, String 두가지를 받아 모델명을 return 한다.
같은 이름을 가진 메소드이지만 다른 인자를 받아 각각 다른 값을 출력 하게 된다.
추가적으로 오버라이딩은 접근 제어자도 자유롭게 지정해 줄 수 있다. 각 메소드의 접근 제어자를 public, default, protected, private으로 다르게 지정해줘도 상관없지만, 접근 제어자만 다르게 한다고 오버로딩이 가능한 건 아니다.
우리가 흔히 콘솔창에 텍스트를 출력할 때 사용하는 println라는 메소드를 대표적인 예로 들어볼 수 있다. 실은 이 함수가 오버로딩의 결정체이다. 우리는 println의 인자 값으로 int, double, boolean, String 등의 아주 다양한 타입의 매개변수들을 집어넣어도 콘솔창에 아주 잘 출력해주는 것을 볼 수 있다.
이렇게 '출력하다.'라는 같은 기능을 가진 메소드들를 println이라는 하나의 이름으로 정의가 가능한 것이다.
println 을 예로 들면 int, double, String 형 등 메소드 매개변수의 종류에 따라서 지정을 해본다고 가정을 해보자.
printlnInt, printlnDouble, printlnString 등 수많은 메소드들의 이름을 정해줘야 할 것이다. 이는 개발자 입장에서는 메소드의 네이밍에 고민을 가중 시키며, 이런 이름들은 다른 곳에 사용할 가능성도 생기게 된다.
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩이라고 한다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생긴다.
class Car{
int speed = 0;
public int setSpeed(int speedChange){
this.speed = this.speed + speedChange;
return this.speed;
}
}
class Car2 extends Car{
int maxSpeed = 80;
@Override
public int setSpeed(int speedChange) {
this.speed = this.speed + speedChange;
this.speed = this.speed > maxSpeed ? maxSpeed : this.speed;
return this.speed;
}
}
public class Overriding {
public static void main(String[] args) {
Car car = new Car();
car.setSpeed(100);
System.out.println(car.speed);//100
Car2 car2 = new Car2();
car2.setSpeed(100);
System.out.println(car2.speed);//80
}
}
위 코드에서 Car 와 Car 를 상속받은 Car2 두개의 클래스가 있다.
Car2 는 Car 에서 상속 받은 setSpeed 메소드를 Overriding 하여 메소드 기능을 변경하였다.
부모 클래스인 Car 는 입력 받은 speed 를 제한 없이 현재 speed 에서 더한 값으로 그대로 출력 되는 반면, 상속 받은 Car2 클래스는 제한 속도가 있어 입력 받은 speed 를 최대 speed 와 비교하여 speed 가 출력 된다.
Reference Link
https://hyoje420.tistory.com/14
https://velog.io/@god1hyuk/Javaclass-%EC%98%A4%EB%B2%84%EB%9D%BC%EC%9D%B4%EB%94%A9overriding%EA%B3%BC-%EC%98%A4%EB%B2%84%EB%A1%9C%EB%94%A9overloading