네이버 국어 사전을 찾아보면 상속의 정의는 '일정한 친족 관계가 있는 사람 사이에서,
한 사람이 사망한 후에 다른 사람에게 재산에 관한 권리와 의무의 일체를 이어 주거나, 다른 사람이 사망한 사람으로부터 그 권리와 의무의 일체를 이어받는 일' 이라고 나와있다.
자바에도 상속이라는 개념이 존재하는데 우리의 일상생활에서의 상속과 어떤 공통점과 차이점이 있을까?
자바에서의 상속은 부모 클래스의 속성과 메소드를 자식의 클래스가 그대로 가져와 쓸 수 있고, 메소드를 재정의(오버라이딩)해 사용할 수 있는 것이다.
동일한 메소드를 사용하는 클래스들이 여러 개라면 부모 클래스를 하나 만들어두고 여러 자식 클래스들에게 상속해주는 것이 편리할 것이다.
자식 클래스는 부모 클래스를 extends 해서 상속받을 수 있다.
extend는 확장이라는 의미를 갖고 있는데, 자식 클래스는 부모 클래스에서 상속받은 메소드 뿐만 아니라 추가적으로 메소드를 정의해서 사용할 수 있다.

상속관계를 그림으로 표현해보자면 대략적으로 위와 같은 그림으로 표현할 수 있을 것 같다. 부모클래스에서 상속받은 메소드나 멤버 뿐만 아니라 더 많은 것을 정의해서 사용할 수 있으니 말이다.
자바에는 상속에서 쓰이는 오버라이딩 말고 오버로딩이라는 것도 있다.
이 둘은 무슨 차이가 있을까?
오버로딩은,
똑같은 이름을 가진 메소드가 여러 개 있을 수 있는 것을 말한다.
물론 완전히 똑같은 메소드는 아니고 매개변수의 개수나 타입에 차이가 있는 동일한 이름의 메소드들이다.
오버로딩의 경우, 매개변수에 차이가 있다면 리턴 타입을 다르게 해도 상관이 없다.
오버라이딩은,
상속관계에서 부모에게 상속받은 메소드를 자식 클래스에서 재정의 하는 것이다.
오버라이딩의 경우 메소드 이름/매개변수/리턴 타입이 동일해야 한다. 오버라이딩을 의도하고 코드를 작성했는데 셋 중 하나가 만약에 다르다면 컴파일 에러가 발생할 것이다.
또한, 오버라이딩 할 때 해당 메소드의 접근 제한자가 부모 클래스에서 선언한 범위보다 넓거나 같아야 한다. 좁히는 것은 불가능하다.
오버라이딩에 대해 더 자세히 알아보자!
오버라이딩을 할 때에는 @Override를 붙여주고 오버라이드 한다.
'@Override'를 override annotation이라고 부르는 데, annotation은 '주석'이라는 의미이다.
그러면 굳이 오버라이드 어노테이션을 해주지 않아도 오버라이딩 할 수 있지만 왜 오버라이드 어노테이션을 쓰는걸까?
오버라이드 어노테이션을 쓰는 이유는 크게 두 가지 이유가 있다.
첫 번째 이유는 자식 클래스에 메소드가 여러 개일 때, 어떤 메소드가 오버라이드한 메소드인지 알기 쉽게 하기 위함이다.
두 번째 이유는 오버라이드한 메소드에 오타나 놓친 매개변수 등이 있는지를 확인해 컴파일 오류를 잡기 위함이다.
참고: 오버라이딩 어노테이션