1. 메서드 오버로딩 (Method Overloading)
- 자바에서 같은 이름의 메서드를 여러개 정의하는 것을 오버로딩 (Overloading) 이라고 함
- 즉, 이름이 같고 매개변수가 다른 메서드를 여러 개 정의하는 것을 의미
1-1. 메서드 시그니처 (Method Signature)
- 메서드를 구분할 수 있는 식별자
- 메서드 이름, 매개변수 타입, 매개변수 순서 등으로 이루어짐
메서드 시그니쳐 = 메서드 이름 + 매개변수 타입과 순서
1-2. 오버로딩 규칙
오버로딩 규칙 : "메서드 시그니처가 달라야 한다."
1-3. 오버로딩 예시
- 메서드의 이름이 같고, 매개변수의 개수가 달라야 한다.
// 매개변수의 개수가 다른 경우
public class Main {
public static void main(String[] args) {
System.out.println("두 수의 합 = " + sum(1,2));
System.out.println("세 수의 합 = " + sum(1,2,3));
}
public static int sum(int a, int b){
return a+b;
}
public static int sum(int a, int b, int c){
return a+b+c;
}
}
- 메서드의 이름이 같고, 매개변수의 타입이나 순서가 달라야 한다.
// 매개변수의 타입이 다른 경우
public class Main {
public static void main(String[] args) {
System.out.println("정수 2개의 합 = " + sum(1,2));
System.out.println("실수 2개의 합 = " + sum(1.0,2.5));
}
public static int sum(int a, int b){
return a+b;
}
public static double sum(double a, double b){
return a+b;
}
}
// 매개변수의 타입 순서가 다른 경우
public class Main {
public static void main(String[] args) {
System.out.println("정수와 실수의 합 = " + sum(1,2.1));
System.out.println("실수와 정수의 합 = " + sum(1.5,2));
}
public static double sum(int a, double b){
return a+b;
}
public static double sum(double a, int b){
return a+b;
}
}
1-4. 오버로딩 실패
- 메서드 시그니처 : 메서드의 반환 타입은 포함하지 X
- 따라서 메서드 반환 타입만 다른 경우는 오버로딩 실패!
- 메서드의 반환 타입만 다른 경우
// 오버로딩에 실패하여 에러가 발생한다.
public static double sum(int a, int b){
return a+b;
}
public static int sum(int a, int b){
return a+b;
}
2. 메서드 오버라이딩 (Method Overriding)
- 상속받은 부모 클래스의 메서드를 자식 클래스에서 동일한 메서드 시그니처로 재정의 하는 것을 의미
2-0. @Override
- 옵션임, 없어도 잘 동작함
- 상위 클래스의 메서드를 오버라이드 했음을 의미 하는 애노테이션
- 컴파일러가 이 애노테이션을 보고 정확히 오버라이드 되었는지 검사함 ⇒ 잘못되면 컴파일 에러
- 오버라이딩 시 실수하는 경우를 방지해줌!
// 컴파일 에러
// java: method does not override or implement a method from a supertype
2-1. 메서드 오버라이딩 조건
- 메서드 시그니처가 부모 클래스의 메서드와 동일해야 함
- 접근제어자는 부모 클래스의 메서드와 같거나 더 넓은 범위여야 함
- 반환 자료형은 부모 클래스의 메서드와 같거나 하위 자료형이어야 함
2-2. 메서드 오버라이딩 예시
- Car 클래스 : 부모 클래스
public class Car {
public void move() {
System.out.println("차를 이동합니다.");
}
}
- ElectricCar 클래스 : Car를 상속받은 자식 클래스
public class ElectricCar extends Car{
public void charge() {
System.out.println("차를 충전합니다.");
}
// 메서드 오버라이딩
@Override
public void move() {
System.out.println("전기차를 이동합니다!!");
}
}
- 부모 클래스인 Car 클래스에 존재한 move() 메서드를 오버라이딩 함
- Car의 move()와 ElectricCar의 move()는 동일한 메서드 시그니처를 가짐
- 상속받은 부모 클래스의 메서드 중 자식 클래스에 맞춰서 메서드를 수정한 것!
- GasCar 클래스 : Car를 상속받은 자식 클래스
public class GasCar extends Car{
public void fillup() {
System.out.println("기름을 주유합니다.");
}
}
- CarMain 클래스
public class CarMain {
public static void main(String[] args) {
ElectricCar electricCar = new ElectricCar();
GasCar gasCar = new GasCar();
electricCar.move();
electricCar.charge();
gasCar.move();
gasCar.fillup();
}
}
- 실행 결과
전기차를 이동합니다!!
차를 충전합니다.
차를 이동합니다.
기름을 주유합니다.
📌 메서드 오버라이딩 - 호출
1. 본인 타입에서 메서드 찾음
2. 없으면 부모 타입에서 메서드 찾음
3. 오버로딩 vs 오버라이딩
오버로딩 : 동일 클래스에서 이름이 동일하고 메서드 시그니처가 다른 여러 개의 메서드를 정의하는 것
오버라이딩 : 자식 클래스에서 부모 클래스의 메서드를 동일한 메서드 시그니처로 재정의 하는 것
'Java' 카테고리의 다른 글
[Java] 클래스 (0) | 2024.07.08 |
---|---|
[Java] StringBuilder 로 출력하여 시간초과 해결 (0) | 2023.12.12 |
[Java] 향상된 for 문 (for-each 문) (0) | 2023.12.10 |
[Java] 삼항 연산자 (0) | 2023.12.09 |
[Java] 리터럴 (Literal) (0) | 2023.12.09 |