자료/객체 비대칭
객체는 추상화 후로 자료를 숨긴 채 자료를 다루는 함수만 공개한다.
자료 구조는 자료를 그대로 공개하며 별다른 함수는 제공하지 않는다.
위 두 정의는 본질적으로 상반된다. 사소한 차이일지라도 그 차이가 미치는 영향은 매우 크다.
아래 코드를 보면 Geometry 클래스는 세 가지 도형 클래스를 다룬다.
각 도형 클래스가 간단한 자료구조이고, 아무런 메소드도 제공하지 않는다.
다만 도형이 동작하는 방식은 Geometry 클래스에서 정의한다.
public class Square{
public Point topLeft;
public 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.141592;
public double area(Object shape) throws NoSuchShapeException{
if (shape instanceof Squeare){
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.radius * c.radius;
}
throw new NoSuchShapeException();
}
}
객체 지향 관점에서 볼때는 위 코드는 절차적이라 올바르지 않을 수 있다.
하지만 100% 올바르지 않다고 할수는 없는 게 만약 Geometry 클래스에 둘레를 구하는 perimeter() 함수를 추가한다면
도형 클래스는 아무 영향도 받지 않고, 도형 클래스에 의존하는 다른 클래스도 영향을 받지 않는다.
반대로 새로운 도형이 포함되면 Geometry 클래스에 속한 함수에 조건을 추가해야 하므로 모두 수정해야 한다.
요약 : 함수 추가의 영향 x, 도형 추가 영향 o
이번에는 객체 지향적인 도형 클래스를 만들어보자.
여기서 area()는 다형메소드이고 Geometry 클래스는 필요하지 않다.
그러므로 새로운 도형을 추가해도 기존 함수에 아무런 영향을 미치지 않는다.
반대로 새로운 함수를 추가하면 도형 클래스 전부를 고쳐야 한다.
요약 : 함수 추가의 영향 o, 도형 추가 영향 x
public class Square implements Shape{
private Point topLeft;
private double side;
public double area(){
return side * side;
}
}
public class Rectangle implements Shape{
private Point topLeft;
private double height;
private double width;
public double area(){
return height * width;
}
}
public class Circle implements Shape{
private Point center;
private double radius;
public final double PI = 3.141492;
public double area(){
return PI * radius * radius;
}
}
위 두 방식은 사실상 반대의 성질을 가지고 있다.
다시 말해, 객체 지향 코드에서 어려운 변경은 절차적인 코드에서 쉽고, 절차적인 코드에서 어려운 변경은 객체지향 코드에서 쉽다.
그러므로 시스템을 짜는 과정에서 새로운 자료 타입이 필요한 경우에는 객체지향 기법으로 처리하는 것이 적합하고,
새로운 자료타입이 아닌 새로운 함수가 필요한 경우는 절차적인 코드의 자료구조가 좀 더 적합하다.
'클린 코드' 카테고리의 다른 글
[클린 코드] 객체와 자료구조(4) (0) | 2022.01.27 |
---|---|
[클린 코드] 객체와 자료구조(3) (0) | 2022.01.26 |
[클린 코드] 객체와 자료구조(1) (0) | 2022.01.19 |
[클린 코드] 형식 맞추기(2) (0) | 2022.01.17 |
[클린 코드] 형식 맞추기(1) (0) | 2022.01.11 |