안녕하세요.
이번에는 배열을 정리하고, 배열의 특수한 형태인 문자열을 정리하겠습니다.
1. 배열
1) 의미
- 하나의 같은 데이터형을 가진 데이터를 연속된 메모리 공간에 저장하는 자료구조 입니다.
2) 기본 구조
- int 라는 데이터형 변수 5개를 메모리에 생성합니다.
- 배열의 인덱스는 0 부터 시작합니다.
int nums[5];
// nums[0] : 첫번째
// nums[1] : 두번째
// nums[2] : 세번째
// nums[3] : 네번째
// nums[4] : 다섯번째
3) 선언
- 배열을 사용하기 위해서는 컴파일러에게 사용할 배열의 데이터형과 크기를 알려야 합니다.
- 이를 배열 선언이라고 합니다.
데이터형 배열이름[크기];
int nums[100];
char name[20];
double lengths[30];
└ nums 는 int 형 배열이고, 크기는 100 입니다.
└ name 은 char 형 배열이고, 크기는 20 입니다.
└ lengths 는 double 형 배열이고, 크기는 30 입니다.
4) 초기화
- 배열에 데이터를 처음 입력하는 경우입니다.
- 위의 선언만으로는 배열 변수에 누구도 알 수 없는 쓰레기 값(garbage value)이 들어가 있습니다.
- 따라서 사용할 데이터로 배열을 초기화하는 것이 중요합니다.
데이터형 배열이름[크기] = {원소1, 원소2, ... };
int nums[5] = {1, 2, 3, 4, 5};
└ 배열의 고정크기 선언으로써, 데이터에 중괄호({~})를 감싸 초기화 할 수 있습니다.
int nums[5] = {1, 2};
// {1, 2, 0, 0, 0};
└ 배열의 일부만 초기화 할 수 있습니다. 이 경우 나머지는 0 으로 초기화 됩니다.
데이터형 배열이름[] = {원소1, 원소2, ... };
int nums[] = {1, 2, 3};
└ 가변길이 초기화를 하는 경우 입니다. 이 경우 배열의 크기를 입력하지 않아도 크기를 자동으로 추론합니다.
5) 접근
- n 크기의 배열은 0(첫번째) 부터 n-1(마지막) 까지의 인덱스로 접근할 수 있습니다.
- 접근하여 값을 변경하거나, 배열의 값을 다른 변수에 대입할 수 있습니다.
// 인덱스 0 부터 4 까지 접근이 가능하다.
int nums[5] = {1, 2, 3, 4, 5};
배열이름[인덱스];
nums[4] = 6; // 마지막 인덱스에 정수 6을 대입
int num = nums[2]; // 세번째 인덱스인 3을 변수 num에 대입
1.1 다차원 배열
1) 의미
- 다차원 배열이란 원소로 또 다른 배열을 갖는 배열을 말합니다.
- 다차원 배열의 기초 형태인 2차원 배열을 보통 사용합니다.
- 표, 좌표, 행렬 등을 표현할 때 주로 사용됩니다.
2) 기본 구조(2차원 배열)
int fiveYears[5][12];
// 0 1 2 3 4 5 6 7 8 9 10 11 12
// 0
// 1
// 2
// 3
// 4
└ 12 크기의 배열을 원소로 가지는, 5 크기의 배열이라고 할 수 있습니다.
└ 2차원 배열에서 첫번째 크기를 행, 두번째 크기를 열이라고 생각하면 배열을 시각적으로 파악할 수 있습니다.
3) 선언
데이터형 배열이름[크기1][크기2];
int arr[2][3];
└ 위 처럼 행이 2, 열이 3 인 배열을 선언할 수 있습니다.
4) 초기화
데이터형 배열이름[크기1][크기2] =
{
{원소1, 원소2 ... },
{원소1, 원소2 ... },
{원소1, 원소2 ... },
....,
};
int arr[2][3] =
{
{1, 2, 3},
{4, 5, 6}
};
└ 기존 배열의 초기화처럼 중괄호를 사용합니다.
└ 3 크기의 배열을 먼저 중괄호로 초기화하고, 이를 감싸는 2 크기의 배열을 중괄호로 초기화 합니다.
데이터형 배열이름[크기1][크기2] = {원소1, 원소2, 원소3, ... };
int arr[2][3] = {1, 2, 3, 4, 5, 6};
└ 위 처럼 한 줄로도 초기화 할 수 있습니다.
└ 이는 2차원 배열 또한 메모리에는 1차원으로 연속되어 저장되기 때문입니다.
5) 접근
- 다차원 배열의 접근은 처음 크기부터 차례대로 접근할 수 있습니다.
arr[2][3] =
{
{1, 2, 3},
{4, 5, 6}
};
배열이름[인덱스1][인덱스2];
arr[0][2] = 7; // 첫번째 인덱스 0(첫번째 = {1, 2, 3})의 2(세번째 = {3}) 원소에 접근
int num = arr[1][0]; // 첫번째 인덱스 1(두번째 = {4, 5, 6})의 0(첫번째 = {4}) 원소에 접근
2. 문자열
1) 배열과의 관계
- 문자열은 데이터형이 char 인 배열입니다.
2) 선언과 초기화
char hello[11] = "HelloWorld";
└ 문자 배열의 가장 기본적인 고정크기 선언으로써 크기를 지정해주는 경우 입니다.
char hello[] = "HelloWorld";
└ 문자 배열의 가변크기 선언입니다. 크기를 지정하지 않아도 크기를 추론합니다.
3) 널(NULL) 문자
- 널 문자란 문자열의 종료를 표시하는 문자입니다.
- 위 선언에서 고정크기 배열을 선언하는 경우, 문자열에 있는 문자의 수는 10 이기 때문에 크기는 10이 되어야 하는데 11로 되어 있는 것을 볼 수 있습니다. 이는 문자열의 끝을 표현하기 위한 널 문자를 추가하기 위함입니다.
char hello[15] = "HelloWorld";
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
// H e l l o W o r l d \0 \0 \0 \0 \0
└ 문자의 끝 이후는 전부 널 문자를 대입합니다.
4) 문자열 접근 및 수정
char hello[20] = "HelloWorld";
hello[5] = C;
hello[6] = o;
hello[7] = u;
hello[8] = n;
hello[9] = t;
hello[10] = r;
hello[11] = y;
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// H e l l o W o r l d \0 \0 \0 \0 \0 \0 \0 \0 \0 \0
// H e l l o C o u n t r y \0 \0 \0 \0 \0 \0 \0 \0
5) 2차원 배열을 이용한 여러 문자열 저장
// 20 크기를 가진 문자열을 3개 저장
char fruits[3][20] =
{
"Apple",
"Banana",
"Orange"
};
2.1 문자열 함수
0) 헤더파일
- 문자열 대부분의 함수는 헤더파일 string.h 에 들어있습니다.
- 따라서 C 파일 상단에서 이를 include 하고 진행하는 것이 좋습니다.
#include <string.h>
1) 문자열 출력
- printf()
printf("%s\n", str);
└ %s 라는 형식 지정자는 NULL(\0) 문자가 나올 때까지 출력합니다.
2) 문자열 입력
- scanf()
char str[100];
scanf("%s", str);
└ scanf() 가장 유명한 입력함수 입니다.
└ 다만 공백 입력이 불가하고, 크기가 작은 문자배열에 데이터 입력시 버퍼 오버플로우가되는 문제가 생기는 문제가 있습니다.
- fgets()
char str[100];
fgets(buffer, buffer 크기, 표준입력);
fgets(str, sizeof(str), stdin);
└ 위의 문제를 해결하는 입력함수 입니다.
└ 공백 입력이 가능하고, 크기 제한을 두어 버퍼 오버플로우를 방지합니다.
3) 문자열 길이
- strlen()
char str[] = "Hello";
printf("%d", strlen(str));
└ str 이라는 문자열의 크기를 출력합니다.
└ 이 경우 크기는 5가 되는데, NULL(\0) 문자의 크기는 포함되지 않음을 주의해야 합니다.
4) 문자열 복사
- strcpy()
char src[] = "Hello";
char dest[20];
strcpy(피문자열, 저장할 문자열);
strcpy(dest, src);
└ src 의 문자열을 dest 라는 문자열에 복사합니다.
└ NULL(\0) 문자도 같이 복사됩니다.
5) 문자열 이어붙이기
- strcat()
char str[20] = "Hello ";
strcat(피문자열, 이어붙일 문자열);
strcat(str, "World");
printf("%s", str);
└ Hello 라는 문자열을 str 에 저장된 문자열 뒤에 이어 붙입니다.
6) 문자열 비교
- strcmp()
strcmp(a, b);
strcmp("ABC", "ABC"); // 0
strcmp("ABC", "ABD"); // 음수("ABC" < "ABD")
└ 같다면 0을, 오른쪽 문자열이 크다면 양수, 왼쪽 문자열이 크다면 음수를 반환합니다.
└ 따라서 같을 때인 0을 기준하여 사용합니다.
7) 메모리 관련
- memset()
char str[100];
memset(문자열, 값, 문자열 크기);
memset(str, 0, sizeof(str));
└ 문자열에 원하는 값으로 전부 초기화 할 때 사용합니다.
- memcpy()
int src[3] = {1,2,3};
int dest[3];
memcpy(피문자열, 복사할 문자열, 복사할 문자열 크기);
memcpy(dest, src, sizeof(src));
└ 바이트 수 기준하여 모든 메모리를 복사할 때 사용합니다.
└ strcpy() 는 NULL(\0) 문자를 기준하여 복사하는 반면, memcpy() 는 전부 복사합니다.
8) 변환
- atoi
int num = atoi("123");
└ 문자열을 정수형으로 변환할 때 사용합니다.
- atof
double Pi = atof("3.14");
└ 문자열을 부동소수점형으로 변환할 때 사용합니다.
'C > Study' 카테고리의 다른 글
| C언어 : 8. 함수 (0) | 2026.05.25 |
|---|---|
| C언어 : 7. 분기 제어문 (0) | 2026.05.19 |
| C 언어 : 6. 루프 제어문 (0) | 2026.05.19 |
| C언어 : 5. 연산자 (0) | 2026.05.19 |
| C언어 : 4. 문자열과 입출력 (0) | 2026.05.18 |
