무엇인가?
개별적 대상의 공통점을 기준으로 개념화한 것왜 중요한가?
개발은 무엇
을 기준으로 높은 추상화 단계에서 어떻게
인 낮은 추상화 단계를 고려하여 추상화 수준을 넘나들며 일어나기 때문에왜 쓰나?
코드 재활용, 연관 객체 그룹화 언제 쓰나?
정제(refine): 부분적으로 불완전한 클래스를 완전하게 만들 때 왜 쓰나?
객체의 역할을 계약
하여 확장 가능한 객체 그룹을 만들기 위해 추상클래스와 차이는?
추상클래스는 코드의 재활용
이 중점이나 인터페이스는 유연한 확장
이 중점상속을 원하지 않는 클래스에 final 붙이는 이유?
객체는 자신이 원하는 방향으로 하위 객체를 통제하는 계약
을 가져야함. final을 통해 상속하지 말 것
이라는 계약을 맺어 미래의 불확실성을 줄인다.왜 필요한가?
불확실성을 통제 가능한 상황으로 만들고 분류하여 대응하기 위해Error, Checked, Unchecked 차이는?
Error
개발자가 미리 대응할 수 없는 코드 외적 상황Checked
호출하는 쪽에서 복구 가능하다고 믿을 때 Unchecked
Runtime 환경에서 동적으로 발생할 수 있는 예외왜 쓰나?
쓰여야 할 타입을 컴파일 시점에 계약
하여 불확실성을 제어하기 위해왜 String은 다른 객체보다 특별한가?
비트 연산을 처리하는 기계와 문자를 사용하는 개발자 사이의 인터페이스가 문자열이기 때문이다. 매우 많은 빈도로 사용되므로 최적화가 필요하다. String은 어떻게 다른 객체보다 특별한가?
사용되는 문자열은 Method Area의 Constant pool
에 저장되어 새 객체 생성 없이 재사용된다. 왜 필요한가?
코드는 목적을 이루기 위해 존재한다. 목적을 작은 단위로 나누고, 그에 필요한 행동과 데이터를 묶어 객체
로 추상화하면 각 객체의 협력으로 목적을 이룰 수 있다. 이를 통해 높은 수준의 추상화
를 이루는 동시에 여러 객체가 독립적으로 개발되어 생산성, 안정성을 높일 수 있다. 왜 필요한가?
변화하는 외부 상황에 대응하려면 내부의 불확실성
을 줄여야 한다. 이를 위해 불변 객체라는 계약으로 변경가능성을 최소화한다. 왜 필요한가?
OOP의 목적은 변경에 대응 가능한 구조 확립이다. 그러나 객체는 행동은 상태의 변화를 동반한다. 변화는 불확실성을 높인다. 그래서 상태를 변화시키지 않고 부작용이 없는 함수형 프로그래밍
이 필요하게 된다. 왜 쓰나?
빠른 피드백을 통한 개발 효율 증가어떻게 하나?
테스트 하기 어려운 부분(외부 API, 랜덤)을 객체에서 분리 Strategy, DI
인터페이스 도입과 의존성 주입으로 분리Mocking
가짜 객체를 도입하여 I/O, DB 의존 테스트를 분리 왜 쓰나?
외부 변경에 의한 도메인의 변경을 최소화하기 위해 도메인과 그 외 계층을 분리하는 게 핵심. 그 외 계층은 최소한의 의존성을 가지는 View, Controller로 분리. 레벨 1의 핵심을 정리하면 변하는 것
과 변하지 않는 것
을 구분하여 변경 범위를 최소화 시키고 불확실성을 제거하는 것.
백엔드의 레벨로그는 이렇게 되어있군요 신기 신기