자바
오버로딩과 오버라이딩 완벽 가이드
끄적인다
2024. 6. 27. 19:00
반응형
자바(Java)에서 메서드 오버로딩(Method Overloading)과 메서드 오버라이딩(Method Overriding)은 객체 지향 프로그래밍의 중요한 개념입니다. 이 두 개념은 메서드를 재사용하고 확장하는 데 핵심적인 역할을 합니다. 이 글에서는 메서드 오버로딩과 오버라이딩의 차이점과 사용 방법을 자세히 살펴보겠습니다.
1. 메서드 오버로딩(Method Overloading)
개념
메서드 오버로딩은 같은 클래스 내에서 동일한 이름을 가진 메서드를 여러 개 정의하는 것을 말합니다. 각 메서드는 매개변수의 수나 타입이 달라야 합니다. 오버로딩을 통해 같은 이름의 메서드가 다양한 입력 값을 처리할 수 있습니다.
예시
public class MathUtils {
// 두 정수의 합을 계산
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 class Main {
public static void main(String[] args) {
MathUtils utils = new MathUtils();
System.out.println(utils.add(5, 3)); // 출력: 8
System.out.println(utils.add(5, 3, 2)); // 출력: 10
System.out.println(utils.add(5.5, 3.3)); // 출력: 8.8
}
}
2. 메서드 오버라이딩(Method Overriding)
개념
메서드 오버라이딩은 상위 클래스(슈퍼 클래스)에 정의된 메서드를 하위 클래스(서브 클래스)에서 재정의하는 것을 말합니다. 오버라이딩을 통해 상위 클래스의 메서드를 하위 클래스에서 새로운 동작으로 변경할 수 있습니다.
예시
public class Animal {
// 상위 클래스의 메서드
public void sound() {
System.out.println("Some sound...");
}
}
public class Dog extends Animal {
// 하위 클래스에서 메서드 재정의
@Override
public void sound() {
System.out.println("Woof");
}
}
public class Cat extends Animal {
// 하위 클래스에서 메서드 재정의
@Override
public void sound() {
System.out.println("Meow");
}
}
특징
- 상위 클래스와 하위 클래스 간에 적용됩니다.
- 메서드 이름, 매개변수 목록, 반환 타입이 모두 같아야 합니다.
- 접근 제어자는 상위 클래스의 메서드와 같거나 더 넓은 범위를 가져야 합니다.
- @Override 어노테이션을 사용하여 오버라이딩임을 명시할 수 있습니다.
사용 예시
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
myDog.sound(); // 출력: Woof
myCat.sound(); // 출력: Meow
}
}
3. 오버로딩과 오버라이딩의 차이점
특성오버로딩(Method Overloading)오버라이딩(Method Overriding)
적용 대상 | 같은 클래스 내에서 메서드 이름 중복 | 상위 클래스와 하위 클래스 간 메서드 재정의 |
메서드 이름 | 동일함 | 동일함 |
매개변수 | 다름 | 동일함 |
반환 타입 | 다를 수 있음 | 동일함 |
접근 제어자 | 무관 | 상위 클래스보다 같거나 더 넓어야 함 |
사용 목적 | 다양한 입력 값을 처리할 수 있도록 하기 위해 | 상위 클래스의 메서드를 하위 클래스에서 다른 동작으로 변경하기 위해 |
어노테이션 사용 여부 | 사용하지 않음 | @Override 사용 권장 |
4. 오버로딩과 오버라이딩 활용하기
오버로딩 예제
public class PrintUtils {
// 문자열을 출력
public void print(String s) {
System.out.println(s);
}
// 정수를 출력
public void print(int i) {
System.out.println(i);
}
// 배열을 출력
public void print(int[] arr) {
for (int i : arr) {
System.out.print(i + " ");
}
System.out.println();
}
}
public class Main {
public static void main(String[] args) {
PrintUtils printer = new PrintUtils();
printer.print("Hello, World!"); // 출력: Hello, World!
printer.print(123); // 출력: 123
printer.print(new int[]{1, 2, 3, 4, 5}); // 출력: 1 2 3 4 5
}
}
오버라이딩 예제
public class Vehicle {
// 상위 클래스의 메서드
public void start() {
System.out.println("Vehicle is starting");
}
}
public class Car extends Vehicle {
// 하위 클래스에서 메서드 재정의
@Override
public void start() {
System.out.println("Car is starting with ignition");
}
}
public class Bicycle extends Vehicle {
// 하위 클래스에서 메서드 재정의
@Override
public void start() {
System.out.println("Bicycle is starting with pedaling");
}
}
public class Main {
public static void main(String[] args) {
Vehicle myCar = new Car();
Vehicle myBicycle = new Bicycle();
myCar.start(); // 출력: Car is starting with ignition
myBicycle.start(); // 출력: Bicycle is starting with pedaling
}
}
결론
이 글에서는 자바의 메서드 오버로딩과 오버라이딩에 대해 자세히 살펴보았습니다. 오버로딩은 같은 클래스 내에서 같은 이름의 메서드를 여러 개 정의하는 것이며, 오버라이딩은 상위 클래스의 메서드를 하위 클래스에서 재정의하는 것입니다. 두 개념을 잘 활용하면 코드의 재사용성과 확장성을 높일 수 있습니다. 추가적인 질문이 있으면 언제든지 댓글로 남겨주세요!
반응형