프로그래밍 기초 · 선형 구조: 매일 쓰는 것들

배열: 당신이 나눈 말 한마디가 그 안에 있어요

지난 강의에서 약속했어요: 자료구조 = 수납 방식. 첫 번째 수납 방식은 사실 당신이 매일 데이터를 넣고 있는 거예요——당신과 AI의 대화 한 토막은, 프로그램 눈에는 message list이고, message list의 진짜 모습은 가장 소박한 수납 방식이에요: 번호가 매겨진 칸 한 줄, 바로 배열. 이번 강의는 먼저 당신의 대화를 펼쳐 보고, 덤으로 오래된 질문에 답해요: 왜 오래 채팅하면 까먹을까요.

먼저 해보기 · 당신의 대화가 한 줄 칸에 누워 있어요

아래가 message list예요: 메시지마다 칸 하나, 칸 위에는 인덱스(번호, 0부터 세요——프로그래머의 오래된 습관). 「메시지 보내기」를 누르면 새 메시지가 어디에 떨어지는지 보고, 「컨텍스트 윈도우」 슬라이더를 끌어 보세요. 어느 칸이 회색이 되는지, 어느 칸은 절대 회색이 안 되는지 눈여겨보세요.

system(📌 고정) user(당신) assistant(AI) 아래 파란 줄 = 컨텍스트 윈도우 안
4개
이게 「오래 채팅하면 까먹는」 전부예요. 모델이 한 번에 읽을 수 있는 양에는 상한이 있어요(컨텍스트 윈도우). 다 못 담으면 버려야 하죠. 어느 쪽을? 머리는 자르고 꼬리는 남긴다——가장 오래된 잡담부터 버리고, 최근 몇 마디는 꼭 남겨야 해요. 안 그러면 당신이 방금 한 말도 몰라요. 유독 [0]번 칸의 system 프롬프트만 고정돼 있어요: 페르소나와 규칙(「당신은 다정한 어시스턴트예요」)이거든요. 그걸 버리면 AI는 자기가 누군지 잊어요. 그러니 「까먹음」은 신비가 아니라 배열 슬라이스예요: system + 최근 K개를 남기고, 나머지는 모델에 안 넣어요.
두 번째 판 · 가운데에 하나 꽂으면 얼마나 비쌀까요?

배열의 칸은 메모리에서 바짝 붙어 줄 서 있어요. 가운데에 빈칸이 허용되지 않죠. 그래서 골치가 생겨요: 가운데에 새 원소를 넣으려면, 오른쪽 원소가 전부 한 칸씩 오른쪽으로 이사해서 자리를 비워 줘야 해요. 아무 칸이나 눌러 그 자리에 ⭐를 넣고 「이동 횟수」를 보세요. 그다음 「끝에 ⭐ 추가」를 눌러 비교해 보세요.

👇 칸을 누르면 = 그 자리에 ⭐ 삽입(왼쪽에 꽂을수록, 오른쪽이 더 많이 이사해요) 이동 횟수 0
왼쪽 칸을 먼저 눌러 보세요, 예를 들어 [1]
규칙이 보이죠? 끝 추가는 언제나 1걸음이고, 가운데 삽입은 한 덩어리를 옮겨요——칸이 많을수록, 앞에 꽂을수록 이사가 더 심해요. 그래서 대화 이력은 뒤로만 자라게(append-only) 설계돼요: 새 메시지는 끝에 push하고, 아무도 이사하지 않으니 빠르고 싸요. 「십 분 전 말에 한 줄 끼워 넣기」를 허용하는 채팅 앱을 본 적 없죠——프로덕트 매니저가 생각 못 해서가 아니라, 그렇게 하면 진짜 비싸거든요.
배열의 특기(그리고 약점)
🎯

특기: 번호로 바로 도달

3번째 메시지를 가져오고 싶어요? messages[3], 처음부터 셀 필요 없이 한 번에 도착. 칸이 바짝 붙어 있어서 번호 자체가 주소예요——이게 O(1)이고, 사람 말로 「배열이 아무리 길어도 걸리는 시간은 같아요」. 위치로 데이터를 꺼낼 때, 배열은 모든 수납 방식 중 가장 빨라요. 예외 없어요.

⚖️

약점: 가운데 삽입이 비싸다

방금 직접 이사시켜 봤죠. 덤으로 친척 하나: 연결 리스트——가운데 삽입은 싸요(「다음이 누구」 포인터 두 개만 고치면 돼요). 대가는 번호로 바로 도달을 잃는 것. 100번째를 찾으려면 맨 앞부터 하나씩 걸어야 해요. 만능 수납 방식은 없고, 취사선택만 있어요. 「추가만 하고, 자주 통째로 읽는」 대화 장면에서는 배열이 완승이라 message list가 그걸 써요.

✅ 이 강의가 전하고 싶은 것