Java
Java <Overloading, Override>
wlals5855
2024. 10. 8. 16:03
오버로딩(Overloading)
한클래스 내에서 같은 이름의 메서드를 여러개 정의하는 것
✔️오버로딩의 성립 조건
- 동일한 메서드 이름
- 매개변수의 개수 또는 타입의 차이
- 반환 타입은 관계 없다.
✅ 오버로딩의 장점
사용자가 매개변수의 순서를 외우지 안아도 사용가능 (편의성)
✅ 오버로딩의 단점
중복적으로 의미 없이 생성하는 경우, 기질적으로 필요한 구현 메서드 찾기에 어려움 (복잡성)
class Calc {
int a, b;
int c, d;
double x, y;
// 두 정수를 "더하는 메서드"
int add (int a, int b) { return a + b; }
// ===매개변수의 타입 차이===
double add(double x, double y) { return x + y; }
double add(int a, double y) { return a + y; }
double add(double x, int b) { return x + b; }
// ===매개변수의 개수 차이===
int add (int a, int b, int c) { return a + b + c; }
}
✅오버로딩 사용 이유
- 메서드가 수행하는 기본적인 작업이 동일할 때, 같은 이름 사용 가능
- 코드를 더 명확하고 가독성 있게 작성 가능 - 코드의 재사용성이 높아짐
- 컴파일 시 타입 체크를 강화 - 올바른 매개변수 타입을 가진 메서드를 선택
<메서드 출력결과>
public class Overloading01 {
public static void main(String[] args) {
Calc calculator = new Calc();
System.out.println(calculator.add(10, 20)); //30
System.out.println(calculator.add(10.0, 20.5));//30.5
System.out.println(calculator.add(10, 20.3));//30.3
System.out.println(calculator.add(10.1, 20));//30.1
System.out.println(calculator.add(10, 20, 30));//60
}
}
✔️오버라이드 (Override)
- 자식 클래스가 부모 클래스에서 정의된 "메서드"를 자신의 상황에 맞게 "재정의"
>> 상속 관계에 있는 클래스들 사이에서 사용
✅오버라이딩의 특징
- 메서드이 시그니처가 일치 >> 부모 클래스에서 정의된 메서드와 동일한 이름, 매개변수 구성을 가져야 함
- 반환 타입은 같거나 자동 형 변한이 가능한 것이어야함
- @Override (어노테이션, 주석) : 오버라이딩 된 메서드임을 명시적으로 표시
✅ 오버라이딩 구현 방법
- 부모 클래스의 상속받은 메서드를 자식 클래스에서 다시 정의
- 메서드의 이름, 매개변수를 일치, 반환타입은 같거나 자동 형 변환 가능하게 작성
- 메서드 위에 @Override 어노테이션을 작성
✅ 오버라이딩 사용 이유?
다형성 구현 -: 하나의 이름으로 여러 기능을 수행하는 코드 작성
재사용성 확장성 향상 : 기존코드 변경 없이, 새로운 기느응르 추가하거나 변경 가능
// 부모클래스
class AnimalClass {
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
// 자식 클래스
class DogClass extends AnimalClass {
// 어노테이션: 코드에 메타데이터를 제공하는 방법
@Override // : 현재 메서드가 부모 클래스의 메서드를 오버라이딩 한다는 것을 명시
void sound() {
System.out.println("개가 멍멍하고 짖습니다.");
}
}
// 자식 클래스
class CatClass extends AnimalClass {
@Override
void sound() {
System.out.println("고양이가 야옹하고 웁니다.");
}
}
<main클래스>
public class Overriding {
public static void main(String[] args) {
DogClass dog1 = new DogClass();
dog1.sound();
CatClass cat1 = new CatClass();
cat1.sound();
}
부모로 부터 상속받은 속성이나 메서드를 확장하는 개념
: 해당 상태나 동작을 반드시 가지지만 상속받는 클래스 마다 차이를 두고 싶을 때
✔️오버로딩 VS 오버라이딩 공통점
모두 메서드의 이름을 재사용하는 방법 (다형성)
✅ 오버로딩
- 같은 클래스 내에서 같은 이름을 가진 메서드를 여러 개 정의
- 메서드명이 동일, 매개변수의 타입, 개수, 순서 중 적어도 하나 이상은 달라야 함
- 메서드의 동작을 다양한 상황에 맞게 조정
✅ 오버라이딩
- 상속 관계에 있는 클래스에서 사용
- 메서드의 시그니처(이름, 매개변수, 반환타입)가 같아야 함
- 메서드의 동작을 변경하거나 확장
- @Override 어노테이션을 사용 >> 컴파일러에게 전달