객체와 자료구조
객체와 자료 구조
-
객체: 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉬움
-
자료 구조: 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기 어려움
1. 자료 추상화
- 구현을 감추려면 추상화 필요
- 자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋음 … 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민 해야 함
2. 자료/객체 비대칭
- 두 정의는 본질적으로 상반된다.
- 객체는 추상화 뒤로 자료를 숨김 채 자료를 다루는 함수만 공개
- 자료 구조는 자료를 그대로 공개
- (자료 구조를 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
- 반대로, 절차적인 코드는 새로운 자료 구조를 추가하기 어렵다. 그러려면 모든 함수를 고쳐야 한다. 객체 지향 코드는 새로운 함수를 추가하기 어렵다. 그러려면 모든 클래스를 고쳐야 한다.
3. 디미터 법칙
- 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙
- 기차 충돌
- 일반적으로 조잡하다 여겨지는 방식이므로 피하는 편이 좋다.
newValue = newValue.split("").reverse().join("");
(이건 아닌것 같은데..?)
- 일반적으로 조잡하다 여겨지는 방식이므로 피하는 편이 좋다.
- 잡종 구조
- 절반은 객체 / 절반은 자료 구조 (양쪽 세상에서 단점만 모아놓은 구조)
- 중요한 기능을 수행하는 함수 + 공개 변수나 공개 조회/설정 함수
- 구조체 감추기
4. 자료 전달 객체(Data Transfer Object, DTO)
- 기차 충돌
- 공개 변수만 있고 함수가 없는 클래스 - 자료 구조체의 전형적인 형태
- 특히 데이터 베이스와 통신하거나 소켓에서 받은 메시지의 구문을 분석할때 유용
- 활성 레코드
- DTO의 특수한 형태
- 공개 변수가 있거나 비공개 변수에 조회/설정 함구아 있는 자료 구조, 대개 save나 find와 같은 탐색 함수도 제공함.
- 활성 레코드는 데이터베이스 테이블이나 다른 소스에서 자료를 직접 변환한 결과임
- 활성 레코드는 자료 구조로 취급
- 비즈니스 규칙을 담으면서 내부 자료를 숨기는 객체는 따로 생성
5. 결론
- 새로운 자료 타입을 추가하는 유연성이 필요하다면
객체
- 새로운 동작을 추가하는 유연성이 필요하다면
자료구조와 절차적인 코드