
이렇게 기존에 설계되어 있던 클래스에서 새로운 속성이나 기능을 추가하기 위해 새롭게 만드는 클래스 설계할 때나

기존의 여러 클래스들에서 필요한 속성들을 가지고 새롭게 정의한 클래스를 만들려고할 때 상속 이라는 개념이 필요하다.


이렇게 이름, 나이, 동물 유형으로 구성된 클래스가 있다면

Dog이라는 서브 클래스로 상속을 받을 때 기본 생성자의 속성들 중 이름과 나이만 받고, 수퍼 클래스의 생성자를 호출하면서 type에는 "개"라고 붙여주면 된다.
그렇게 된다면 Animal 클래스로 생성된 인스턴스 객체 a와 Dog 클래스로 생성된 인스턴스 객체 b는 서로 같은 속성과 기능을 갖게 된고, 같은 결과를 낳게된다.

그리고 서브 클래스 내에서도 함수 생성으로 수퍼 클래스에 영향을 받지 않는 기능 수행 또한 가능함을 알 수 있다.

수퍼 클래스와 서브 클래스에서는 같은 속성을 가지면 안된다.
하지만 수퍼 클래스에서 허용만 한다면 서브 클래스에서 같은 이름과 형태로 된 함수의 내용을 다시 구현 가능하다.

Animal 클래스에서 eat함수로 "음식을 먹습니다" 기능을 수행하는 것을 Tiger라는 서브 클래스에서 상속 받아 함수를 접근하면 같은 기능 수행하는 것은 이제 알 것이다. 하지만 Tiger클래스에서는 "고기를 먹습니다" 라는 기능을 수행하고 싶다면 이때 오버라이딩을 해야하는 것이다.
라고 하면 되는 것이다.

다시 되돌아와서 상속받은 서브 클래스에서 오버라이딩으로 출력문을 변경하고자 한다면
1. 수퍼 클래스의 함수 앞에 open 선언 : 함수 또한 open으로 열어줘야 재정의가 가능하다.
2. 재정의 하려는 함수에서는 override 선언
이 둘을 꼭 해줘야지만 가능하다.
수퍼 클래스에서는 함수의 구체적인 구현은 없고, 단지 Animal의 모든 서브 클래스는 eat이라는 함수가 반드시 있어야 하는 상황에서 각 서브 클래스가 비어있는 함수의 내용을 필요에 따라 구현하도록 할 때 추상화라는 개념이 필요하다.
: 선언부만 있고, 기능은 구현되어있지 않은 추상 함수, 추상 함수를 포함하는 추상 클래스라는 요소로 구성되어있다.

이미지와 같이 함수의 내용은 없고, 그냥 선언만 해야하는 경우에는 앞에 abstract 라는 키워드를 명시해줘야한다. 또한 함수 뿐 아니라 포함하는 클래스 또한 추상 클래스임을 밝혀야 하기에 클래스 앞에서도 abstract를 명시해야한다.

그리고 특이점은 추상 클래스는 단독으로 인스턴스 생성은 불가능하다. 그래서 추상 클래스를 생성했다면 반드시 서브 클래스에서 상속받아 함수의 내용을 구현해줘야 한다.
: 속성, 추상함수, 일반함수 모두 가질 수 있는 기능
=> 별도의 키워드 명시(open, abstract)가 없어도 서브 클래스에서 구현 및 재정의가 가능하다

또한 여러 인터페이스들을 조합하여 하나의 클래스에 상속도 받을 수 있다.

이렇게 Runner라는 인터페이스 내 run이라는 함수는 자동적으로 abstract 함수로 간주하게 되는 것이고, Eater 인터페이스 내 eat 함수는 open 함수로 간주하게 된다.
그러면 Dog 클래스에서는 이 2개를 상속 받아 각각의 함수를 재정의 override 키워드 명시로 재정의를 해주면 정상적으로 작동한다.
=> 여러 인터페이스나 클래스에서 같은 이름과 형태를 가진 함수를 구현하고 있다면 서브 클래스에서 혼선이 일어나지 않도록 재정의하여 구현해야한다.