C 프로그래밍에서 배열(Array)을 예로 들어 컴파일 타임 초기화와 런타임 초기화의 개념과 차이점을 자세히 알아보겠습니다.
배열(Array)이란?
배열은 연속된 메모리 공간에 저장된 데이터 항목들의 집합입니다. 배열의 각 요소는 인덱스(index)를 통해 접근할 수 있으며, 인덱스는 0부터 시작합니다.
1. 컴파일 타임 초기화(Compile Time Initialization)
컴파일 타임 초기화는 프로그램 코드 안에 직접 초깃값을 작성해 두는 방식입니다. 일반 변수를 초기화하는 것과 동일한 방법이며, 프로그램이 실행되기 전에 값이 이미 결정되어 있다는 특징이 있습니다.
배열 초기화의 일반적인 형식은 다음과 같습니다.
문법(Syntax)
type name[size] = { 값_목록 };
// 정수형 배열 초기화
int rollnumbers[4] = { 2, 5, 6, 7 };
// 실수형(float) 배열 초기화
float area[5] = { 23.4, 6.8, 5.5, 7.3, 2.4 };
// 문자형 배열 초기화
char name[9] = { 'T', 'u', 't', 'o', 'r', 'i', 'a', 'l', '\0' };
예제 코드
다음은 컴파일 타임 초기화로 배열을 선언한 뒤, for 반복문을 이용해 모든 요소를 화면에 출력하는 C 프로그램입니다.
#include <stdio.h>
int main(void) {
// 컴파일 타임 초기화로 배열 선언
int array[5] = {1, 2, 3, 4, 5};
int i;
// for 반복문으로 배열 요소 출력
printf("배열의 요소 출력 : ");
for(i = 0; i < 5; i++) {
printf("%d ", array[i]);
}
return 0;
}
실행 결과
배열의 요소 출력 :1 2 3 4 5
2. 런타임 초기화(Runtime Initialization)
런타임 초기화는 프로그램이 실행되는 도중에 값을 입력받아 배열을 초기화하는 방식입니다. 이 방법을 사용하면 프로그램을 실행할 때마다 서로 다른 값을 입력할 수 있습니다.
또한 요소 개수가 많은 대규모 배열이나, 사용자가 직접 값을 지정해야 하는 경우에 유용하게 활용됩니다. C 언어에서는 주로 scanf() 함수를 사용하여 런타임에 배열을 초기화합니다.
예제 코드
다음은 런타임 초기화를 활용하여 2×3 크기의 두 배열 A, B를 입력받고, 두 배열의 합(sum)과 곱(product)을 계산해 출력하는 C 프로그램입니다.
#include <stdio.h>
int main(void) {
// 런타임에 값을 채울 배열 선언
int A[2][3], B[2][3];
int sum[2][3], product[2][3];
int i, j;
// 반복문으로 배열 A의 요소 입력받기
printf("배열 A에 입력할 요소를 입력하세요 : \n");
for(i = 0; i < 2; i++) {
for(j = 0; j < 3; j++) {
printf("A[%d][%d] : ", i, j);
scanf("%d", &A[i][j]);
}
printf("\n");
}
// 반복문으로 배열 B의 요소 입력받기
for(i = 0; i < 2; i++) {
for(j = 0; j < 3; j++) {
printf("B[%d][%d] : ", i, j);
scanf("%d", &B[i][j]);
}
printf("\n");
}
// 두 배열의 합 계산 후 출력
printf("합계 배열(Sum) : \n");
for(i = 0; i < 2; i++) {
for(j = 0; j < 3; j++) {
sum[i][j] = A[i][j] + B[i][j];
printf("%d\t", sum[i][j]);
}
printf("\n");
}
// 두 배열의 곱 계산 후 출력
printf("곱 배열(Product) : \n");
for(i = 0; i < 2; i++) {
for(j = 0; j < 3; j++) {
product[i][j] = A[i][j] * B[i][j];
printf("%d\t", product[i][j]);
}
printf("\n");
}
return 0;
}
실행 결과
A = {{1, 2, 3}, {4, 5, 6}}, B = {{7, 8, 9}, {10, 11, 12}}를 입력했을 때의 실행 결과입니다.
배열 A에 입력할 요소를 입력하세요 : A[0][0] : 1 A[0][1] : 2 A[0][2] : 3 A[1][0] : 4 A[1][1] : 5 A[1][2] : 6 B[0][0] : 7 B[0][1] : 8 B[0][2] : 9 B[1][0] : 10 B[1][1] : 11 B[1][2] : 12 합계 배열(Sum) : 8 10 12 14 16 18 곱 배열(Product) : 7 16 27 40 55 72
두 초기화 방식 비교
| 구분 | 컴파일 타임 초기화 | 런타임 초기화 |
|---|---|---|
| 값 입력 시점 | 코드 작성 시(컴파일 전) | 프로그램 실행 중 |
| 값 변경 | 코드 수정 후 재컴파일 필요 | 실행할 때마다 다른 값 입력 가능 |
| 적합한 경우 | 고정된 소량의 데이터 | 대규모 배열, 사용자 입력 기반 데이터 |
| 주요 수단 | 초기화 리스트({ }) | scanf() 등 입력 함수 |
마무리
정리하면, 컴파일 타임 초기화는 코드에 값을 미리 작성해 두는 간편한 방식이고, 런타임 초기화는 실행 중에 유연하게 값을 입력받을 수 있는 방식입니다. 프로그램의 목적과 데이터의 성격에 따라 적절한 초기화 방법을 선택하면 더 효율적이고 유지 보수하기 좋은 코드를 작성할 수 있습니다.