[ 어제 내용 복습 ]
오버로딩(Overloading) : 메서드의 이름은 같고 매개변수의 유형과 개수가 다르도록 하는 것을 의미한다.
오버라이딩 (Overriding) : 상위 클래스가 가지고 있는 메서드를 하위 클래스가 재정의해서 사용하는 것을 의미한다.
간략하게 요약하면
자바의 일반 클래스는 부모 클래스를 단 하나만 가져야 하므로 여러 부모 클래스를 갖는 다중 상속을 지원하지 않는다. 그러나 인터페이스는 추상 클래스보다 더 추상적이므로 여러 인터페이스를 상속받는 다중 상속을 지원한다. 예를들어 X, Y 라는 인터페이스가 존재하고 이를 상속받는 MyInterface 도 존재한다고 가정하자. MyInterface를 구현 할 클래스인 MyClass도 존재한다.
public interface MyInterface extends X, Y {
}
public class MyClass extends PMyClass implements MyInterface {
}
그리고 MyClass의 부모 클래스인 PMyClass 도 있다고 가정하면 이렇게 일반 클래스 or 추상 클래스로 부터의 상속도 받고 인터페이스도 구현을 하는 클래스로 extends 와 implements를 같이 써서 사용할 수도 있다.
왜 자바의 일반 클래스에서 다중 상속을 지원하지 않는가? (다이아몬드 문제)
위와 같은 구조가 있다고 가정해보자. GrandFather 에 A() 라는 메소드가 있어서 FatherA 와 FatherB 에서 오버라이딩 해서 구현 했다고 생각해보자. 이러면 Son 입장에서는 A() 메소드를 호출 했을 때 누구의 메소드를 가져다 써야 할지 정할 수 없다. 따라서 컴파일도 되지 않는다.
인터페이스는 기능에 대한 선언만 하기 때문에, 위와 같은 경우더라도 충돌할 여지가 없다. 생각해보면 인터페이스 안에는 추상메소드만 선언을 하기 때문에 하위 클래스들은 그 추상메소들을 오버라이딩 해서 사용한다.
[ 오늘 공부 내용 ]