| 구분 | 절차적(자료구조) | 객체지향(객체) |
|---|---|---|
| 새로운 함수 추가 | 쉬움 | 어려움 |
| 새로운 데이터 추가 | 어려움 | 쉬움 |
| 데이터 접근 | 직접 접근 | 메서드 통해서만 |
2025.07.13
절차적 프로그래밍: 데이터와 그 데이터를 조작하는 함수가 분리되어 있는 프로그래밍 패러다임
객체지향 프로그래밍: 데이터와 그 데이터를 조작하는 함수(메서드)를 하나로 묶어서 캡슐화하는 프로그래밍 패러다임
휴리스틱: 경험과 직관에 기반한 문제 해결 방법. 완벽하지는 않지만 대부분의 경우에 빠르고 효과적인 해결책을 제공하는 경험적 규칙
자료 추상화
자료/객체 비대칭
객체와 자료 구조의 개념은 사실상 정반대다. 사소한 차이로 보일지 모르지만 그 차이가 미치는 영향은 굉장하다.
객체
// 객체 지향 방식 (데이터와 로직 통합)
class Square(
private val topLeft: Point,
private val side: Double
) {
fun area(): Double = side * side
fun perimeter(): Double = 4 * side
}
자료 구조
// 절차적 방식 (데이터와 로직 분리)
data class Square(val topLeft: Point, val side: Double)
class Geometry {
fun area(shape: Square): Double = shape.side * shape.side
}
디미터 법칙
// 나쁜 예: 기차 충돌
final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();
// 좋은 예: 캡슐화
Options opts = ctst.getOptions();
File scratchDit = opts.getScratchDir();
final String outputDir = scratchDir.getAbsolutePath();
완벽한 방식은 없으니 상황에 맞는 선택을 해야한다. 새로운 타입이 자주 추가될지, 새로운 함수가 자주 추가 될지, 비즈니스 로직의 복잡도 등 확장성에 대한 예측을 먼저해보고 복잡하지 않다면 자료 구조로 가고 복잡도가 증가한다면 객체로 가야할 것 같다.