티스토리 뷰

728x90

오버로딩(Overloading) 이란?

자바의 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메소드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메소드를 정의할 수 있다.

 

오버로딩의 조건

  • 메소드의 이름이 일치해야 함
  • 메소드 매개변수의 개수 또는 타입이 달라야 함 (개수가 같다면 타입, 타입이 같다면 개수를 다르게 해야함)
  • 메소드의 return 타입이 달라야 함

 

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으로 다르게 지정해줘도 상관없지만, 접근 제어자만 다르게 한다고 오버로딩이 가능한 건 아니다.

 

오버로딩을 사용하는 이유

1️⃣ 같은 기능을 하는 메소드를 하나의 이름으로 사용할 수 있다.

 

우리가 흔히 콘솔창에 텍스트를 출력할 때 사용하는 println라는 메소드를 대표적인 예로 들어볼 수 있다. 실은 이 함수가 오버로딩의 결정체이다. 우리는 println의 인자 값으로 int, double, boolean, String 등의 아주 다양한 타입의 매개변수들을 집어넣어도 콘솔창에 아주 잘 출력해주는 것을 볼 수 있다.

이렇게 '출력하다.'라는 같은 기능을 가진 메소드들를 println이라는 하나의 이름으로 정의가 가능한 것이다.

 

2️⃣ 메소드의 이름을 절약할 수 있다.

 

println 을 예로 들면 int, double, String 형 등 메소드 매개변수의 종류에 따라서 지정을 해본다고 가정을 해보자.

printlnInt, printlnDouble, printlnString 등 수많은 메소드들의 이름을 정해줘야 할 것이다. 이는 개발자 입장에서는 메소드의 네이밍에 고민을 가중 시키며, 이런 이름들은 다른 곳에 사용할 가능성도 생기게 된다.

 


오버라이딩(Overriding)

부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의하는 것을 오버라이딩이라고 한다. 상속받은 메소드를 그대로 사용할 수도 있지만, 자식 클래스에서 상황에 맞게 변경해야하는 경우 오버라이딩할 필요가 생긴다.

 

오버라이딩의 조건

  • 메소드의 이름이 일치해야 함
  • 메소드 매개변수의 개수, 순서 그리고 데이터 타입 일치해야 함
  • 메소드의 return 타입이 일치해야 함
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

728x90