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

2025. 1. 23. 10:31언어(Language)/JAVA

1. 오버로딩( Overloading )

1. 오버로딩이란 무엇인가요?

  • 정의: 메소드 이름이 같더라도 매개변수의 타입, 개수, 또는 순서가 다르면 서로 다른 메소드로 인식되는 기능
  • 특징:
    • 메소드 시그니처(메소드 이름 + 매개변수 타입과 개수)가 다르면 JVM은 별개의 메소드로 처리
    • 반환 타입은 메소드 시그니처에 포함되지 않음
  • 예시 코드:
public class Main {
    public static void main(String[] args) {
        MyClass mc = new MyClass();

        mc.print(1);                // 정수형 : 1
        mc.print(1, 10);            // 정수형 : 1, 10
        mc.print('X');              // 문자형 : X
        mc.print("메소드 오버로딩"); // 문자열 : 메소드 오버로딩
    }
}

class MyClass {
    public void print(int x) {
        System.out.println("정수형 : " + x);
    }

    public void print(int x, int y) {
        System.out.println("정수형 : " + x + "," + y);
    }

    public void print(char x) {
        System.out.println("문자형 : " + x);
    }

    public void print(String s) {
        System.out.println("문자열 : " + s);
    }
}

 

 

Q1) 메서드 시그니처(method signature)에 어떤 요소들이 포함되나요?

  • 정의: 메소드 시그니처는 메소드 이름매개변수의 타입 및 개수로 구성된다.
  • 특징:
    • 반환 타입은 메소드 시그니처에 포함되지 않는다.
    • 매개변수의 순서도 시그니처에 영향을 준다.
  • 예시 코드:
// System.out.println() 메소드
System.out.println("Hello, World!"); // 문자열 출력
System.out.println(100); // 정수 출력
System.out.println(3.14); // 부동소수점 출력
System.out.println(true); // 불리언 값 출력
System.out.println('A'); // 문자 출력
Object obj = new Object();
System.out.println(obj); // 객체 출력
  • 매개변수 순서가 시그니처에 미치는 영향
public double add(int a, double b) {
    return a + b;
}

public double add(double a, int b) {
    return a + b;
}

 

⇒ 두 메소드는 같은 타입의 파라미터를 받지만, 파라미터의 순서가 다르기 때문에 메소드 오버로딩

 

 

Q2) 반환 타입만 다르게 정의하면 왜 컴파일 에러가 발생하나요?

반환 타입은 메서드 시그니처에 포함되지 않으며, 단지 메서드의 결과 타입을 정의하는 역할만을 한다.

⇒ 따라서 반환 타입만 다르게 정의한 메서드는 시그니처가 동일하게 되어 컴파일러가 어떤 메서드를 호출할지 판단할 수 없어 컴파일 에러가 발생하게 된다.

 

2. 오버로딩은 컴파일 시점과 런타임 중 어느 시점에서 결정되나요?

⇒ 오버로딩은 컴파일 시점에서 결정된다.

 

컴파일 시점에 결정되는 이유

  • 호출하는 메서드를 컴파일러가 매개변수의 타입과 개수를 기준으로 분석해 결정하기 때문이다.
  • 컴파일러는 이 정보를 바탕으로 어떤 메서드를 호출할지 코드가 실행되기 전에 미리 정한다.

2. 오버라이딩( Overriding )

1. 오버라이딩이란 무엇인가요?

  • 정의: 부모 클래스의 메서드나 변수를 자식 클래스에서 재정의하는 것

 

2. 오버라이딩과 다형성(polymorphism)의 관계를 설명해주세요.

  • 다형성이란?
    • 하나의 부모 타입(예: 자동차)이 여러 자식 클래스(예: K3, 아반떼)의 객체를 참조할 수 있는 성질이다.
  • 다형성과 오버라이딩의 관계:
    • 오버라이딩은 다형성을 가능하게 한다.
    • 부모 클래스 타입으로 선언된 변수가 자식 클래스의 객체를 참조할 때, 오버라이딩된 메서드가 자식 클래스에 맞게 동작하도록 해준다.

 

3. 오버라이딩은 컴파일 시점과 런타임 중 어느 시점에서 결정되나요?

⇒ 오버라이딩은 런타임 시점에서 결정된다.

 

런타임 시점에 결정되는 이유

  • 컴파일 시점 역할:
    • 컴파일러는 메서드의 존재 여부정의가 올바른지만 확인한다.
  • 런타임 역할:
    • 메서드 호출 시점에는 객체의 실제 타입을 기준으로, 어떤 클래스의 메서드를 실행할지 결정한다.