부모클래스의 필드와 메서드를 자식 클래스에게 물려주는 것을 뜻한다.
키워드는 extends로
접근제어자 class 자식클래스명 extends 부모클래스 { }로 정의한다.
물려받는 것이기 때문에 부모 클래스에 필드와 메서드가 추가되면 자식클래스도 다른 행동을 하지않아도 그대로 사용이 가능하다.
또한, 자식클래스에서 추가된 필드와 메서드는 부모클래스에 아무런 영향을 끼치지도 않으므로 자식클래스의 멤버 개수가 부모클래스 멤버 개수보다 많다.

클래스간의 관계에는 위에서 말한 상속관계와 포함관계가 있다.
상속관계는 is - a(~는 ~이다)로 이해하면 되고 포함관계는 has - a (~은 ~를 가지고있다)로 이해하면 쉽다!
차로 예시를 들면 부모클래스를 차, 자식클래스를 스포츠카라고 생각해볼때
스포츠카는 차이다 가 맞지 스포츠가는 차를 가지고있다(?) 가 아니기 때문이다.
포함관계에서는 차는 타이어를 가지고 있다.이지 차는 타이어이다(?)는 말이 맞지않는다.
우선적으로 Java는 다중상속을 허용하지않는다.
(하지만 나중에 배울 인터페이스에서는 다중상속과 비슷한 개념이 있다고 하는데 이는 나중에 추가할 인터페이스 포스트에서 확인이 가능하다.)
다중 상속을 사용하면 여기저기에서 상속받아 더 많은 기능을 사용할 수 있지않나? 싶을테지만 만약 각기다른 부모클래스에서 같은 필드를 사용한다면 자식클래스는 어디서 가져온것인지 판단하기 힘들다. 따라서 클래스간의 관계가 복잡해지기 때문에 사용하지않는다.
final의 개념은 상수에서 사용했던 개념과 같다.
클래스에 final이 붙어 선언되게 되면 최종적인 클래스가 되므로 더이상 상속할 수 없는 클래스가 된다.
자식이 안바꾸면 사용해도 되는거 아닌가? 라고 생각했는데
상속 자체가 overriding(오버라이딩) 개념과 같이 가기때문에 이는 바꾸지않고 그대로 사용한다고 하더라도 상속될 수 없는 클래스인 것이다.
(오버라이딩은 다음 포스트에서 나올테지만 가볍게 설명하자면 부모한테 내려받은 메서드를 재정의해서 쓰는 기법이다.)
메서드 또한 final이 붙어 선언된다면 최종적인 메서드가 되어 더이상 오버라이딩할 수 없는 메서드가 된다. 해당 클래스는 상속이 되지만 메서드는 재정의 할 수 없다는 뜻이다.
Object 클래스는 모든 클래스들의 최상위 부모 클래스이다.
만약 클래스에 아무런 부모클래스를 상속받지않는다면 Object 클래스를 자동으로 컴파일러가 상속하게된다.
여기서 잠깐!
Object 클래스의 메서드 몇가지를 알아보자!
- Object clone() : 해당 객체의 복제본을 생성하여 반환
- clone은 배열에서 얕은복사 깊은복사때 사용했던 그 아이 맞다.
- boolean equals(Object object) : 해당 객체와 전달받은 객체가 같은지 여부를 반환
- equals는 String문자열 비교할 때 사용했었다.
- Class getClass() : 해당 객체의 클래스 타입을 반환
- int hashCode() : 자바에서 객체를 식별하는 정수값인 해시 코드를 반환
- String toString() : 해당 객체의 정보를 문자열로 반환
& Object 클래스에서는 클래스이름 @해쉬코드값 리턴