CS/JAVA
오버로딩(Overloading), 오버라이딩(Overriding)
hyunji1109
2025. 2. 27. 15:22
오버로딩(Overloading)
- 같은 이름의 메서드를 매개변수를 달리해서 여러 번 정의
- 같은 이름의 메서드를 여러 개 정의하는 것
- 단, 메서드의 매개변수가 달라야 한다
- 같은 클래스 안에서 이루어진다
특징
- 메서드 이름은 같지만 매개변수의 개수, 타입, 순서가 달라야 한다
- 리턴 타입은 달라도 되지만 매개변수로만 구분
- 프로그램 실행 전에 결정
예)
class Calculator {
int add(int a, int b) {
return a + b; // 정수 덧셈
}
double add(double a, double b) {
return a + b; // 실수 덧셈
}
int add(int a, int b, int c) {
return a + b + c; // 정수 세 개의 덧셈
}
}
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println(calc.add(3, 5)); // 출력: 8
System.out.println(calc.add(3.5, 4.2)); // 출력: 7.7
System.out.println(calc.add(1, 2, 3)); // 출력: 6
}
}
Overriding (오버라이딩)
- 부모 클래스나 인터페이스의 메서드를 자식 클래스에서 재정의하는 것
- 부모 메서드를 재정의하여 자식 클래스에 맞게 변경
- 상속 관계에서 이루어진다
특징
- 메서드 이름, 매개변수, 리턴 타입이 부모와 완전히 동일해야 한다
- 부모의 기능을 유지하거나 새롭게 재정의
- 프로그램 실행 중에 결정
- @Override 애너테이션을 사용하는 것이 좋다
예)
class Parent {
void sayHello() {
System.out.println("Hello from Parent!");
}
}
class Child extends Parent {
@Override
void sayHello() { // 부모의 메서드를 재정의
System.out.println("Hello from Child!");
}
}
public class Main {
public static void main(String[] args) {
Parent parent = new Parent();
parent.sayHello(); // 출력: Hello from Parent!
Parent child = new Child();
child.sayHello(); // 출력: Hello from Child!
}
}
특징 | Overloading | Overriding |
클래스 관계 | 같은 클래스 | 부모-자식 클래스 (상속 관계) |
메서드 이름 | 동일 | 동일 |
매개변수 | 달라야 함 | 완전히 동일 |
리턴 타입 | 달라도 가능 | 동일해야 함 |
실행 시점 | 컴파일 타임 | 런타임 |
키워드 | 필요 없음 | @Override 권장 |
@Override
- Java에서 메서드를 재정의할 때 사용하는 애너테이션
- 부모 클래스 또는 인터페이스의 메서드를 자식 클래스에서 재정의(오버라이드)하고 있음을 컴파일러에 알림
- 코드의 가독성이 높아지고, 재정의 과정에서 실수를 방지
장점
- 컴파일 오류 방지
- 부모 클래스의 메서드 이름이나 시그니처를 잘못 입력했을 경우, 컴파일 시 오류를 발생시켜 실수를 잡아준다
- 가독성 향상
- 이 메서드가 부모 클래스의 메서드를 재정의한 것임을 다른 개발자들이 바로 이해할 수 있다
- 일관성 유지
- 코드 리뷰 및 유지보수 시, 의도적으로 재정의한 메서드임을 명확히 알 수 있다
예)
class Parent {
void sayHello() {
System.out.println("Hello from Parent!");
}
}
class Child extends Parent {
@Override
void sayHello() { // 부모 메서드 재정의
System.out.println("Hello from Child!");
}
}
public class OverrideExample {
public static void main(String[] args) {
Parent obj = new Child();
obj.sayHello(); // 출력: Hello from Child!
}
}
💥 실수 방지
class Parent {
void sayHello() {
System.out.println("Hello from Parent!");
}
}
class Child extends Parent {
@Override
void sayHelloo() { // 오타로 인해 부모 메서드를 재정의하지 못함
System.out.println("Hello from Child!");
}
}