본문 바로가기

자바

[JAVA] 오버로딩, 오버라이딩

728x90

오버로딩

1. 목적

같은 기능을 하는 메서드를 매개변수만 다르게 정의하여 코드의 가독성과 재사용성을 높여준다.

같은 이름의 메서드를 여러 개 정의하여 다양한 매개변수 형태로 사용할 수 있도록 유연성을 제공한다.

2. 특징

  • 메서드 이름은 동일하지만, 매개변수가 다흐다.
  • 매개변수의 개수, 타입, 순서가 다르면 오버로딩이 가능하다.
  • 리턴 타입은 오버로딩에 영향을 주지 않는다.
  • 같은 클래스 내에서 정의된다.
  • 생성자(Constructor)도 오버로딩 가능하다.

3. 사용 예시

class Calculator {
    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 String add(String a, int b) {
        return a + b;
    }
}

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

        System.out.println(calc.add(2, 3));       // 5
        System.out.println(calc.add(2, 3, 4));    // 9
        System.out.println(calc.add(2.5, 3.2));   // 5.7
        System.out.println(calc.add("결과: ", 10)); // 결과: 10
    }
}

오버라이딩

1. 목적

부모 클래스로부터 상속받은 메서드를 자식 클래스에서 변경(재정의)하여 사용한다.

부모 클래스의 기본 동작을 유지하면서, 자식 클래스에서 더 적합한 동작을 구현할 수 있다.

2. 특징

  • 메서드 이름, 매개변수, 리턴 타입이 부모 메서드와 완전히 동일해야 한다.
  • 메서드의 구현(내용)만 변경이 가능하다.
  • @Override 애너테이션을 사용하면 컴파일러가 올바르게 오버라이딩했는지 확인할 수 있다.
  • 접근 제한자는 부모보다 좁게 설정할 수 없다.
  • 부모 클래스의 메서드를 super 키워드를 이용하여 호출이 가능하다.

3. 사용 예시

// 부모 클래스
class Animal {
    public void makeSound() {
        System.out.println("동물이 소리를 냅니다.");
    }
}

// 자식 클래스
class Dog extends Animal {
    @Override
    public void makeSound() { // 부모 클래스의 메서드를 오버라이딩
        System.out.println("멍멍!"); // 내용 변경
    }
}

class Cat extends Animal {
    @Override
    public void makeSound() {
        System.out.println("야옹~");
    }
}

public class Main {
    public static void main(String[] args) {
        Animal myDog = new Dog();
        Animal myCat = new Cat();

        myDog.makeSound(); // 멍멍!
        myCat.makeSound(); // 야옹~
    }
}
728x90

'자바' 카테고리의 다른 글

[JAVA] 배열(Array)  (0) 2025.03.11
[JAVA] record  (0) 2025.03.11
[JAVA] Getter, Setter  (0) 2025.03.06
[JAVA] 생성자  (0) 2025.03.06
[JAVA] Object Class  (0) 2025.03.05