[Java] 오버로딩과 오버라이딩

hyunoi·2024년 11월 26일
0

Java

목록 보기
17/20
post-thumbnail

오버로딩 (Overloading)


class Calculator {
    // 정수 덧셈
    public int add(int a, int b) {
        return a + b;
    }

    // 실수 덧셈
    public double add(double a, double b) {
        return a + b;
    }

    // 세 개의 정수 덧셈
    public int add(int a, int b, int c) {
        return a + b + c;
    }
}

public class OverloadingExample {
    public static void main(String[] args) {
        Calculator calc = new Calculator();

        System.out.println(calc.add(5, 10));         // 정수 덧셈: 15
        System.out.println(calc.add(5.5, 10.5));     // 실수 덧셈: 16.0
        System.out.println(calc.add(1, 2, 3));       // 세 정수 덧셈: 6
    }
}

동일한 이름의 메소드매개변수만 다르게 하여 정의하는 것
코드의 가독성과 재사용성을 위해서 사용한다.

  • 메소드 이름은 무조건 같아야 한다.
  • 메소드 구성 요소 변수 개수, 타입, 순서 이 중에 하나는 무조건 달라야 한다.
  • 반환 타입만 다른 것은 오버로딩 성립 안 된다.
  • static은 오버로딩에 영향을 주지 않는다.

오버라이딩 (Overriding)


class Animal {
    public void sound() {
        System.out.println("Animal makes a sound");
    }
}

class Dog extends Animal {
    @Override
    public void sound() {
        System.out.println("Dog barks");
    }
}

public class OverridingExample {
    public static void main(String[] args) {
        Animal animal = new Animal();
        Animal dog = new Dog(); // 부모 타입으로 자식 객체 참조

        animal.sound(); // "Animal makes a sound"
        dog.sound();    // "Dog barks" (다형성)
    }
}

상위 클래스의 메소드하위 클래스에서 재정의하는 것
부모 클래스의 기본 동작을 변경하거나 좀 더 세세하게 확장하여 다형성을 구현할 때 사용한다.

  • 메소드 이름, 매개변수, 반환 타입이 무조건 상위 클래스 메소드와 같아야 한다.
  • 접근 제한자는 부모 클래스보다 제한적으로 설정해야 한다.
    만약, 부모 클래스가 protected면 자식 클래스는 public만 가능하다.
  • 부모 메소드가 final이면 오버라이딩 불가능하다.

둘의 차이점


컴파일과 런타임

  • 오버로딩
    컴파일 시점에 호출될 메소드가 결정
  • 오버라이딩
    런타임 시점에 호출될 메소드 결정

예외 처리

  • 오버로딩
    예외 처리 규칙이 서로에게 영향을 미치지 않음
  • 오버라이딩
    부모 클래스의 메소드의 예외와 동일하거나 더 제한된 경우에서만 예외 처리가 허용됨

어노테이션 (annotation)

  • 오버로딩
    사용 안 함
  • 오버라이딩
    @Override 사용

0개의 댓글