오버로딩(Overloading)
오버로딩은 같은 이름의 메서드를 다른 매개변수로 정의하는 것을 말한다.
하나의 클래스 내에서 메서드 이름은 동일하지만, 매개변수의 개수나 타입을 다르게 하여 여러 메서드를 정의할 수 있다.
오버로딩은 컴파일 시점에 결정된다.
< 예시 >
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;
}
}
위 예시에서 add 메서드는 3가지 버전으로 오버로딩되어 있다.
매개변수의 타입과 개수가 달라서 호출하는 시점에 적절한 메서드가 선택된다.
1. add(3, 4) -> 두 개의 정수를 더하는 첫 번째 메서드 호출
2. add(1, 2, 3) -> 세 개의 정수를 더하는 두 번째 메서드 호출
3. add(1.5, 2.5) -> 두 개의 실수를 더하는 세 번째 메서드 호출
오버라이딩(Overriding)
오버라이딩은 부모 클래스에서 정의된 메서드를 자식 클래스에서 재정의하는 것을 의미한다.
메서드의 이름, 매개변수, 리턴타입 모두 동일하지만 자식 클래스에서 메서드의 동작을 다르게 구현할 수 있다.
오버라이딩은 런타임 시점에 결정된다.
< 예시 >
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("고양이가 야옹 야옹 합니다.");
}
}
위 예시에서 Dog와 Cat 클래스는 부모 클래스인 Animal의 sound 메서드를 오버라이딩하고 있다.
따라서 Dog, Cat 객체에서 sound 메서드를 호출할 때, 부모 클래스의 메서드가 아니라 각각 오버라이딩된 메서드가 실행 된다.
< 실행 예시 >
Animal myDog = new Dog();
myDog.sound(); // 출력 결과 -> "강아지가 멍멍 짖습니다."
Animal myCat = new Cat();
myCat.sound(); // 출력 결과 -> "고양이가 야옹 야옹 합니다."
차이점 요약
구분 | 오버로딩(Overloading) | 오버라이딩(Overrading) |
정의 | 같은 이름의 메서드를 다른 매개변수로 여러 개 정의하는 것 |
부모 클래스의 메서드를 자식 클래스에서 재정의 하는 것 |
결정 시점 | 컴파일 시점 | 런타임 시점 |
상속 관계 | 상속과 관계 없음 | 상속 관계에서만 발생 |
메서드 이름 | 동일 | 동일 |
매개변수 | 달라야 함 | 동일해야 함 |
용도 | 같은 기능을 하는 메서드를 다양한 방법으로 호출 하고자 할 때 |
부모 클래스의 동작을 자식 클래스에서 다르게 구현 하고자 할 때 |
오버로딩은 메서드의 다양한 사용방법을 제공하고,
오버라이딩은 상속된 기능을 재정의해서
객체의 특성에 맞게 동작을 변경하는 데 사용된다.
'Dev > Java' 카테고리의 다른 글
상속 - 개념편 (4) | 2024.10.02 |
---|---|
스타크래프트로 알아보는 객체지향(1편) (6) | 2024.09.25 |
switch - 조건문 종류와 예시 (0) | 2024.09.05 |
for - 반복문 종류와 예시 (0) | 2024.09.04 |
if - 조건문 종류와 예시(feat. 가위바위보) (0) | 2024.09.03 |