본문 바로가기
C.W.K.
Stream
Lesson 02 of 04 · published

올바른 구조가 올바른 추상화다

~11 min · epilogue, oop, abstraction

Level 0호기심 많은 입문자
0 XP0/85 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"자료구조가 단번에, 그리고 영원히 이해되게 하는 아이디어가 하나 있어. ADT는 행동을 약속하고, 자료구조는 그 약속에 비용표를 붙여 몸으로 만들고, 클래스는 그 몸을 감쌀 수 있어. 큐는 FIFO를 주지만 공정함은 더 큰 정책이 결정하고, 트리는 위계를 몸으로 만들지. 서로 같은 개념은 아니어도, 문제에 맞는 추상화를 고른다는 설계 습관으로 이어져."

모든 구조는 코드 입은 개념이다

퀘스트 전체를 돌아보면 보여. 각 구조는 저장 배치만이 아니라 아이디어를 구체화해.

  • 스택가장 최근 것 먼저라는 개념이야. 실행 취소, 콜 스택, 백트래킹.
  • 먼저 들어온 항목을 먼저 꺼내는 FIFO 순서를 제공해. 이게 공정성에 도움이 될 수는 있지만, 우선순위, 작업 길이, 재시도 정책이 끼어드는 순간 시스템 전체가 자동으로 공정해지는 건 아니야.
  • 트리위계라는 개념이야. 담김, 혈통, 분류 체계.
  • 그래프관계라는 개념이야. 무엇이든 무엇과든 이어져.
  • 다음은 늘 가장 중요한 것이라는 개념이야.
  • 해시맵키로 접근하되 비용은 구현에 달렸다는 개념이야.

그래서 자료구조 고르기는 저장 결정이 아니라 추상화 결정이야. 데이터의 모양과 거기에 던질 질문에 어떤 개념이 가장 맞는지 고르는 일이지. 개념이 맞으면 코드가 명백해지고, 틀리면 그 구조와 영원히 싸우게 돼.

이게 객체 지향 사고다

추상 자료형은 가능한 연산과 행동 계약을 정의하고, 자료구조는 그 계약을 특정 비용으로 구현해. 클래스는 그 구현을 담는 한 방법일 수 있지만, ADT, 자료구조, 클래스, 객체 지향은 서로 같은 말이 아니야. 이들을 잇는 실은 하나야. 구체 표현보다 계약에 의존하고, 문제에 맞는 추상화와 비용을 고른다는 설계 습관.

ADT는 연산 계약, 자료구조는 그 계약의 비용 있는 구현, 클래스는 구현을 캡슐화하는 한 수단이야. 서로 같지는 않지만 모두 구체 표현보다 맞는 추상화에 의존하라는 설계 습관을 공유해.

왜 아빠 눈엔 어디서나 OOP가 보이나

아빠는 세상을 객체 지향으로 읽어. 코딩 스타일이 아니라 현실이 조직되는 원리로서 말이야. 사물은 상태와 행동을 갖고, 맞는 추상화는 도메인을 다루기 쉽게 만들고, 틀린 추상화는 엉망으로 만들어. 이 퀘스트는 같은 교훈의 데이터 쪽 면이야. 도서관, 조직도, 도시 도로망, 응급실 분류 줄. 각각 그 추상화가 맞아떨어져서 정렬된 색인, 트리, 그래프, 우선순위 큐라는 구조를 '고른' 현실 시스템이지. '올바른 구조가 올바른 추상화다'가 마음에 울렸다면, 이 사이트의 OO Quest가 자연스러운 다음 걸음이야. 같은 본능을 객체 쪽에서 가르치고, 둘이 합쳐지면 완전한 보는 방식이 돼.

피파의 고백

한참 동안 난 DS&A와 OOP를 서로 다른 머릿속 서랍에 넣어 뒀어. 하나는 '배열이랑 빅오', 다른 하나는 '클래스랑 상속'. 아빠가 문장 하나로 그 사이 벽을 무너뜨렸지. "자료구조는 어떤 연산을 싸게 만드냐가 핵심 전부인 클래스일 뿐이야." 갑자기 구조 고르기와 클래스 설계가 같은 행위가 됐어. 맞는 추상화 고르기. 따로 공부했던 두 과목이 알고 보니 두 방향에서 바라본 한 과목이었던 거야.

Code

같은 데이터, 두 구조, 두 추상화·python
# 같은 데이터, 두 구조 = 두 추상화 = 두 생각 방식.
# 작업 목록을 FIFO 큐 (도착 순서) vs 힙 (명시적 우선순위)으로 비교.
from collections import deque
import heapq

tasks = [("email", 3), ("deploy", 1), ("cleanup", 5)]

# 큐 추상화: '도착한 순서대로 해' (FIFO 정책)
q = deque(name for name, _ in tasks)
print("fair order :", list(q))            # email, deploy, cleanup (도착)

# 힙 추상화: '늘 가장 급한 거 다음에 해' (우선순위)
h = [(prio, name) for name, prio in tasks]
heapq.heapify(h)
print("urgent first:", [heapq.heappop(h)[1] for _ in range(len(h))])  # deploy, email, cleanup

# 같은 작업. 네가 고르는 *구조* 가 어떤 *개념* 을 뜻하는지 인코딩해:
# 공정함 (큐) 또는 우선순위 (힙). 구조 고르기가 곧 추상화 고르기 —
# 클래스 설계 심장의 그 같은 결정.

External links

Exercise

각 개념을 구체화하는 자료구조를 대 봐. (1) '가장 최근 행동 취소하기', (2) '도착한 순서대로 고객 응대하기', (3) '늘 가장 급한 케이스부터 다루기', (4) '키로 레코드 즉시 찾기'. 그다음 '자료구조 고르기'와 '클래스 설계'가 왜 사실 같은 결정인지 한 문장으로 설명해.
Hint
(1) 스택(LIFO), (2) 큐(FIFO), (3) 우선순위 큐 / 힙, (4) 해시맵. 같은 결정인 이유: 둘 다 '이 종류의 데이터에 맞는 추상화 고르기'니까. 자료구조의 연산이 곧 메서드고, 데이터가 곧 상태고, 맞는 구조가 곧 모델링 대상에 맞는 클래스야.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.