들어가기 전
회사의 사원 클래스를 수평적 구조로 설계한다고 가정해보자

- 객체를 설계하다 보면 비슷한 클래스의 경우 중복되는 요소가 발생한다.
- 수평적 구조의 단점
- 코드의 중복이 발생
- 새로운 요구사항 발생시 반영이 어렵다(유지보수가 어렵다.)
- 확장성이 떨어진다
회사의 사원 클래스를 수직적 구조로 설계한다고 가정해보자

- 객체를 수직적 구조로 설계할 때 장점
1. 코드의 중복을 최소화
2. 새로운 요구사항 발생시 반영이 쉽다(유지보수가 쉽다)
3. 확장성이 좋아진다
클래스를 계층화 하여 수직적 구조로 설계하는 것을 상속이라고 한다.
상속이란?
- 상속이란 기존 클래스를 재사용하여 새로운 클래스를 작성하는 것이다.
- 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 용이하다.
-> 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다.
메모리를 통한 상속의 이해

- 서브 클래스는 상위 클래스의 기억공간을 사용할 수 있다.
- 자식 클래스에서 부모클래스의 생태정보로 직접 접근하지 못하도록 정보은닉을 해야한다. (protected, private -> private를 주로 사용)

- 상속관계에서 초기화를 할 때 부모의 생성자에서 초기화하는 것이 좋다.
- 자식 클래스의 생성자에서 super(name, age, phone); 을 통해 부모 클래스의 생성자로 데이터를 보내고 부모 클래스의 생성자를 통해 초기화 한다.

- 상속 체이닝 : 클래스 생성자에 생략되어있는 super()를 통해 부모의 클래스부터 객체가 생성되어 자식까지 연결되는 구조
- 자식 클래스는 상속되어있는 부모클래스는 물론 최상위 클래스인 Object클래스 까지 연결되어있다.
Override(오버라이드)

- 상속 관계에서 하위 클래스가 상위 클래스의 메서드(동작)를 재정의 하는 행위이다.(기능 추가, 변경)
- 하위클래스에서 오버라이딩하는 메소드는 상위클래스의 이름, 매개변수, 반환타입이 같아야 한다.
부모의 타입으로 업캐스팅하게 되면 자식 클래스의 멤버에는 접근할 수 없다. 하지만 Override를 통해 부모의 메서드를 자식에서 재정의 하게 되면 동적바인딩을 통해 접근할 수 있다.
- 동적 바인딩 : 실행 시점(Run time)에 어떤 메서드를 호출할 지 정해지는 바인딩 방식
Overloading(오버로딩)

- 하나의 클래스 내에서 동일한 이름의 메서드를 여러 개 사용할 수 있는 객체지향 기법
- 동작이 비슷하기 때문에 메서드 이름을 같게 만들어 사용하면 편리하다
- 메서드의 시그니처(signature) 가 달라야 한다
- 정적 바인딩 : 컴파일(Compile time) 시점에 어떤 메서드를 실행할지 결정하는 바인딩 방식