김시용
1. 📌 핵심 개념 정리
✅ 요약하기
- 자료 추상화
추상 인터페이스를 제공해 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 진정한 의미의 클래스다. (인터페이스나 조회/설정 함수만으로는 추상화가 이뤄지지 않는다)
- 자료/객체 비대칭
객체는 동작을 공개하고 자료를 숨긴다. 그래서 기존 동작을 변경하지 않으면서 새 객체 타입을 추가하기 쉽다. 반면, 기존 객체에 새 동작을 추가하기는 어렵다.
자료 구조는 별다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료 구조를 추가하기는 어렵다.
보통 모든 것을 객체로 바라보지만, 때로는 단순한 자료 구조가 적합한 상황도 있다.
- 디미터 법칙
자신이 조작하는 객체의 내부를 몰라야 한다는 법칙이다.
객체는 자료를 숨기고 함수를 공개한다. (조회 함수로 내부 구조 공개하면 안된다)
기차 충돌 : 함수의 반환형이 호출하는 함수를 바로 호출하는 경우
자료 구조는 무조건 함수 없이 공개 변수만 포함하고 객체는 비공개 변수와 공개 함수를 포함한다면 디미터 법칙 어기지 않는다.final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
위의 기차 충돌 예시에서 반환하는 값이 필요한 이유가 무엇인가? 해당 이유에 맞는 동작(임시 파일 생성)을 구현하여 자료 구조의 내부를 감춘다.BufferedOuputStream bos = ctxt.createScratchFileStream(classFileNmae);
- 자료 전달 객체
DTO (Data Transfet Object)로 DB에 저장된 가공되지 않은 정보를 Application code에서 사용할 객체로 변환하는 처음 단계에서 사용하는 구조체다.public class Address { private String street; private String streetExtra; private String city; private String state; private String zip; public Adress(String street, String streetExtra, String city, String state, String zip) { this.street = street; this.streetExtra = streetExtra; this.city = city; this.state = state; this.zip = zip; } // 각 변수 반환하는 get 함수들... }
- 활성 레코드로 구현 가능
공개 변수가 있거나, 비공개 변수에 조회/설정 함수가 있는 자료 구조지만, 대개 save, find 같은 탐색 함수도 제공한다.
레코드는 자료 구조로 취급한다. 비지니스 규칙 메서드를 레코드에 구현하지 마라.
- 활성 레코드로 구현 가능
공개 변수가 있거나, 비공개 변수에 조회/설정 함수가 있는 자료 구조지만, 대개 save, find 같은 탐색 함수도 제공한다.
2. 🤔 이해가 어려운 부분
🔍 질문하기
- 디미터 법칙
-
어려웠던 부분
예시가 없어서 이해가 어렵다. -
궁금한 점 디미터 법칙을 어긴 예시 코드와 그것을 개선한 코드 살펴보기
-
디미터 법칙을 어긴 예시 코드
class Address { constructor(city) { this.city = city; } getCity() { return this.city; } } class Person { constructor(name, address) { this.name = name; this.address = address; } getAddress() { return this.address; } } class Company { constructor(name, owner) { this.name = name; this.owner = owner; } getOwner() { return this.owner; } } // 사용 예시 const address = new Address("Seoul"); const person = new Person("John", address); const company = new Company("TechCorp", person); // 기차 충돌 문제점 발생 console.log(company.getOwner().getAddress().getCity()); // Seoul 출력
- 개선한 예시 코드
class Address { constructor(city) { this.city = city; } getCity() { return this.city; } } class Person { constructor(name, address) { this.name = name; this.address = address; } getCity() { return this.address.getCity(); // 중간 단계 숨기기 } } class Company { constructor(name, owner) { this.name = name; this.owner = owner; } getOwnerCity() { return this.owner.getCity(); // 중간 객체와 직접 상호작용 X } } // 사용 예시 const address = new Address("Seoul"); const person = new Person("John", address); const company = new Company("TechCorp", person); // 기차 충돌 문제 해결 console.log(company.getOwnerCity()); // "Seoul" 출력
-
3. 📚 참고 사항
📢 논의하기
관련된 자료가 있다면 공유하고, 더 깊이 논의하고 싶은 아이디어나 의견을 정리합니다.
- 논의하고 싶은 주제
- 주제
객체 지향 vs 절차 치향 - 설명
보통 객체 지향으로 모두 개발하지만, 책에서는 절차 지향이 적합한 상황도 있다하는데 어느 상황에서 절차 지향이 적합한가?
- 주제
- 절차 지향적인 코드가 적합한 경우
- 단순한 데이터 처리
객체 간의 복잡한 상호작용이 필요하지 않은 경우
- 일회성 스크립트
데이터를 가져와서 가공하고 저장하는 간단한 작업
- 성능이 중요한 경우
불필요한 객체 생성을 줄이고, 순차적인 처리가 유리한 경우
- 기능 중심의 코드
데이터보다는 로직이 중심이 되는 경우