해당 장은 결론 내용이 가장 해당 장을 내용을 잘 정리해 놓았어서 결론 먼저 기입
결론
객체는 동작을 공개하고 자료를 숨긴다.
그래서 기존 동작을 변경하지 않으면서 새 객체 타입(자료구조)은 추가하기 쉬운 반면, 기존 객체에 새 동작을 추가하기는 어렵다.
자료 구조는 별 다른 동작 없이 자료를 노출한다. 그래서 기존 자료 구조에 새 동작을 추가하기는 쉬우나, 기존 함수에 새 자료구조를 추가하기는 어렵다.
어떤 시스템을 구현할 때, 개로운 자료 타입을 추가하는 유연성이 필요하면 객체가 더 적합하다.
새로운 동작을 추가하는 유연성이 필요하면 자료 구조와 절차적인 코드가 더 적합하다.
상황에 따라 편견 없이 최적의 방향으로 구현한다.
자료 / 객체 비대칭
객체는 추상화 뒤로 자료를 숨긴 채 자료를 다루는 함수는 공개한다.
자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.
public class Square{
public Point topLeft;
pulbic double side;
}
public class Rectangle{
public Point topLeft;
public double height;
public double width;
}
public class Circle{
public Point center;
public double radius;
}
public class Geometry{
public final double PI = 3.141592653589793;
public double area(Object shape) throws NoSuchShapeException{
if(shape instanceof Square){
Square s = (Square)shape;
return s.side * s.side;
}
else if(shape instanceof Rectangle){
Rectangle r = (Rectangle)shape;
return r.height * r.width;
}
else if(shape instanceof Circle){
Circle c = (Circle)shape;
return PI * c.raduis * c.radius;
}
throw new NoSuchShapeException();
}
}
위 코드는 절차적인 도형 클래스다.
각 도형 클래스는 간단한 자료 구조이며 아무 메서드도 제공하지 않는다.
도형이 동작하는 방식은 Geometry 클래스에서 구현한다.
Geometry 클래스는 세 가지 도형 클래스를 다룬다.
위 절차적인 방식으로 구현 시 특징
case 1 : 만약 Geometry 클래스에 둘레 길이를 구한 perimeter() 함수를 추가하고 싶다면?
영향 받는 것 : 기존 도형과 새 도형에 관한 Geometry 클래스에 속한 모든 함수들 고쳐야 함. (각 도형 이용하여 계산하는 로직이 -각 함수에 도형마다 구현되어 있기 때문)
영향 받지 않는 것 : 기존 도형 클래스, 도형 클래스에 의존하던 다른 클래스들
public class Square implements Shape{
public Point topLeft;
pulbic double side;
public double area(){
return side * side;
}
}
public class Rectangle implements Shape{
public Point topLeft;
public double height;
public double width;
public double area(){
return height * width;
}
}
public class Circle{
public Point center;
public double radius;
public final double PI = 3.141592653589793;
public double area(){
return PI * radius * radius;
}
}
위 객체지향적 방식으로 구현 시 특징
case 2 : 새 도형 추가 시 기존 함수들(interface)은 영향을 받지 않는다.
다만 새 함수를 추가하면(interface에) 기존 도형 클래스들 전부를 고쳐야 한다.'
정리하면 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉬우며, 절차적인 코드에서 어려운 변경은 객체 지향 코드에서 쉽다.
복잡합 시스템을 짜다 보면 새로운 함수가 아니라 새로운 자료 타입이 필요한 경우가 생긴다. 이때는 클래스와 객체 지향 기법이 가장 적합하다. 반면, 새로운 자료 타입이 아니라 새로운 함수가 필요한 경우도 생긴다. 이때는 절차적인 코드와 자료 구조가 좀 더 적합하다.
디미터 법칙
디미터 법칙은 잘 알려진 휴리스틱으로, 모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다는 법칙이다.
1. Tell, Don't Ask - 데이터를 달라고 하지 말고 해달라고 객체에게 요청하기
2. Demeter's Law
- 메서드에서 생성한 객체의 메서드만 호출
- 파라미터로 받은 객체의 메서드만 호출
- 필드로 참조하는 객체의 메서드만 호ㅜㄹ
댓글