해당 10p 짜리 6장의 내용은 나의 OOP에 대한 이해가 얼마나 부족한지를 상기시켰다.
짧은 식견으로 자료를 추상화하고 객체를 나누는 것에 대해 익숙치 않고 추상화하는 이유가 경험적으로 와닿지 않으니 이해하기가 힘들었다.
그래도 요약해보려고 한다.
구현을 외부로 노출하고 구현을 완전히 숨긴다.
이 두 개념은 서로 정반대라고 할 수 있다. 객체는 데이터를 은닉하고 동작(메서드)을 공개하며, 자료 구조는 데이터를 공개하고 동작을 포함하지 않는다.
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();
}
}
여기서 도형 클래스는 단순한 자료 구조로, 데이터를 그대로 공개한다. 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;
}
}
여기서 각 도형 클래스는 Shape
인터페이스를 구현하고, 자신만의 area
메서드를 가진다. Geometry
클래스는 필요 없다. 새로운 도형을 추가해도 기존 클래스에는 아무런 영향을 주지 않는다.
객체 지향과 절차적 코드의 차이를 이해하면, 어떤 상황에서 어떤 방식을 사용하는 것이 적합한지 판단할 수 있다.
디미터 법칙은 "모듈은 자신이 조작하는 객체의 속사정을 몰라야 한다"는 법칙이다. 즉, 객체는 내부 구조를 숨기고, 필요한 동작만을 외부에 공개해야 한다는 뜻이다.
디미터 법칙을 지키면 코드의 결합도가 낮아지고, 유지보수가 쉬워진다.
따라서, 잡종 구조는 피하는 것이 좋다. 객체는 동작을 공개하고 자료를 숨겨야 하며, 자료 구조는 자료를 공개하고 동작을 숨겨야 한다.
객체 지향 프로그래밍과 절차적 프로그래밍의 차이를 이해하고, 상황에 맞게 적절히 적용하는 것이 중요한다. 객체는 동작을 공개하고 자료를 숨기고, 자료 구조는 자료를 공개하며 동작을 숨긴다. 이 두 가지 접근 방식을 잘 활용하면, 더 유연하고 유지보수하기 쉬운 소프트웨어를 작성할 수 있다.
본 글은 클린코드 스터디에서 읽은 내용과 질문을 재구성한 글 입니다.