1. 오버로딩 (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 double add(double a, double b,double c) {
return a + b + c;
}
// 문자열 두 개를 더하는 메서드
public String add(String a, String b) {
return a + b;
}
}
위의 예제에서 add 메서드는 동일한 이름을 가지고 있지만, 매개변수의 타입이나 개수가 다르기 때문에 서로 다른 메서드로 간주됩니다.
오버로딩(Overloading)의 장점
- 코드 가독성 향상:
- 같은 작업을 수행하는 메서드를 이름 그대로 사용하면서도, 다양한 입력에 따라 서로 다른 방식으로 동작할 수 있도록 작성할 수 있습니다. 이를 통해 코드의 가독성과 직관성을 높일 수 있습니다.
- 예를 들어, add(int a, int b), add(double a, double b), add(int a, int b, int c)와 같이 다양한 상황에서 add 메서드를 재사용할 수 있습니다.
- 유연성 제공:
- 메서드 이름을 재사용함으로써, 같은 기능을 하되 서로 다른 입력 타입이나 개수에 대해 다양한 메서드를 정의할 수 있습니다. 이는 코드 작성과 유지보수 시 유연성을 제공합니다.
- 메서드 다형성:
- 오버로딩을 통해 같은 이름의 메서드가 여러 가지 형태로 사용될 수 있습니다. 이는 객체 지향 프로그래밍에서 중요한 다형성의 개념을 메서드 수준에서 실현하는 데 기여합니다.
- 컴파일 타임에 오류 검출:
- 오버로딩은 컴파일 시점에 어떤 메서드가 호출될지 결정되므로, 잘못된 메서드 호출로 인한 오류를 컴파일 타임에 잡아낼 수 있습니다.
2. 오버라이딩 (Overriding)
오버라이딩은 상속 관계에 있는 클래스에서 부모 클래스의 메서드를 자식 클래스가 재정의하는 것을 의미합니다. 자식 클래스는 부모 클래스에서 상속받은 메서드의 구현을 변경하여 새로운 동작을 정의할 수 있습니다.
오버라이딩의 특징:
- 메서드 이름, 매개변수, 반환 타입: 부모 클래스의 메서드와 완전히 동일해야 합니다.
- 접근 제어자: 부모 클래스의 메서드보다 접근 범위를 더 좁게 설정할 수 없습니다. 예를 들어, 부모 클래스의 메서드가 public이라면 자식 클래스에서 protected나 private으로 변경할 수 없습니다.
- 예외 처리: 부모 클래스의 메서드보다 더 많은 종류의 예외를 던질 수 없습니다.
- 런타임 시에 결정: 어떤 메서드를 호출할지 런타임 시에 결정됩니다(동적 바인딩).
오버라이딩 예제:
class Animal {
// 부모 클래스의 메서드
public void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
===========================================
class Dog extends Animal {
// 자식 클래스에서 sound 메서드를 오버라이딩
@Override
public void sound() {
System.out.println("개가 멍멍 짖습니다.");
}
}
class Cat extends Animal {
// 자식 클래스에서 sound 메서드를 오버라이딩
@Override
public void sound() {
System.out.println("고양이가 야옹합니다.");
}
}
class Cow extends Animal {
// 자식 클래스에서 sound 메서드를 오버라이딩
@Override
public void sound() {
System.out.println("소가 음매합니다.");
}
}
====================
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();
Animal myCow = new Cow();
// 오버라이딩된 메서드 호출
myDog.sound(); // "개가 멍멍 짖습니다." 출력
myCat.sound(); // "고양이가 야옹합니다." 출력
myCow.sound(); // "소가 음매합니다." 출력
}
오버라이딩(Overriding)의 장점
- 다형성 실현:
- 오버라이딩은 상속 관계에서 다형성을 실현하는 중요한 수단입니다. 부모 클래스 타입의 참조를 사용하여 자식 클래스의 특정 동작을 실행할 수 있어, 다양한 객체를 동일한 인터페이스로 처리할 수 있습니다.
- 예를 들어, Animal 클래스의 sound() 메서드를 오버라이딩한 Dog, Cat 클래스는 Animal 타입으로 참조될 때도 각자의 sound() 메서드가 호출됩니다.
- 코드 재사용성:
- 부모 클래스에서 기본 동작을 정의하고, 자식 클래스에서 필요한 부분만 재정의(Override)하여 사용할 수 있습니다. 이를 통해 공통 기능은 부모 클래스에 두고, 특수한 기능만 자식 클래스에서 구현함으로써 코드 재사용성을 높일 수 있습니다.
- 동적 바인딩(Dynamic Binding):
- 오버라이딩된 메서드는 런타임에 어떤 메서드를 호출할지 결정되므로, 객체의 실제 타입에 따라 적절한 메서드가 실행됩니다. 이를 통해 런타임 다형성을 구현할 수 있습니다.
- 유지보수성 향상:
- 오버라이딩을 통해 기존 코드의 수정 없이도 새로운 기능을 추가하거나 기존 기능을 변경할 수 있습니다. 자식 클래스에서 메서드를 재정의하면, 부모 클래스의 코드를 변경하지 않고도 새로운 요구 사항을 반영할 수 있습니다.
'CS 지식' 카테고리의 다른 글
SOLID 원칙 (0) | 2024.09.01 |
---|---|
추상 클래스와 인터페이스 (0) | 2024.08.25 |
MVC 패턴 (0) | 2024.08.11 |
객체 지향 (0) | 2024.08.01 |
HTTP 메서드 와 상태 코드 (0) | 2024.07.24 |