Ch6. 객체와 자료구조
변수를 private (비공개)로 정의하는 이유? 남들이 변수에 의존하지 않게 만들고 싶어서.
하지만 왜 get / set 함수를 당연히 공개 (public)해서 외부에 노출할까?
자료추상화
- 자료를 세세히 공개하기보단 추상적인 개념으로 표현하는 편이 좋다.
- 인터페이스, get/set 함수만으로 추상화가 이뤄지지 않는다.
- 자료/객체 비대칭
- 변수사이에 함수라는 계층을 넣는다고 구현이 저절로 감춰지지 않으며 구현을 감추려면 추상화가 필요하다
- 추상인터페이스를 제공해 사용자가 구현을 모른채 자료 핵심을 조작할 수 있어야 진정한 의미의 클래스
- 아무 생각없이 get/set 추가는 나쁘다
// 구체적인 Vehicle 클래스
public interface Vehicle {
double GetFuelTankCapacityInGallons();
double GetGallonsOfGasoline();
}
// 추상적인 Vehicle {
double GetPercentFuelRemaining();
}
자료/객체 비대칭
- 객체와 자료구조는 근본적으로 양분된다
- (자료구조 사용하는) 절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면 객체지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가 하기 쉽다
- 객체지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며 절차적인 코드에서 어려운 변경은 객체지향 코드에선 쉽다
- 새로운 자료타입이 필요하면 클래스, 객체지향 기법이 적합하며 새루운 함수가 필요하면 절차적인 코드, 자료구조가 좀 더 적합
- 자료구조 방식과 객체지향 간의 잡종 사용은 안된다.
디미터법칙?
객체 지향 프로그래밍에서 코드의 결합도를 낮추기 위해 고안된 설계 원칙 중 하나. 이 법칙은 객체가 다른 객체와 어떻게 상호작용해야 하는지를 규정하며, "친구와만 대화하고, 친구의 친구와는 대화하지 않는다"는 간단한 원칙으로 요약할수있다.
* 핵심 개념
- 객체 간 결합도 최소화
객체는 자신이 직접 참조하는 객체(친구)와만 상호작용해야 하며, 그 객체가 참조하는 객체(친구의 친구)와는 상호작용하지 않아야 합니다. - 캡슐화 강화
내부 구현을 외부에 노출시키지 않도록 하여 코드 유지보수성과 재사용성을 높입니다. - 직접적인 접근 권장
객체는 다음 네 가지와만 상호작용해야 합니다.- 자기 자신
- 메서드의 매개변수로 전달된 객체
- 메서드에서 생성된 객체
- 클래스의 속성으로 직접 참조하는 객체
// 위반코드
public class Person {
private Address address;
public Address getAddress() {
return address;
}
}
public class Address {
private String city;
public String getCity() {
return city;
}
}
Person person = new Person();
String city = person.getAddress().getCity(); // 친구의 친구에 직접 접근
// 준수 사례
public class Person {
private Address address;
public String getCity() {
return address.getCity(); // 캡슐화
}
}
Person person = new Person();
String city = person.getCity(); // Person과만 상호작용
결론
객체는 동작을 공개하고 자료를 숨긴다. 기존 동작을 변경하지 않으면서 새 객체 타입 추가가 쉬우나 기존 객체에 새 동작을 추가하기는 어렵다.
자료구조는 별다른 동작없이 자료를 노출한다. 동작 추가는 쉬우나 기존 함수에 새 자료구조를 추가하기는 어렵다
'프로그래밍&IT > 학습, 책' 카테고리의 다른 글
[클린 코드] 5. 시스템 (0) | 2025.01.13 |
---|---|
[클린 코드] 5. 오류처리, 경계, 단위테스트 (0) | 2025.01.12 |
[클린 코드] 3. 함수 / 주석 / 형식 맞추기 (0) | 2025.01.06 |
[클린 코드] 1. 깨끗한 코드 정의 / 2. 의미있는 이름 (2) | 2024.12.15 |
"파일은 인터넷 또는 제한 영역에 있거나 웹 표시가 있으므로 ~ " 이상시 처리 (2) | 2024.11.13 |