[개발] 지식/Java
오버라이딩(Overriding)과 오버로딩(Overloading)
하하미아
2023. 6. 13. 06:10
오버로딩 (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 class Main {
public static void main(String[] args) {
Calculator calculator = new Calculator();
System.out.println(calculator.add(1, 2)); // int add(int a, int b) 호출, 결과: 3
System.out.println(calculator.add(1.5, 2.5)); // double add(double a, double b) 호출, 결과: 4.0
System.out.println(calculator.add(1, 2, 3)); // int add(int a, int b, int c) 호출, 결과: 6
}
}
사용하는 이유
- 같은 기능을 하는 메소드를 하나의 이름으로 사용 가능
- 메소드의 이름을 절약
오버라이딩(overriding)
부모 클래스로부터 상속받은 메소드를 자식 클래스에서 재정의
조건
- 메소드의 이름, 매개변수, 리턴타입이 동일해야 한다.
- 접근제어자는 부모 클레스보다 넓게 설정해야 한다.
- 부모 클래스 메서드가 default인 경우, 자식 클래스 메서드는 default, protected, public 사용 가능
- 예외(Exception)은 부모 클래스의 메소드보다 많이 선언할 수 없다.
- static 메소드를 인스턴스의 메소드 또는 그 반대로 바꿀 수 없다.
- 부모 클래스의 static 메소드를 자식 클래스에서 동일 이름으로 정의하는 경우, 재정의가 아니라 새로 정의하는 것
예시
class Animal {
public void makeSound() {
System.out.println("동물이 소리를 낸다.");
}
}
class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal animal = new Dog();
animal.makeSound(); // Dog 클래스에서 오버라이딩한 makeSound() 메서드 호출, 결과: "멍멍!"
}
}