상속의 정의
- 상속은 내가 없는 것을 부모에게 물려 받아서 원래 내 것처럼 사용하는 것이다
- 부모클래스에서 private 접근 필드를 갖는 멤버는 상속이 불가능하다
- 자바는 상속을 딱 하나만 받을수 있다(사람이 포유류랑 조류에 둘 다 속하지 않는 것처럼)

- 부모클래스에서 birth 메서드와 eat 메서드를 만들어주었다

- 3 : Mamal을 상속받겠다는 의미, 처음 클래스 만들때 superclass로도 상속가능

- Person 클래스를 호출하여 객체화 시켜주었지만 상속받았기 때문에 부모클래스 객체화 없이
부모 클래스에 있는 메서드도 사용가능
상속의 특징
- 상속은 부모 클래스의 멤버를 내것처럼 사용하는것
- 상속은 하나만 가능하다
- 상속의 키워드는 extends다.
- 그래서 부모클래스를 따로 객체화 하지 않는다
- 사실은 자식클래스를 객체화 하기 전에 부모 먼저 객체화가 되는것이다
- 자식 키워드 객체화시 부모 객체 초기화도 가능하다

- 생성자를 만들어줄때는 부모생성자가 제일 먼저 호출되는데 생략 가능하다


- 자식클래스인 Child를 객체화 시키는 경우 자식클래스 안에 부모클래스 호출이 제일 먼저 일어난다
- 출력값 :

super()생략 못하는 경우

- 생성자를 만들 때 인자값이 있게 만듦

↓

- 부모클래스에서 생성자를 만들 때 인자값을 부여 했으므로 super()를 생략 못하고 인자값을 부모의 생성자와 맞춰줘야한다.
- 이 경우 자식이 부모의 멤버를 초기화 할 수 있는것이다.
- 11 : 자식객체에 저장되는 것이다
override
- 부모 클래스의 멤버를 쓰고 싶은데 아쉽거나 수정하고 싶을 때 사용. 상속관계에서만 일어날 수 있다.
- alt + shift + s 누르면 사용가능한 키워드 나온다
- 면접에서 오버로드랑 오버라이드 차이점 많이 물어본다. 하지만 둘은 완전히 다른 개념

- 부모 클래스

- 10 : 부모클래스에 있는 메서드를 변경해주었다.
- 14 : 컨트롤키를 누르고 어디의 메서든지 알고싶은경우 그 변수를 클릭 하면 그 클래스로 넘어간다
- final이 붙은 메서드는 부모클래스에 있는 메서드라고 하더라도 오버라이드 할수 없다.
다형성
- 자식객체가 부모객체 형태의 변수에 들어갈 수 있기 때문에 같은 부모를 상속받은 클래스는 같은 타입으로 들어갈 수 있다

- ChildOne~Four는 각각 같은 부모클래스를 가지고 있다
- 각각 자식 클래스를 객체화를 시킨뒤 부모클래스의 메서드를 사용하고 싶은경우 일일이 변수를 지정해줘야하는 어려움과
코드도 계속 변경해줘야하는 어려움이 있다.( 자원성의 이득 )

- 여기서 다형성을 이용하여 부모클래스의 변수 하나를 지정해준다
- 이 부모 형태의 변수를 이용해 모든 자식클래스들을 객체화 시켜줄 수 있다
- 이 때 자식이 부모로 들어 가는거기 때문에 묵시적 형변환이 일어난다
- 그래서 변수 하나를 가지고 돌려 쓸 수 있지만, 같이 들어가 있는 것은 아니고 계속 변하는 것이다
promotion

- 위의 그림처럼 상속을 시켜줬을 경우이다
- 묵시적 형변환은 자식클래스가 부모 클래스로 들어가는것을 의미하는데 최상위에 있는 부모 클래스까지 가능하다
○ 예 : Cat은 Mammal에도 속하고 Vertevrate에도 속한다.
- 14 ~ 19 : 그래서 4개의 자식 클래스들을 척추동물에 넣어 객체화가 가능 한것이다.
- 21 ~ 24 : 최상위 부모클래스가 같다고 해서 그 최상위의 다른 부모 클래스로 들어갈 수는 없다.
- 면접 질문 : promotion과 casting 차이 ★
○ promotion , casting 은 상속관계에서만 일어남
○ promotion : 자식이 부모로 들어감
○ casting : 부모가 자식으로 들어감 ( 포유류에서 개가 될지 고양이가 될지 )
다형성의 단점

- 부모의 형태로 들어가면 자식의 고유 특성이 사라진다
- 고유 특성을 사용하고 싶으면 다시 자식으로 변해야한다.(casting)

- 부모클래스 Mammal

- 자식클래스 Dog
- 상속관곈데 같은 메서드가 있으면 오버라이드 한 것이다.
- 부모클래스의 birth를 오버라이드해서 실행문을 바꿨다.

- 자식클래스 Cat
- 상속관곈데 같은 메서드가 있으면 오버라이드 한 것이다.
- 부모클래스의 birth를 오버라이드해서 실행문을 바꿨다.

- 상속관계의 다형성을 이용해 Dog(자식)이 Mammal(부모) 형태로 들어감
- 그래서 이 경우에는 부모로 들어 왔기 때문에 개의 고유 특성을 사용할 수 없다.
- 개의 고유 특성을 사용하고 싶다면 casting을 해줘야한다(mammal -> 개 로 다시 변화시켜줘야함)
- 13 : casting하는 과정
- 14 : casting을 했다면 개의 고유특성 사용 가능
- 출력 값 :


- 위에서 7줄을 통해 Dog를 Mammal로 넣어주었다
- 근데 개의 고유특성을 사용하려면 casting을 해줬는데 고양이는 casting을 할 수 없다
○ Dog만 포유류에만 넣어 줬을 뿐 Cat은 아무런 선언을 안해줬기 때문이다( 개 - > 포유류 -> 고양이 가 안되기 때문)
○ 그래서 위를 실행하면 오류 난다.

- mal이 Cat으로 부터 온건지 Dog으로부터 온건지 모를 때 확인하는 방법이다.
- instanceof : 참조변수가 참조하고 있는 객체의 실제 타입을 알아보기 위해 사용
○ 참조변수 instanceof 타입(클래스명) 으로 쓰인다
○ true 나 false를 반환
- if(mal instanceof Cat) : mal의 타입이 Cat이었어?
- 아니기 때문에 else가 실행 된다.