2022.03.01
6장. 객체와 자료 구조
자료를 세세하게 공개하기보다는 추상적인 개념으로 표현하는 편이 좋다. ... 개발자는 객체가 포함하는 자료를 표현할 가장 좋은 방법을 심각하게 고민해야 한다. (p.119)
절차적인 코드는 기존 자료 구조를 변경하지 않으면서 새 함수를 추가하기 쉽다. 반면, 객체 지향 코드는 기존 함수를 변경하지 않으면서 새 클래스를 추가하기 쉽다.
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.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.radius * c.radius;
}
throw new NoSuchShapeException();
}
}
위 코드는 절차적인 코드이다. 따라서 기존 자료구조 Square
, Rectangle
, Circle
을 변경하지 않고 Geometry
만 변경하여 새로운 함수를 추가하기 쉽다.
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.141592653589793;
public double area() {
return PI * radius * radius;
}
}
반면 위와 같이 객체 지향적인 코드는 기존 함수를 변경하지 않으면서 새로운 클래스를 추가하기 쉽지만, 새로운 함수를 추가하기 위해서는 모든 클래스를 고쳐야 한다는 단점이 있다.
일단 한 마디로 표현하자면 내가 객체 지향에 대해 정말로 무지하다는 것을 깨달았다. 저자가 말하려고 하는 의도를 거의 파악하지 못하였지만 어떤 것을 말하고 싶어하는지 대충은 알 것 같다. 앞으로 객체 지향에 대해서도 더욱 공부를 해야할 것 같다.