[JAVA] 오버로딩 vs. 오버라이딩
오버로딩은 동일한 이름의 생성자나 메서드를 매개변수 차이로 구분하는 것
오버라이딩은 상속 관계에서 부모 메서드를 자식 클래스가 재정의하는 것
Overloading
1. 개념
- 동일한 이름의 메서드나 생성자를 매개변수(parameter)의 타입, 개수, 순서를 달리하여 정의
- 접근 제어자와 반환 타입은 무관
- 동일한 기능을 가진 다양한 입력 타입에 대응
- 가변 인자(int…nums) 사용 시, 배열(int[] nums)과 같이 사용X
2. 작성법
class Constructor {
// 생성자 오버로딩
Constructor() {
System.out.println("1번 생성자");
}
Constructor(String str) {
System.out.println("2번 생성자");
}
Constructor(int a, int b) {
System.out.println("3번 생성자");
}
// 메소드 오버로딩
public void run(){
System.out.println("첫번째 런 메소드");
}
public void run(int a){
System.out.println("두번째 런 메소드");
}
}
Overriding
1. 개념
- 상위 클래스에서 상속받은 메서드를 하위 클래스에서 재정의하여 사용하는 것
- 다형성을 활용하여 유연한 설계
- 성립 조건
- 메서드 이름, 매개변수이 부모 메서드와 동일
- 반환 타입은 부모보다 하위 타입만 가능(LSP 원칙)
- 기본형은 변경 불가
- X: long → int
- O: Number → Integer
- 접근 제어자는 부모보다 좁아질 수 없음(LSP 원칙)
- X: public → protected
- O: protected → public
final로 선언된 메서드는 오버라이딩X- 부모보다 같거나 더 구체적인 예외 선언만 가능(Checked Exception만 해당)
- X: IOException → Exception
- O: Exception → X
- Unchecked Exception(RuntimeException 계열)은 오버라이딩 제한 대상이 아님
static으로 선언된 메서드는 상속되지만 오버라이딩되지 않음- 자식 클래스에서 동일한 시그니처로 선언 시, 오버라이딩이 아닌 숨김(hiding)
- 컴파일 타임에 참조 타입 기준으로 바인딩됨
2. 작성법
class Parent {
static void runStatic(){
System.out.println("부모의 정적 메서드");
}
protected int run (int a) throws Exception{
System.out.println("부모의 protected 제어자 & 넓은 예외");
return a;
}
}
class Child extends Parent {
// OverridingX hiding
static void runStatic(){
System.out.println("자식의 정적 메서드");
}
// Overriding
public int run(int a) throws IOException{
System.out.println("자식의 퍼블릭 제어자 & 구체적 예외");
return a;
}
}
Leave a comment