> For the complete documentation index, see [llms.txt](https://real-dev.gitbook.io/real-library/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://real-dev.gitbook.io/real-library/java_oop_for_spring_framework/undefined/3-..md).

# 3장. 자바와 객체 지향

* 클래스: 객체 = 펭귄:뽀로로 = 사람: 김연아 = 쥐:미키마우스 라고 설명한다. 학원이나 교보재에서 설명하는 클래스와 객체의 관계가 붕어빵틀: 붕어빵의 관계가 아니며 실체화된 개체가 바로 객체인 점을 강조한다.
* 추상화란 구체적인 것은 분해해서 관찰자가 관심 있는 특성만 가지고 재조합하는 것이라고 정리할 수 있다. (예를 들면 이집트 벽화처럼)
* 추상화는 에플리케이션 경계에 따라 조합된다. 인터넷 뱅킹 어플에 포함되는 회원 정보에 키, 몸무게, 혈액형은 필요없다. 반대로 병원 어플에 포함되는 회원 정보엔 포함된다. 즉, 문맥에 따라 주요한 성질만 뽑아서 모델링 하는 것. 이것이 추상화다.
* 클래스 필드는 static 영역에 로드된다. 이 때 클래스에 속한 필드들도 함께 스태틱 영역에 로드되지만, 별도의 메모리 할당 공간은 부여되지 않는다. 클래스 변수는 객체가 생성되고 힙 영역에 할당된다.
* 추상화의 개념을 조금 넓게 본다면 상속을 통한 추상화, 구현, 인터페이스를 통한 추상화, 다형성을 통한 추상화도 객체 지향의 추상화 개념에 포함된다.
*
* 이 책의 가장 좋은 점은 설명이 굉장히 구체적이고 시각적으로 이뤄지는 점이다. 솔직히 너무 많은 부분을 동어반복으로 설명하는 경향이 있지만 어려운 개념을 최대한 쉽게 설명하고자하는 저자의 의도는 잘 전해진다.
* 그림 3-7에서 name, age, countOfTail 필드는 객체에 속한다. 또한 sing() 메서드 역시 객체 멤버에 속한다.

### 상속: 재사용+확장

* 객체지향 프로그래밍에서 상속은 진짜 부모, 자식의 관계가 아니라 재사용과 확장의 관계이다. `B is a kind of A. (B는 A의 한 종류이다, A와 B 모두 클래스 즉, 분류이기 때문에 B is A보다 kind of a로 표현하길 권유한다)` 따라서 사실 부모 클래스, 자식 클래스보단 슈퍼 클래스, 서브 클래스라는 표현이 더 적합하다.
* 심지어 자바에선 상속에 inheritance가 아닌 extends 키워드를 사용한다. **확장**이다.
* Java와 C#은 다중 상속을 지원하지 않는다. 둘 이상의 슈퍼 클래스에서 동일한 이름의 무언가를 상속하면 둘 중 뭘 상속할지 결정할 수 없다. 다중 상속의 다이아몬드 문제라고 하는 이것 때문에 인터페이스를 도입하고, 다중 상속은 포기했다.

### 인터페이스

* 인터페이스와 구현 클래스의 관계는 a kind of 보다도 is able to 인터페이스 관계. 즉 서브 클래스는 인터페이스 할 수 있다. 관계로 이해하는 것이 적합하다.
* 대표적인 것들이 자바 API 중 Serializable, Cloneable, Comparable 등 특정 인터페이스를 구현할 때, \~\~ 할 수 있다 하는 수식어구가 많다.

### 상속과 T 메모리

* 서브 클래스 객체가 생성되면, 상위 클래스 객체도 함께 힙 영역에 생성된다. 그림 3-31의 main() 스택 프레임에 `pororo` 객체가 추가되면서, 힙 영역엔 `Penguin` 인스턴스와 `Animal` 인스턴스가 생성되었다. 사실 모든 객체는 `Object`를 상속하기 때문에 `Object` 객체도 하나 생성되었다.
