[CS50] 3.배열, Array

1 분 소요

컴파일링

지난 챕터에서 작성한 소스 코드를 머신 코드로 변환하는 과정인 컴파일링에 대해 간단히 배웠다.

사실 컴파일러를 통해 프로그램을 실행할 때는 네 개의 단계를 거치게 되는데, 명령어를 실행할 때 정확히 어떤 일이 일어나는지는 다음과 같다.

1. 전처리 (Precompile)

컴파일 작업이 이루어지기 전 먼저 전처리기에 의해 실질적인 컴파일이 이루어지기 전에 진행되어야하는 작업을 실행한다. 예를 들어 C 에서 패키지를 사용할 때 #include 같은 소스 코드를 작성하게 되는데, 전처리기는 #로 시작되는 코드를 읽고 stdio.h 파일의 내용을 가져와서 컴파일 될 소스 코드에 추가한다.

2. 컴파일 (Compile)

전처리된 소스 코드가 생성되고 나면 그 다음엔 컴파일러가 C 코드를 어셈블리어라는 저수준 프로그래밍 언어로 컴파일한다. 즉, 정확히 2진수로 변환하는 것은 아니지만 컴퓨터가 이해할 수 있는 언어와 최대한 가까운 프로그램인 어셈블리로 바꿔주는 것이다.

3. 어셈블 (Assemble)

소스 코드를 어셈블리 코드로 컴파일하고 나면 어셈블러라는 프로그램이 어셈블리 코드를 0과 1로 이루어진 오브젝트 코드로 변환시켜준다. 소스 코드에서 컴파일 할 파일이 딱 한 개라면 컴파일 작업이 여기서 끝나지만 그렇지 않은 경우에는 링크 단계까지 진행된다.

프로그램이 stdio.h, math.h 같은 라이브러리를 포함하여 여러 개의 파일로 이루어져 있을 경우 링커가 여러 개의 오브젝트 코드 파일을 실행 가능한 하나의 오브젝트 코드 파일로 합쳐준다.

배열

컴퓨터에는 다양한 자료형이 존재하며, C에서는 아래의 자료형을 저장할 때 서로 다른 크기의 메모리를 차지한다.

  • bool - 1byte
  • char - 1byte
  • int - 4byte
  • float - 4byte
  • long (더 큰 정수) - 8byte
  • double (더 큰 실수) - 8byte
  • string - 문자열의 길이만큼 용량 차지

작성된 자료는 컴퓨터의 물리적 메모리인 RAM에 저장되는데, 쉽게 생각하면 RAM은 각각이 1byte를 갖는 칸들로 이루어져있고 자료의 형태에 따라 필요한 만큼 칸들을 차지하여 저장되는 것이다.

예를 들어 ‘HI!’라는 문자를 저장한다면 글자(char) 하나 당 1byte씩 필요하며 다음과 같이 3개의 칸에 각각 저장되는 것이다.

1.png

물론 실제로는 ‘H’, ‘I’, ‘!’ 에 해당하는 ASCII 코드 값인 72, 73, 33 이 저장되는 것이고

2.png

72, 73, 33은 물론 2진수 형태로 1byte 안의 8bit를 사용하여 기록된다.

3.png

만약 72, 73, 33을 char 형태가 아닌 int로 저장할 경우에는 int 하나 당 4byte를 차지하기 때문에 다음과 같은 형태로 저장이 이루어지게 된다.

4.png

그리고 다시 돌아와, ‘HI!’라는 문자열을 불러오고 싶다면 c1, c2, c3 를 하나하나씩 불러오는 대신 하나의 배열로 묶어서 가져오는 편이 효율적인데, 이 때 문자열은 다음과 같은 형태로 저장된다. 각 문자가 s라는 배열의 0번, 1번, 2번으로 저장되고, 앞의 세 문자가 하나의 문자열임을 표시해주기 위해 마지막에 \0 이 배열의 3번 값으로 저장된다. 즉, 문자열은 문자의 수 + 1byte 만큼의 저장공간을 필요로 하고 예시의 상황에서는 총 4byte가 필요한 것이다.

5.png

배열에서 값의 위치를 찾을 수 있는 것(인덱싱) 또는 문자열의 길이를 구하는 작업 등이 가능한 이유는 바로 이러한 자료의 저장형태 때문이다.

댓글남기기