
1. 배열의 이해와 배열의 선언 및 초기화 방법
배열은 단순하게 '둘 이상의 변수를 모아 놓은 것'으로 설명할 수 있다.
하지만 선언방법부터 접근방법까지 일반적인 변수들과는 차이가 있다.
다수의 데이터를 저장하고 처리하는 경우에 유용하게 사용할 수 있는 것이 배열이다.
예를 들어서 한 아파트의 주민들을 변수로 선언한다고 해보자.
int floor101, floor102, floor103, ...;
이렇게 코드를 작성한다는 것은 프로그래머에 있어서 아주 끔찍한 일이다.
배열은 이러한 과정없이 편하게 많은 양의 변수를 선언할 수 있게 해준다.
일반적인 변수와 달리 여러 개의 값을 저장할 수 있으며, 다음과 같이 선언한다.
int arr[4];

위 그림에서 중요한 사실은 int형 변수 4개가 나란히 선언되어 있다는 점이다.
실제로 배열을 이루는 요소들(변수들)의 주소값을 확인해보면 이러한 사실을 확인할 수 있다.
과거의 C 표준에서는 배열의 길이정보를 반드시 상수로 지정하도록 제한하였다.
그런데 이러한 제약사항을 여전히 고수하고 있는 컴파일러도 다수 존재한다.
따라서 범용적인 컴파일을 위해서는 가급적 배열의 길이정보를 상수로 지정해야 한다.
배열의 선언방법을 알았으니, 이제 접근방법을 살펴볼 차례이다.
int arr[3];
arr[0]=1;
arr[1]=2;
arr[2]=3;
이렇듯 [ ] 연산자 사이에 배열의 위치정보를 명시하게 되는데(이 위치에 들어가는 숫자를 가리켜 '인덱스' 또는 '인덱스 값'이라 한다), 여기서 중요한 사실은 첫 번째 요소를 지칭할 때 사용되는 숫자가 1이 아닌 0이라는 점이다.
즉 배열의 위치 정보를 명시하는 인덱스 값은 1이 아닌 0에서부터 시작한다.
int arr[3];
arr[3]=4;
위 배열 arr은 길이가 3인 배열이다.
그런데 4번째 요소의 접근을 시도하고 있다.
이것은 문제가 되지만 컴파일러는 배열접근에 있어서 유효성 검사를 진행하지 않기 때문에 위의 경우에 컴파일 에러를 일으키지 않는다.
따라서 더 주의를 해야 한다.
int arr[5]={1,2,3,4,5};
int arr2[]={1,2,3,4,5,6,7};
int arr3[5]={1,2};
배열은 위와 같이 초기화시킬 수 있다.
참고로 배열의 초기화를 목적으로 선언된, 중괄호로 묶인 부분을 가리켜 '초기화 리스트'라 한다.
첫 번째 방법은 가장 정석적인 배열 초기화 방식이다.
두 번째 방법은 초기화를 목적으로 '초기화 리스트'가 선언되면, 배열의 길이정보를 생략할 수 있다.
이러한 경우에는 컴파일러가 초기화 리스트의 수를 참조하여 길이정보를 채워주기 때문이다.
마지막 방법은 초기화할 값이 2개 밖에 존재하지 않는다.
이 경우 첫 번째 요소(인덱스)부터 순차적으로 값을 채워나가되 채울 값이 존재하지 않는 요소들은 0으로 채워진다.
2. 배열을 이용한 문자열 변수의 표현
char형 배열을 이용하면 문자열의 저장뿐만 아니라 문자열의 변경도 가능해진다.
죽, 변수형태의 문자열 선언이 가능해진다.
이전에도 언급했듯이 C언어에서는 큰 따옴표를 이용해서 문자열을 표현한다.
따라서 다음과 같이 문장을 구성하면 문자열이 저장된다.
char str[14]="Good morning!";
// OR
char str[]="Good morning!";
배열의 길이를 생략하는 것도 가능하다.
또한 문자열의 끝에는 '\0'이라는 특수문자(escape sequence)가 자동으로 삽입이 되어 실제 문자열의 길이는 14가 된다.
따라서 문자열의 저장을 목적으로 char형 배열을 선언할 경우에는 특수문자 '\0'이 저장될 공간까지 고려해서 배열의 길이를 결정해야 한다.
이렇게 문자열의 끝에 자동으로 삽입되는 문자 '\0'을 가리켜 '널(null) 문자'라 한다.
"널 문자의 아스키 코드 값은 0이다. 그리고 이를 문자의 형태로 출력할 경우, 아무런 출력도 발생하지 않는다. 공백 문자의 아스키 코드 값은 32로, 널 문자와는 엄연히 다르다."
char str[50];
scanf("%s", str);
scanf함수를 통해 str에 문자열을 저장할 수 있다.
C언어에서 표현하는 모든 문자열의 끝에는 널 문자가 자동으로 삽입된다.
문자열에 있어서 널 문자의 존재는 매우 중요하다.
널 문자가 존재하면 문자열이고 널 문자가 존재하지 않으면 문자열이 아니다.
따라서 다음의 배열 선언은 문자열이라 할 수 없다.
char str[]={'H','i','~'};
이는 다만 문자가 저장된 배열일 뿐이다.
하지만 다음은 문자열이 저장된 배열이라 할 수 있다.
마지막에 널 문자가 삽입되었기 때문이다.
char str[]={'H','i','~','\0'};
이렇듯 문자열의 판단여부에 있어서 선언방법은 중요하지 않다.
어떻게 선언이 되든 널 문자가 마지막에 존재하면 이는 C언어의 관점에서 문자열이 되는 것이다.
사실 메모리상에서 문자열은 이진 데이터로 저장되기 때문에 문자열의 시작과 끝이 표시되어 있지 않다면 문자열을 구분하는 것은 불가능하다.
그래서 널 문자를 이용해서 문자열의 끝을 표시하는 것이다.
참고로 널 문자의 아스키 코드 값은 0이므로 다음 두 문장은 동일한 문장이다.
str[8] = '\0';
str[8] = 0;
scanf 함수로는 문장을 입력받기에는 적절치 않다.
scanf 함수는 공백을 기준으로 데이터를 구분짓기 때문이다.