오버로딩(Overloading)
오버로딩이란?
메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야 한다. 그러나 자바에서는 같은 이름을 가진 메서드가 있더라도 매개변수의 개수 또는 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
이처럼, 한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 '메서드 오버로딩(Method Overloading)' 또는 '오버로딩(Overloading)' 이라고 한다.
오버로딩의 규칙
- 메서드의 이름이 같아야 한다.
- 매개변수의 개수 또는 타입이 달라야 한다.
* 반환 타입은 오버로딩을 구현하는데 영향을 주지 못한다.
class A{
public void a(){} // 기준 메서드
public static void a() {} // 오류
public void a(int b) {}
public void a(double a) {}
public int a() {} // 오류 - 반환 타입은 영향 없음
}
class B{
public void a(int a, int b){} // 기준 메서드
public void a(int b, int a){} // 오류 - 매개변수 이름은 영향 없음
}
오버라이딩(Overriding)
오버라이딩이란?
부모 클래스로부터 상속받은 메서드를 자식 클래스에서 재정의하는 것을 말한다.
메서드가 오버라이딩 되었다면 해당 부모 메서드는 숨겨지고, 자식 메서드가 우선적으로 사용된다.
오버라이딩 규칙
- 부모 메서드의 선언부(리턴타입, 메서드 이름, 매개변수)와 동일해야 한다.
- 접근 제한을 더 강하게 오버라이딩 할 수 없다. (public -> private 불가능)
- 새로운 예외를 throw할 수 없다.
class MyShape {
public String draw() {
return "shape";
}
}
class MyLine extends MyShape {
@Override
public String draw() {
return "Line";
}
}
public class PainterExam {
public static void main(String[] args){
MyShape ms = new MyShape();
MyLine ml = new MyLine();
System.out.println(ms.draw());
System.out.println(ml.draw());
ms = ml; // 부모 타입으로 형 변환 이후 실행
System.out.println(ms.draw());
}
}
---
결과:
shape
Line
Line
오버로딩 VS 오버라이딩
오버로딩과 오버라이딩은 혼동하기 쉽지만, 차이는 명백하다.
- 오버로딩: 기존에 없는 새로운 메서드를 정의하는 것(new)
- 오버라이딩: 상속받은 메서드의 내용을 변경하는 것(change, modify)
class Parent {
void parentmethod() {}
}
class Child extends Parent {
void parentmethod() {} // 오버라이딩
void parentmethod(int a) {} // 오버로딩
void childmethod() {}
void childmethod(int a) {} // 오버로딩
}
'JAVA' 카테고리의 다른 글
예외 처리는 어떻게, 어디서 하죠? (2) | 2024.07.25 |
---|---|
내가 자바를 선택한 이유 (0) | 2024.07.10 |
자바란 다형성이다. (0) | 2024.07.05 |
상속에 관하여 (0) | 2024.07.04 |