제목메모리 속 작은 방들: 배열이라는 책장 이야기2025-05-10 14:45

 1. 엄마의 냉장고와 컴퓨터의 메모리

“야, 계란은 맨 위 칸에, 야채는 중간 칸에 넣어!”

어릴 적, 냉장고 정리를 도와드릴 때마다 엄마는 항상 이런 말씀을 하셨다. 이유를 물어보면 이렇게 말씀하신다. “그래야 내가 찾을 수 있잖아!”

이 단순한 말 한마디가 사실 컴퓨터 메모리의 기본 원리이기도 하다.

컴퓨터도 데이터를 아무 데나 막 넣지 않는다. 정해진 칸에, 정해진 순서로 넣어야 꺼낼 때도 헷갈리지 않기 때문이다. 이때 “냉장고”는 컴퓨터의 **메모리(RAM)**이고, 계란이나 야채 같은 저장되는 물건은 우리가 말하는 데이터다.

그런데 문제는, 컴퓨터는 우리가 보는 것처럼 "계란", "야채"라고 저장하지 않는다. 오직 숫자(0과 1)로 저장한다. 그래서 이 데이터를 “어디에”, “어떤 순서로”, “얼마만큼” 저장하느냐가 아주 중요해진다.


 2. 방 번호가 붙은 기숙사: 메모리 주소란?

이제 냉장고에서 기숙사로 이야기를 옮겨보자.

컴퓨터의 메모리는 일종의 기숙사다. 모든 방에는 번호가 붙어 있다. 예를 들어 0번 방, 1번 방, 2번 방… 이런 식이다. 이 번호를 우리는 주소(address) 라고 부른다.

각 방에는 하나의 데이터(예: 1바이트, 4바이트 등)를 저장할 수 있다. 어떤 프로그래밍 언어든지 이 주소를 기준으로 데이터를 넣고 꺼낸다.

C 언어는 이 방 번호를 아주 직접적으로 다룬다. 그래서 처음 C 언어를 배울 때 “포인터(pointer)”니 “주소 연산자(&)”니 하는 낯선 개념들이 쏟아지는 것이다. 사실 이것은 컴퓨터가 어떻게 데이터를 기억하고 꺼내는지를 이해하게 도와주는 중요한 열쇠다.


 3. 배열은 옆 칸 옆 칸 옆 칸에 차곡차곡

이제 배열(array) 이야기를 해보자. 배열은 쉽게 말해서 옆 칸 옆 칸 옆 칸으로 이어진 같은 종류의 데이터 모음이다.

다시 냉장고 비유를 해보자.

엄마가 요리하려고 장을 보시고 사과 5개를 사 오셨다고 하자. 이걸 냉장고에 한 칸에 다 몰아넣지 않는다. 사과는 사과끼리, 각 칸에 하나씩 넣는다. 꺼내기 쉽게.

컴퓨터도 마찬가지다. 예를 들어 C 언어에서 이런 코드가 있다고 하자:

int numbers[5] = {10, 20, 30, 40, 50};

이건 “정수형 데이터를 저장할 수 있는 5칸짜리 배열”을 만든 것이다. 컴퓨터는 이 배열을 연속된 메모리 주소에 순서대로 저장한다.

  • numbers[0] → 100번지 (가정)

  • numbers[1] → 104번지 (int는 4바이트니까)

  • numbers[2] → 108번지

  • numbers[3] → 112번지

  • numbers[4] → 116번지

이 배열은 마치 책장처럼, 책이 순서대로 꽂혀 있는 구조다. 그래서 꺼낼 때도 몇 번째 칸인지 숫자(index)만 알면 정확히 찾아낼 수 있다.


 4. 왜 배열은 연속된 메모리에 저장되어야 할까?

컴퓨터는 엄청나게 많은 데이터를 빠르게 처리해야 하기 때문에, 예측 가능한 위치에 데이터를 저장하는 것이 중요하다.

배열은 그 자체로 “몇 번째 값인지”만 알면 주소를 바로 계산할 수 있다.

예를 들어 0번 주소가 1000이고, 데이터 타입이 4바이트 정수형이면, 3번째 값의 주소는?

주소 = 시작 주소 + (인덱스 × 데이터 크기)
     = 1000 + (3 × 4)
     = 1012

이렇게 간단한 수식으로 찾아낼 수 있으니, 컴퓨터 입장에서는 속도와 효율 모두에서 훌륭한 구조다.


 5. 포인터로 보는 배열의 속살

C 언어의 진짜 묘미는 배열과 포인터가 닮았다는 데 있다.

다음 코드를 보자:

int arr[3] = {1, 2, 3};
int *p = arr;

여기서 parr[0]의 주소를 가리킨다. 그리고 *(p+1)arr[1]의 값을 의미한다.

“어라? 배열 이름은 주소였네?”

그렇다. 배열 이름 자체가 배열의 첫 번째 요소의 주소를 의미한다. 그래서 배열을 포인터처럼 다룰 수 있다.


 6. 배열에 숨겨진 오류의 함정

배열은 편리하지만, 오류에도 매우 취약하다. C 언어는 배열의 범위를 벗어나도 경고를 안 한다.

예를 들어 다음 코드:

int arr[3] = {1, 2, 3};
arr[5] = 100;  // 문제!

이렇게 하면 사실 메모리의 “엉뚱한 방”에 데이터를 저장하게 된다. 그래서 의도치 않은 데이터 덮어쓰기, 프로그램 오류, 심지어 해킹의 원인이 되기도 한다.


 7. 진짜 세상 속 배열 이야기

이쯤에서 조금 더 실생활 예시로 가보자.

  • 학급 명단: 학생 이름 30명을 순서대로 저장한다면 배열이다.

  • 지하철 노선도: 각 정거장을 번호로 기억하고 싶다면 배열 구조가 어울린다.

  • 요리 레시피: “1. 양파 썰기, 2. 마늘 다지기, 3. 고기 볶기…” 이런 순서도 배열로 저장할 수 있다.

하지만 배열은 단점도 있다. 크기가 고정되어 있다. 프로그램이 실행되기 전에 몇 개짜리 배열을 만들지 미리 정해야 한다. 10개짜리 배열을 만들었는데 11개를 저장하려 하면? 오류가 난다. 그래서 요즘은 동적으로 크기를 바꾸는 vector, list 같은 자료구조를 많이 쓴다. 하지만 배열이 기초인 건 변함없다.


 8. 메모리 속 책장을 정리하는 능력

결국 배열이란, 컴퓨터가 책장처럼 정리된 공간에 정보를 차곡차곡 저장하고 꺼내는 방법이다.

  • 배열은 “연속된 주소에 같은 타입의 데이터를 저장하는 구조”

  • 배열 이름은 그 자체로 주소

  • 배열은 빠르고 간단하지만, 오류에 민감하고 유연하지 않다

프로그래밍이란 결국 컴퓨터에게 “이 정보를 이 순서대로 이 위치에 저장하고 꺼내라”고 명령하는 일이다. 배열은 그 명령을 가장 기본적이고도 강력하게 수행하는 도구다.


 마무리하며

우리는 매일 데이터를 보고, 저장하고, 꺼내고, 전달한다. 메모리 속 배열은 그 모든 것의 출발점이다. 배열이라는 책장을 얼마나 잘 정리하느냐가, 결국 프로그래밍 실력의 기본이 되는 셈이다.

다음에 냉장고를 정리할 일이 있다면 한번 떠올려보자. 컴퓨터도 비슷하게 작동한다는 사실을. 그리고 배열을 떠올리며 “나는 지금 C 언어처럼 정리하고 있다”고 말이다.


유튜브 채널에서 더 자세한 내용 확인해보세요! 
https://youtu.be/ue9apvTHstk