배열 보고서

배열(Array)이란?

한국어 위키백과에서는 배열을 다음과 같이 정의하고있다.
컴퓨터 과학에서 배열(영어array, 配列·排列, 문화어: 배렬)은 번호(인덱스)와 번호에 대응하는 데이터들로 이루어진 자료 구조를 나타낸다. 일반적으로 배열에는 같은 종류의 데이터들이 순차적으로 저장되어, 값의 번호가 곧 배열의 시작점으로부터 값이 저장되어 있는 상대적인 위치가 된다. 대부분의 프로그래밍 언어에서 사용할 수 있는 가장 기초적인 자료 구조로, 기본적인 용도 외에 다른 복잡한 자료 구조들을 표현하기 위해서 또는 행렬벡터 등을 컴퓨터에서 표현하는 용도 등으로도 사용된다.
C언어에서의 배열은, 같은 자료형의 데이터들을 담을 수 있는 데이터 저장소를 말한다.
간단히 말해서 하나의 변수 안에 여러개의 같은 자료형을 담을 수 있다고 이해하면 된다.

배열을 쓰는 이유

무언가 공부할때는 '왜' 라는것이 상당히 중요하다. 공부하는데에 있어 동기부여가 되기 때문이다.
그렇다면 배열을 공부해야 할 이유는 뭐가 있을까? 어떤 이득을 볼 수 있을까?
이 보고서에서는 재밌는 이야기를 통해 배열을 설명하려고한다.


연규는 선린인고 1학년 3반의 자랑스러운 학생이다. 할게 없어서 무료한 주말을 보내던 도중 내일 반의 자리를 바꾼다는 선생님의 말씀이 기억나 자리를 바꿔주는 프로그램을 만들어야겠다는 생각이 났다!
연규는 자신의 동아리 Layer7에서 배운 C언어로 그런 프로그램을 짤 수 있을것이라고 생각하여 즐거운 마음으로 코드에디터를 켰지만, 변수 선언부에서부터 막혔다.

'아! 우리반 친구가 25명이니까, 25개의 변수를 생성해야하는건가?????'


이러한 문제에 봉착하게 된것이다. 배열은 이러한 상황에 있어서 훌륭한 해결책이 될 수있다.

연규의 경우처럼 배열을 모른다면, 배열 선언부에서부터 이렇게 타자연습을 해야했겠지만:

int a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y;

연규가 배열을 알았다면, 저런 고민을 하지 않아도 된다!

int members[25];

이렇게 말이다.

배열의 사용

선언

C에서 배열은 위에서 보았듯 다음과 같이 선언이 가능하다.
<타입명> <이름><크기>;
반 친구들 25명 각각의 번호를 담는 배열을 만드려고 했기때문에 타입명에 int를, 이름에는 members를, 크기로는 25를 넣은것이다.

따라서, 실제 C언어 코드에서는 다음과 같이 보일것이다.

#include <stdio.h>

int main(void){
    int members[25];
    return 0;
}

접근

연규는 배열을 선언할수 있게 되어 신이 났다. 그런데 이제 또 다른 문제가 생겼다.
'어.. 근데.. 이거 값은 어떻게 넣지?'
배열의 접근은 다음과 같이 할 수 있다. <이름><index> = <넣고 싶은 값>;
그래서 만약 배열에 각각의 번호를 넣으려면, 반복문을 활용해 다음과 같이 해볼 수 있겠다.


#include <stdio.h>

int main(void)
{
    int members[25];
    int i;
    for (i = 0; i <= 25; i++)
        members[i] = i + 1;
    return 0;
}

(이후 연규는 숫자를 랜덤으로 섞는 코드를 이 뒤에 넣어 자리 바꾸기 프로그램을 성공적으로 만들었다고 한다.)

초기화


연규의 C언어 프로그래밍 능력에 감탄한 담임선생님은, 연규에게 하나의 부탁을 하게 되는데...

"연규야, 선생님이 우리반에서 상벌점제도를 운영하려고 하는데, 혹시 친구들 각각의 상벌점을 기록하는 프로그램을 만들어주겠니?"

수행평가의 늪에서 사느라 피곤에 쩔어있던 연규였지만, 반장으로서 선생님의 부탁을 거절하면 안된다는 생각에 그런 프로그램을 만들기로 한다.

그런데 연규는 문득 생각이 들었다.

'25개의 배열에 0을 넣기 위해서 반복문을 돌리는건 조금 비효율적일것같아. 변수처럼 안에있는 모든 내용의 값을 하나로 통일하여서 초기화할순 없을까?'

배열을 선언시에 초기화 하기 위해서는 다음과 같이 할 수 있다.
<타입명> <이름><크기> = {<원하는 값>}

실제 코드에서는 다음과 같이 보일것이다.

#include <stdio.h>

int main(void)
{
    int scores[25] = { 0 };
}

(이후 연규는 반복문과 표준 입출력 헤더에 있는 scanf();함수와 printf(); 함수를 통해 선생님의 부탁을 성공적으로 들어드리게된다!)

문자열이란?

휘몰아치는 수행평가들을 다 끝내고 시간의 여유가 생긴 연규는 문득 이런생각이 들었다.
'멋있는 말을 적으면 멋있는 말을 다시한번 출력해주는 프로그램을 만들자!'
즉 연규는 "Stay hungry, stay foolish" 를 적으면 그대로 "Stay hungry, stay foolish"를 출력해주는 프로그램을 만들고 싶어했던것이다.

그런데 역시 또 다른 고민을 하게 되었는데..
'음.. 그런데 이건 또 어떻게 구현해야하지?'
여기서 연규는 문자열이라는것에 대한 이해가 있다면 해당하는 프로그램을 아주 쉽게 만들수 있었을것이다.

문자열이란, "하나 이상의 문자들의 집합" 을 의미한다.

그렇다면 C에서는 어떤 종류의 문자열들을 만들 수 있을까?

크게 두 종류로 나눌 수 있는데, "문자열 상수"와 "문자열 변수" 가 있다.
상수는 변하지 않는 값을 의미하고, 변수는 변하는 값을 의미한다.

문자열 상수

문자열 상수를 위해서는 포인터라는것을 사용해야하는데, 아직 포인터를 모르는 위해 문자열 상수를 어떻게 만드는지만 언급하도록 하겠다.
char <이름>* = "<저장하고 싶은 내용>";
이렇게 선언을 하게 된다면, <이름> 은 <저장하고 싶은 내용>을 가리키기만 할 뿐이기에 수정은 할 수 없다. 그래서 상수가 되는것이다.

문자열 변수

눈치가 빠른 연규는 어렴풋이 생각했다.
문자열 변수를 위해서는 'char 타입을 이용해 변수를 만들면 그게 문자열이 되지 않을까?'

문자열 변수는 다음과 같이 선언 할 수 있다.
char <이름><크기> = "<저장하고 싶은 내용">
문자열 변수는 다음과 같은 특징을 가지는데,
- 저장하고 싶은 내용보다 사이즈가 하나 더 커야한다
    - 마지막에 문자열의 끝을 알리는 '\0'이 들어가야 하기 때문이다
-  <이름> 안에 <저장하고 싶은 내용>을 저장한다.

아스키 코드란

호기심이 풍부한 연규는 다음과 같이 생각했다.
'어라, 네트워크 시간에 분명 모든 데이터는 숫자라고 했는데 그럼 어떻게 내 컴퓨터는 내가 적었던 명언들을 저장한거지?' 
미국 정보 교환 표준 부호(American Standard Code for Information Interchange), 줄여서 ASCII 는 이 질문에 답을 해줄 수 있다. 


아스키 코드는 7비트의 크기를 가지는 문자 인코딩으로서, 사진처럼 해당하는 문자들을 숫자와 매칭시켜두었다.
앞에 있는 NUL, SOH와 같은 알 수 없는 이상한 친구들은 제어문자로서, 현재에는 사용되는 경우가 잘 없지만, 아직도 Serial 통신에서는 사용된다고 한다.

다차원 배열

다차원 배열은 2차원 이상의 배열을 의미한다. 3차원 공간을 사용할때는 3차원 배열을 선언하는식으로 사용이 된다. 대괄호 쌍이 n개라면, n차원 배열이 선언되는 식으로 사용이 된다.
그중 가장 자주 사용되는 2차원 배열을 다루겠다.

2차원 배열

연규는 공부만 빼면 숨만쉬어도 재미있다는 중간고사 기간을 맞이하게 되었다. 아니나 다를까, 부족한 수학성적을 위해 공부하려던 연규의 책상위에는 연규가 가장 애지중지하는 맥북프로가 찬란하게 빛나고 있었다.
'그래, 전공 공부도 공부인데 뭐 어때? 반 친구들의 번호와 중간고사 평균점수를 동시에 저장하여 비교 할 수 있게 해주는 프로그램을 만들자!'
연규는 즐겁게 수학 문제집을 던져버리고 노트북을 켰다. 그런데...
"에잇, 둘이 연관된 내용인데 배열을 두개나 선언해야 되네?"
연규가 2차원 배열을 알았더라면, 배열 하나만으로도 해당 프로그램을 만들 수 있었을것이다.
2차원 배열은 대괄호 두개의 쌍을 이용하여 선언 할 수 있다. 따라서 다음과 같은 방법으로 선언이 가능하다.

<타입명> <이름><차원1크기><차원2크기>;

이 배열의 총 크기는 차원1크기*차원2크기가 된다. 유의할점은 일반적으로 2차원 공간을 표기할때 가로*세로로 표기하는반면, 세로*가로로 표기한다.

실제 선언코드는 다음과 같다.

#include <stdio.h>

int main(void)
{
    int scores[25][25]; //first one for number, last one for school exam;
    return 0;
}

결국 연규는 이 날 시험공부를 하나도 못했다고 한다.

Comments

Popular Posts