- OOP = 클래스 기반 프로그래밍
- 클래스 기반
- 클래스 = 데이터 + 데이터 조작 논리
- 프로그램 = 클래스 + 클래스
- 클래스 설계가 잘 되면 유지보수, 변경이 쉬운 코드 작성 가능
💡 클래스 설계란, 인스턴스 변수가 잘못된 상태에 빠지지 않게 하기 위한 구조 만드는 방법
클래스 단위로 잘 동작하도록 설계하기
클래스 단위로도 잘 동작하게 설계해야 한다
- 초기설정을 따로 하지 않아도 곧바로 사용할 수 있도록 만들어야 함
- 데이터와 로직이 한 군데 모여있도록 구현
- 최소한의 메소드만 외부에 제공
클래스 구성요소
- 인스턴스 변수
- 인스턴스 변수를 정상적으로 조작하는 메소드
자기방어 임무
성숙한 클래스로 성장시키는 설계 기법
생성자 사용하기
- 로우 데이터 객체
- 초기화되지 않은 상태 유발 클래스
- 쓰레기 객체
- 해법
- 생성자에 초기화 로직 작성
- 생성자에 유효성 검사 작성 (가드)
- 효과
계산로직 데이터와 함께 묶기
- 응집도를 높이는 방법
- 클래스 = 데이터 + 데이터 조작 로직
불변변수로 예상 못한 동작 막기
- 예상치 못한 부수 효과 방지 방법
- 인스턴스 변수를 final로 immutable하게 변경
- 의미 없거나 잘못된 값 할당 불가
새로운 인스턴스로 값 변경
- 인스턴스 변수가 final이라면 값 변경 불가
- 인스턴스 변수 값 변경을 원하면, 새로운 인스턴스를 생성해서 사용
Money add(Money money) {
int added = amount + money.amount;
return new Money(added);
}
매개변수, 지역변수 final
- 매개변수, 지역변수는 최대한 변경하지 않는 것이 좋음
- final로 값 할당을 방지하는 것도 좋은 방법
엉뚱한 값 전달 방지
- 기본 자료형이 아니라, 값 객체를 만들어 매개변수로 전달
- 같은 자료형이지만, 의미가 다른 값이 전달되는 현상 방지
- 다른 자료형이 매개변수로 주어지면 컴파일 에러
무의미한 메소드 추가 지양
- 꼭 필요한 메소드만 구현해서 사용
- 다른 사람이 모르고 쓸 수 있다는 생각
악마 퇴치 효과 검토하기
- 중복코드 ← 생성자 초기화
- 수정누락 ← 데이터 + 로직 묶기
- 가독성저하 ← 데이터 + 로직 묶기
- 쓰레기 객체 ← 생성자 초기화
- 잘못된 값 ← final 인스턴스 변수
- 부수효과 ← final 인스턴스 변수, 매개변수, 지역변수
- 값 전달 실수 ← 값 객체 자료형 매개변수
프로그램 구조의 문제 해결에 도움을 주는 디자인 패턴
완전 생성자
- 클래스 (인스턴스 변수)가 잘못된 상태를 갖지 않도록 보호하는 패턴
- 생성자에서 모든 인스턴스 변수를 초기화하는 방법
- 가드와 함께 사용하면 금상첨화
값 객체
- 값을 클래스(자료형)으로 나타내는 패턴
- 값과 로직의 응집도 증가
- 잘못된 값 방지
- 완전 생성자와 함께 쓰면 좋다좋아