본문 바로가기
Development/Java

[Java] 오버로딩과 오버라이딩(Overloading & Overriding)

by nyrimmm 2024. 9. 10.

오버로딩과 오버라이딩

오버로딩(Overloading)은 한 클래스 내에서, 같은 이름의 메서드를 여러 개 정의하는 것

 

오버라이딩(Overriding)은 부모클래스로부터 상속 받은 메서드를 자식클래스에서 재정의하는 것 

 

 

 

오버로딩(Overloading)

  • 메서드 이름이 같고, 매개변수의 개수나 타입(순서)이 다른 메서드를 여러개 정의하는 것
  • 메서드 오버로딩을 사용함으로써 메서드 이름을 절약할 수 있다.
  • 같은 기능을 하는 메서드를 하나의 이름으로 사용할 수 있다.
  • 오버로딩의 조건 
    • 메서드 이름이 같아야 한다.
    • 메서드 매개변수(파라미터)의 개수가 달라야 한다.
    • 매개변수의 개수가 같다면 타입(순서)이 달라야 한다.
    • ‘리턴(반환) 타입’ 만 다른 것은 오버로딩 X
    • ‘접근제어자’ 만 다른 것은 오버로딩 X
class Overloading{
    //오버로딩 성공
    public int add(int a, int b){
        return a + b;
    }

    public int add(int a, int b, int c) {   //매개변수의 개수가 다른 경우
        return a + b + c;
    }

    public double add(double a, double b) { //매개변수의 타입이 다른 경우
        return a + b;
    }

    public double add(double a, int b, int c) {    //매개변수의 개수, 타입이 다른 경우
        return a + b + c;
    }


    //컴파일 오류 - 오버로딩 X
/*    
    public double add(int a, int b) {   //리턴(반환) 타입만 다르면 오버로딩 X
        return a + b;
    }

    protected int add(int a, int b) { //접근제어자만 다르면 오버로딩 X
        return a + b;
    } 
*/   
}


public class Test {
    public static void main(String[] args) {
        Overloading ol = new Overloading();
        System.out.println(ol.add(1, 2));
        System.out.println(ol.add(1, 2, 3));
        System.out.println(ol.add(1.0, 2.0));
        System.out.println(ol.add(1.0, 2, 3));
    }
}






/*
실행 결과
----------
3
6
3.0
6.0
*/

 

 

 

 

 

오버라이딩(Overrding)

  • 부모클래스로부터 상속받은 메서드를 자식 클래스에서 재정의하는 것
  • 메서드 이름, 매개변수, 리턴값이 모두 동일
  • @Override 애노테이션을 사용한다.
  • 오버라이딩의 조건 
    • 메서드 이름이 같아야 한다.
    • 메서드 매개변수(파라미터)의 개수, 순서, 타입이 같아야 한다.
    • 리턴(반환) 타입이 같아야 한다.
    • 접근제어자가 부모 클래스의 메서드보다 더 제한적이면 안된다.
      • ex1) 부모 클래스의 메서드 protected, 자식 클래스의 메서드 public O
      • ex2) 부모 클래스의 메서드 protected, 자식 클래스의 메서드 private X
    • static, final, private 가 붙은 메서드는 오버라이딩 불가
    • 생성자는 오버라이딩 불가
public class Car {
    public void move() {
        System.out.println("차를 이동합니다.");
    }
}



public class ElectricCar extends Car {
    @Override
    public void move() {
        System.out.println("전기차를 빠르게 이동합니다.");
    }
}



public class CarMain {
    public static void main(String[] args) {
        Car car = new Car();
        car.move();
        
        ElectricCar electricCar = new ElectricCar();
        electricCar.move();
    }
    
    
    
    
    
/*
실행결과
---------
차를 이동합니다.
전기차를 빠르게 이동합니다.
*/