# Programming Foundations (프로그래밍 기초 및 설계 원칙)

## 📌 Brief Summary
프로그래밍 기초(Programming Foundations)는 소프트웨어를 구성하는 물리적 구조(AST)와 논리적 설계 패러다임(OOP, Design Patterns)을 포함하는 지식의 근간입니다 [1]. 추상 구문 트리(AST)를 통해 소스 코드를 구조적으로 이해하고, 객체 지향 프로그래밍(OOP)과 SOLID 원칙을 적용하여 복잡한 시스템을 모듈화하고 재사용 가능한 형태로 설계함으로써 시스템의 유지보수성과 확장성을 확보합니다 [1-3].

## 📖 Core Content

### 1. 추상 구문 트리 (Abstract Syntax Tree, AST)
*   **개념:** 소스 코드의 추상적인 구문 구조를 트리 형태로 표현한 것입니다. 정적 분석 도구가 코드를 "이해"하는 가장 기본적인 방식입니다 [1, 7].
*   **활용:** 코드 리뷰 자동화(SAST), 리팩토링 도구, AI 기반 디버깅 엔진에서 소스 코드를 구조적으로 탐색하고 결함을 감지하는 데 사용됩니다 [2, 3].

### 2. 객체 지향 프로그래밍 (Object-Oriented Programming, OOP)
*   **핵심 기법:** 데이터 캡슐화(Encapsulation)와 데이터 은닉(Hiding)을 통해 모듈 간 독립성을 유지하고 코드 중복을 최소화합니다 [3, 4].
*   **상향식 설계(Bottom-Up):** 작은 객체를 먼저 개발하고 이를 통합하여 큰 시스템을 구성하는 상향식 접근법과 밀접하게 연관됩니다 [2, 4].
*   **분석 전략:** 낯선 OOP 코드베이스 파악 시 클래스 계층 구조(Class Hierarchy) 시각화와 단일 책임 원칙(Single Responsibility) 준수 여부 확인이 필수적입니다 [6, 8].

### 3. 설계 원칙 및 패턴 (Design Principles & Patterns)
*   **SOLID 원칙:** SRP(단일 책임), OCP(개방-폐쇄) 등 5대 원칙을 통해 변경에 유연한 설계를 지향합니다 [8].
*   **디자인 패턴:** 반복되는 문제에 대한 검증된 해결책(Factory, Singleton, Observer 등)으로, 팀 내 의사소통의 '비컨(Beacon)' 역할을 수행합니다.

## ⚠️ Trade-offs & Caveats
*   **유연성 vs. 추적 가능성:** 고도로 모듈화된 OOP/클린 아키텍처는 개별 단위의 품질을 높이지만, 실행 흐름을 파악하기 위해 수십 개의 파일을 넘나들어야 하는 '추적의 어려움(Traceability Friction)'을 유발할 수 있습니다 [11, 12].
*   **과잉 설계(Over-engineering):** 무분별한 디자인 패턴 적용은 시스템의 복잡도를 높이고 하향식(Top-Down) 방향성을 상실하게 만들 위험이 있습니다 [5, 10].
*   **AST의 한계:** 정적 구조 분석만으로는 실제 비즈니스 의도(Intent)나 런타임의 동적 행위를 완벽히 파악하기 어렵습니다 [6].

## 🔗 Knowledge Connections

### Related Concepts
- [[Security & Quality Engineering]]: AST 분석을 기반으로 보안 취약점을 탐지하는 정적 분석 기술을 다룹니다.
- [[Software Maintenance & Evolutionary Design]]: OOP와 설계 원칙이 실제 유지보수 비용과 진화적 설계에 미치는 영향을 분석합니다.
- [[Cognitive Load & Mental Models]]: 복잡한 클래스 계층 구조가 개발자의 인지 부하에 미치는 심리학적 영향을 연구합니다.

### Practical Application Contexts
- **Implementation:** 클래스 설계 시 SRP를 준수하여 객체를 작게 쪼개고, 인터페이스를 통해 결합도를 낮춥니다 [8].
- **Code Review:** 자동화된 AST 분석 도구를 활용해 구문 오류와 기본 보안 결함을 일차적으로 걸러냅니다 [4, 5].

---
*Last updated: 2026-05-02*
