안녕하세요,
이번 포스팅에서는 1차원 배열과 배열을 이용한 문자열 변수 표현에 대해 알아보는 시간을 갖도록 하겠습니다.
단순하게 배열은 '둘 이상의 변수를 모아 놓은 것'으로 설명할 수 있습니다.
하지만 선언방법부터 접근방법까지 일반적인 변수들과는 차이가 있습니다.
| 배열이란 무엇인가?
다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열입니다.
예를 들어서,
'A아파트'의 가구별 가족 수를 저장하는 프로그램을 만든다고 가정해봅시다. 'A아파트'는 10층까지 있고 각 층에는
4가구씩 살고 있습니다. 그렇다면 가구별 가족 수의 기록을 위해서는 총 40개의 변수를 선언해야 하는데, 이를
위해서는 아마도 다음과 같이 코드를 작성해야 할 것입니다.
void main()
{
int floor101, floor102, floor103, floor104; // 1층 101호부터 104호까지
int floor201, floor202, floor203, floor204; // 2층 201호부터 204호까지
int floor301, floor302, floor303, floor304; // 3층 301호부터 304호까지
int floor401, floor402, floor403, floor404; // 4층 401호부터 404호까지
.
.
.
}
이렇게 코드를 작성한다는 것은 프로그래머에게 있어서 아주 끔찍한 일입니다. 물론 저 정도는 그나마 할만하다고 생각할 수 있을지 모릅니다. 하지만 층별로 20가구가 살고, 30층 높이의 B동~G동까지 있는 아파트의 가구별 가족 수를 기록하는 프로그램을 만든다고 하면 매우 힘들 것입니다.
바로 이러한 상황에서 배열은 우리가 힘든 일을 겪지 않아도 되도록 편의를 제공해줍니다. 배열을 사용하면 그 수에
상관없이 한 번에 많은 수의 변수를 선언할 수 있기 때문입니다.
| 1차원 배열의 선언에 필요한 것 : 배열이름, 자료형, 길이정보
배열은 일반적인 변수와 달리 여러 개의 값을 저장할 수 있다. 여러 개의 변수가 모여서 배열을 이루기 때문입니다.
이러한 배열 중에서 1차원 배열은 다음과 같이 선언합니다.
int Array[4];
위의 문장을 이루는 요소 셋은 다음과 같습니다.
- int 배열을 이루는 요소(변수)의 자료형
- Array 배열의 이름
- [4] 배열의 길이
즉, 위의 배열 선언문이 의미하는 바는 다음과 같습니다.
"int형 변수 4개로 이뤄진 배열을 선언하되, 그 배열의 이름은 Array로 해라"
위 그림에서 중요한 사실은 int형 변수 4개가 '나란히' 선언되어 있다는 점입니다.
참고로 다양한 자료형과 다양한 길이의 1차원 배열은 다음과 같이 선언하면 됩니다.
int arr1[7];
float arr2[10];
double arr3[12];
| 선언된 1차원 배열의 접근
배열의 선언방법을 알았으니, 이제 접근 방법을 살펴볼 차례입니다.
int arr[3]; // 길이가 3인 int형 1차원 배열
위의 배열을 대상으로 값을 저장할 때에는 다음의 형태로 접근을 합니다.
arr[0] = 10; // 배열 arr의 첫 번째 요소에 10을 저장해라!
arr[1] = 12; // 배열 arr의 두 번째 요소에 12을 저장해라!
arr[2] = 25; // 배열 arr의 세 번째 요소에 25을 저장해라!
즉, 배열요소의 접근에는 다음의 식이 존재합니다.
arr[idx] = 20; -> "배열 arr의 idx+1번째 요소에 20을 저장해라!"
이렇듯 [ ] 연산자 사이에 배열의 위치정보(인덱스)를 명시하게 되는데,
여기서 중요한 사실은 첫 번째 요소를 지칭할 때 사용되는 숫자가 1이 아닌 0이라는 점입니다.
즉, 배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0에서부터 시작됩니다.
| 배열 선언과 동시에 초기화
기본 자료형 변수들은 선언과 동시에 초기화가 가능합니다.
마찬가지로 배열도 선언과 동시에 원하는 값으로 초기화할 수 있습니다.
초기화의 방법은 총 3가지로 구분이 가능합니다.
-
int arr1[5] = {1, 2, 3, 4, 5}; // 순차적으로 1, 2, 3, 4, 5로 초기화 함
-
int arr2[] = {1, 2, 3, 4, 5, 6, 7}; // 컴파일러에 의해서 자동으로 7이 삽입됨
-
int arr3[] = {1, 2}; // 3, 4, 5번째 배열요소는 0으로 채워짐
각 방법을 조금 더 살펴보자면,
- 중괄호 안에 초기화 할 값들을 나열하면, 해당 값들이 순서대로 저장됩니다. (중괄호로 묶인 부분을 가리켜 '초기화 리스트'라 한다.)
- 초기화를 목적으로 '초기화 리스트'가 선언되면, 배열의 길이정보를 생략할 수 있습니다. 이러한 경우에는 컴파일러가 초기화 리스트의 수를 참조하여 길이정보를 자동으로 채워주기 때문입니다. 즉, int arr2[7]={1, 2 ,3 ,4 ,5 ,6 ,7}과 동일합니다.
- 선언하는 배열의 길이는 5인데, 초기화할 값이 2개밖에 존재하지 않습니다. 이러한 경우 첫 번째 요소부터 순차적으로 값을 채워나가되, 채울 값이 존재하지 않는 요소들은 0으로 채워지게 됩니다.
| 배열을 이용한 문자열 변수의 표현
C언어에서는 큰 따옴표를 이용해서 문자열을 표현합니다.
따라서 다음과 같이 문장을 구성하면 배열에 문자열이 저장됩니다.
char str[14] = "Good morning!";
이 배열에는 다음의 형태로 문자열이 저장되게 됩니다.
물론, 위에 초기화 방법 중 2번째와 같이 배열의 길이를 생략하는 것도 가능합니다.
그런데 문자의 수는 중간에 삽입된 공백 문자를 포함하여 분명 13입니다. 그러나 위의 그림에서 보이듯 문자열의
끝에는 '|n'이라는 특수문자(escape sequence)가 자동으로 삽입이 되어 실제 문자열의 길이는 14가 됩니다.
따라서, 문자열의 저장을 목적으로 char형 배열을 선언할 경우에는,
특수문자 '|n'이 저장될 공간까지 고려해서 배열의 길이를 결정해야 합니다.
이렇듯 문자열의 끝에 자동으로 삽입되는 문자 '|n'를 가리켜 '널(null)' 문자라고 합니다.
이상으로 이번 포스팅 마치겠습니다.
피드백 사항이나 질문이 있으시다면 댓글 달아주시고, 공감도 한 번씩 눌러주시면 감사하겠습니다.
'C언어 강좌' 카테고리의 다른 글
[C언어_12] C언어 문제 풀이 #4 (0) | 2020.11.19 |
---|---|
[C언어_11] 2차원 배열과 메모리의 특성 (0) | 2020.11.15 |
[C언어_09] C언어 문제 풀이 #3 (0) | 2020.11.07 |
[C언어_08] 중첩 반복문/무한루프: 문제풀이에 어떻게 응용하는가 (0) | 2020.11.02 |
[C언어_07] 반복문(while / for), continue, break (0) | 2020.11.01 |