상속(Inheritance) : 부모가 자식에게 물려주는 행위
→ 객체 지향 프로그램에서도 자식 클래스는 부모 클래스의 필드와 메소드를 상속 받을 수 있다.
상속은 중복되는 코드를 줄여 개발 시간을 단축 시킨다. (이미 잘 개발된 클래스를 재사용하기 때문)
public class 자식클래스 extends 부모클래스 { }
프로그램에서는 자식이 부모를 선택한다.
자식 클래스를 선언할 때 어떤 부모로부터 상속 받을 것인지를 결정하고, 부모 클래스를 extends 뒤에 기술한다.
다른 언어와 달리 자바는 다중 상속을 허용하지 않는다. 즉, extends 뒤에는 하나의 클래스만 올 수 있다는 것.
자식 객체를 생성하면, 부모 객체가 먼저 생성된 다음에 자식 객체가 생성된다.
자식클래스 변수 = new 자식클래스( );
// 이때 부모 객체도 함꼐 생성된다.
모든 객체는 생성자를 호출해야만 생성되는데, 부모 객체의 생성자는 어디서 호출되는 것일까?
→ 자식 생성자의 맨 첫 줄에 숨겨져 있는 super()에 의해 호출된다. super()는 컴파일 과정에서 자동으로 추가된다!
→ 하지만 부모 클래스에 기본 생성자가 없고 매개변수를 갖는 생성자만 있다면, 개발자는 super(매개값, …) 코드를 직접 넣어야 한다.
public 자식클래스(...) {
super();
...
}

Spuerclass는 직접 수정도 가능하다. 원하는 부모 클래스를 입력하면 자동으로 부모 클래스가 지정된다.
부모 클래스의 모든 메소드가 자식 클래스에게 맞게 설계된 것은 아니다. 이러한 메소드를 재정의해서 사용하는 것을 메소드 오버라이딩이라고 한다.
→ 상속된 메소드를 자식 클래스에서 재정의하는 것. 오버라이딩 된 부모 메소드는 숨겨지고, 자식 메소드가 우선적으로 사용된다.
💡 메소드 오버라이딩 규칙 1. 부모 메소드의 선언부 (리턴 타입, 메소드 이름, 매개변수)와 동일해야 한다. 2. 접근 제한을 더 강하게 오버라이딩 할 수 없다. (ex. public → private ❌) 3. 새로운 예외를 throws 할 수 없다.메소드를 재정의하면, 부모 메소드는 숨겨지고 자식 메소드만 사용되기 때문에 비록 부모 메솓의 일부만 변경된다 하더라도 중복된 내용을 자식 메소드도 가지고 있어야 한다.
→ 자식 메소드 내에서 super 키워드와 도트 연산자를 사용해 부모 메소드를 호출하면 해결!
class Parent {
public void method() { }
}
class Child extends Parent {
@Override
public void method() {
super.method();
// 작업 처리
}
}
클래스를 선언할 때 final 키워드를 class 앞에 붙이며 최종적인 클래스이므로 더 이상 상속할 수 없는 클래스가 된다.
= final 클래스는 부모 클래스가 될 수 없다.
final 메소드는 최종적인 메소드이므로 오버라이딩 할 수 없는 메소드가 된다.
부모타입 변수 = 자식타입객체;
→ 자식객체가 부모 타입으로 자동 변환된다.
자식은 부모의 특징과 기능을 상속받기 때문에 부모와 동일하게 취급될 수 있다.
// Cat 클래스가 Animal 클래스를 상속 받은 경우
Cat cat= new Cat();
Animal animal = cat;
Animal animal = new Cat();
cat == animal //true
부모 타입으로 자동 타입 변환된 이후에는 부모 클래스에 선언된 필드와 메소드만 접근이 가능하다. 변수는 자식 객체를 참조하지만, 변수로 접근 가능한 멤버는 부모 클래스 멤버로 한정된다.
✅ 하지만, 자식 클래스에서 오버라이딩된 메소드가 있다면 부모 메소드 대신 오버라이딩 된 메소드가 호출된다. → 다형성과 관련 있음!
💡 왜 오버라이딩 메소드에만 접근이 가능할까? (간단편) 다형성은 **한 타입의 참조 변수를 통해 여러 타입의 객체를 참조할 수 있도록 하는 것이다**. 즉, 상위 클래스 타입의 참조 변수를 통해서 하위 클래스의 객체를 참조할 수 있도록 허용하여 상위 클래스가 동일한 메시지로 하위 클래스들이 서로 다른 동작을 할 수 있도록 한다.자식타입 변수 = (자식타입) 부모타입객체;
캐스팅 연산자를 통해 강제 타입 변환(Casting)을 할 수 있다.
물론, 무조건 강제 변환할 수 있는 것은 아니다. 자식 객체가 부모 타입으로 자동 변환된 후 다시 자식 타입으로 변환할 때! 강제 타입 변화를 사용할 수 있다.