좋은 아키텍처를 만드는 일은 객체 지향 ㅇㅇ설계 원칙을 이해하고 응용하는 데서 출발한다.

1. 캡슐화?

객체는 내부 데이터를 숨기고, 외부에는 필요한 동작만을 노출한다.

이러한 개념은 객체 지향에만 있는 개념은 아니다.

// point.h
// 구조체의 실제 멤버는 감추고, 포인터 타입만 선언
struct Point;

// 인터페이스 함수 선언 (외부에서 사용할 수 있는 함수들)
// Point 생성 함수
struct Point* makePoint(double x, double y);
// 거리 계산 함수
double distance(struct Point* p1, struct Point* p2);
// point.c (실제 구현 부분)
#include "point.h"
#include <stdlib.h>
#include <math.h>

// 내부 구현: Point 구조체 정의 (외부에는 노출되지 않음)
struct Point {
    double x, y;
};

// Point 구조체 포인터를 생성하고 초기화하는 함수
struct Point* makePoint(double x, double y) {
    struct Point* p = malloc(sizeof(struct Point));
    p->x = x;
    p->y = y;
    return p;
}

// 두 점 사이의 거리 계산 함수
double distance(struct Point* p1, struct Point* p2) {
    double dx = p1->x - p2->x;
    double dy = p1->y - p2->y;
    return sqrt(dx*dx + dy*dy); 
}