기술자료

DBMS, DB 구축 절차, 빅데이터 기술 칼럼, 사례연구 및 세미나 자료를 소개합니다.

반전이 있는 미친감자의 프로그래밍 이야기 : 배열과 문자열

기술자료
DBMS별 분류
Etc
작성자
dataonair
작성일
2015-10-01 00:00
조회
3348



배열과 문자열

천재 프로그래머가 되고 싶은 미친감자는 열정 하나 세계 최고죠. 하지만 언제나 좌충우돌입니다. 오늘은 배열과 문자열에 대해 공부하네요.



tech_img4064.png

tech_img4065.png

tech_img4066.png

tech_img4067.png

tech_img4068.png

tech_img4069.png

tech_img4070.png

tech_img4071.png

tech_img4072.png

tech_img4073.png

[목적]
이론 학습과 실습을 통해 배열과 문자열에 대해 숙지한다.

[준비물]
비주얼 스튜디오



우리는 지금까지 C 언어로 코드를 작성했습니다. 코드를 작성하며 변수 즉, 메모리에 원하는 값(데이터)를 담고, 수정하고, 출력해 봤습니다. 그간 다룬 내용들은 하나같이 메모리에 저장되는 정보를 하나의 변수에 담았습니다. 지금부터는 변수라는 개념을 조금 확장시켜보려고 합니다. 하나의 데이터를 저장하고 관리하는 것에서 더 나아가 대량의 데이터를 저장하고 관리하는 것이죠. 어떻게 할 수 있냐고요 바로 배열을 이용하면 됩니다.



따로 따로 보다는 하나로 묶자

종헌이라는 학생이 있는 한 학급이 있다고 가정해 봅시다. 그 학습에는 종헌이를 포함해 총 10명의 학생이 있습니다. C 언어에 관심이 많은 그 학급의 학생들은 최소 1권 이상의 마이크로소프트웨어(이하 마소) 잡지를 가지고 있습니다. 어느날 선생님이 학생별 마소 잡지 보유 현황을 입력할 수 있는 프로그램을 만들어보라고 숙제를 냈습니다.



<리스트 1> 변수를 이용한 학생별 잡지 보유 개수 파악#include
void main() {
int 종헌 = 4;
int 철수 = 5;
int 영희 = 2;



종헌이는 10명의 학우들의 보유 잡지 수를 변수에 일일이 입력했습니다. 그런데 만약 이를 학급에서 학교로 확장시켜야 한다면 어떻게 해야 할까요 전체 학생 수가 100명이라면 100개의 변수를 만들어야 할까요 이러한 다량의 데이터를 효율적으로 보관, 관리할 수 있는 것이 C 언어의 배열입니다.



<리스트 2> 변수 대신 배열로 학생별 잡지 보유 수량 파악#inlude
void main() {
int MicroNum[10];
MicroNum[0] = 4;
MicroNum[1] = 5;
MicroNum[2] = 2;



<리스트 2>처럼 배열을 이용하면 하나의 배열을 만들어 여러 개의 값을 저장하 수 있습니다. 배열의 크기만 지정하면 서랍장 안에 물건을 넣고 꺼내듯 원하는 요소의 값을 알 수 있죠. 수많은 물건이 서랍장에 모여있듯 배열은 한 메모리 위치를 시작점으로 연속되는 위치를 가지고 있습니다. 배열을 선언하는 것은 변수와 크게 다르지 않습니다. [배열 길이]만 추가하면 되죠. <리스트 2>의 int MicroNum[10];는 10개의 값을 담을 수 있는 MicroNum라는 배열을 선언한다는 의미입니다. 선언한 배열명과 함께 [번호]는 배열의 몇 번째 인덱스로 접근하겠다는 뜻이죠. 참고로 [ ]는 인덱스 연산자라고 부릅니다. 여기서 주의할 점은 배열의 길이는 상수 즉, 변하지 않는 값을 선언해야 한다는 것입니다. 숫자는 그 의미대로 숫자일 뿐 숫자가 변경되는 일은 없겠죠. 꼭 기억하세요. 인덱스에는 변수가 아닌 상수를 넣어야 합니다.



배열 사용법

변수와 마찬가지로 배열도 선언과 동시에 초기화할 수 있습니다. 편의상 10개의 공간을 3개로 줄여 설명하겠습니다.



<리스트 3> 배열을 선언하는 동시에 초기화한 예 (1)#include
void main() {
int MicroNum[3];
MicroNum[0] = 4;
MicroNum[1] = 5;
MicroNum[2] = 2;
}



<리스트 4> 배열을 선언하는 동시에 초기화한 예 (2)#include < stdio.h>
void main() {
int MicroNum[3] = {4, 5, 2};
}



배열은 선언과 동시에 대괄호 { }를 사용해 값을 초기화할 수 있습니다. 그런데 초기화할 때 값을 전부 입력해야 할까요



<리스트 5> 배열 초기화값으로 값의 일부만 입력한 예#include < stdio.h>
void main() {
int i;
int MicroNum[3] = {4, 5};
for(i=0; i< 3; i++) {
printf(“%d \n”, MicroNum[i]);
}}



<리스트 5>는 3개의 공간을 가진 배열에 2개의 값만 초기화하고 나머지 하나는 초기화하지 않았습니다. 값을 확인하기 위해 반복문과 출력문을 사용해 배열 내부 값을 확인했습니다. 그 결과, 초기화하지 않은 마지막 값은 0으로 자동으로 초기화된 것을 알 수 있습니다. 즉 배열 선언 시 전체 초기값을 입력하지 않아도 나머지 인덱스는 모두 0으로 초기화됩니다. 여기서 주의할 점은 원하는 인덱스만 초기화할 수 없다는 것입니다. 지금은 초기화 값으로 4, 5를 넣자 자동으로 첫 번째와 두 번째 위치의 인덱스 값이 초기화됐습니다. 만약 두 번째, 세 번째 인덱스만 초기화 값을 지정하고 싶어도 할 수 없다는 것입니다. 만약 100개의 공간을 가진 배열을 0으로 초기화하려면 어떻게 해야 할까요 <리스트 6>처럼 하면 되겠죠 단 하나의 인덱스만 초기화해도 나머지 인덱스가 0으로 초기화되니까요.



<리스트 6> 100개의 공간을 가진 배열을 0으로 초기화#include
void main() {
int i;
int MicroNum[100] = {0};
for(i=0; i< 100; i++) {
printf(“%d \n”, MicroNum[i]);
}}



문자열 사용

문자열은 문자들의 집합이라고 할 수 있는데요. 이미 알겠지만 C 언어에서는 문자열을 큰 따옴표(“”)로 표현합니다. “프로그래밍언어”라는 문자열을 생각해 봅시다. 이 문자열은 연속된 문자들의 집합인데요. 배열은 시작 위치부터 연속된 공간을 가지므로 이러한 문자열을 쉽게 저장할 수 있습니다. 문자열에는 한 가지 중요한 약속이 있는데요. 모든 문자열의 끝에는 ‘\0’ 즉, 널(NULL)이라는 아무 것도 없다는 뜻의 문자가 붙는다는 것입니다. 컴파일러는 문자열의 끝을 모르기 때문에 모든 문자열의 끝에는 널 문자가 이를 알려주는 것이죠.



<리스트 7> 널 문자열 확인 예#include
void main() {
int i;
//char string[6] = “Hello”
char string[6] = {‘H’, ‘e’, ‘l’, ‘l’, ‘o’};
for(i=0; i< 6; i++) {
printf(“%c \n”, string[i]);
}}



<리스트 7>은 문자열 “Hello”를 배열에 저장하고 출력합니다. 큰 따옴표 대신 문자 하나하나에 작은 따옴표를 붙여 배열을 초기화했네요. string 배열은 6개의 공간을 가지고 있는데, <그림 2>에서 확인할 수 있듯 여섯 번째 공간은 아무 것도 없는 빈칸이 출력됐습니다. 바로 ‘\0’ 문자가 출력된 것입니다. 그러므로 문자열을 선언할 때에는 문자열의 길이에 +1을 해야 합니다. NULL 문자까지 공간을 할당해야 하기 때문입니다.



출처 : 마이크로소프트웨어 8월호

제공 : 데이터 전문가 지식포털 DBguide.net