Post

[C] 배열

배열(array)이란?

동일한 타입의 데이터(들)을 ‘하나의 배열이름’ 으로 담아놓은 집합데이터입니다.

배열 변수 선언 형식은 다음과 같습니다.

타입 배열변수명[배열길이];

타입 배열변수명[] = { 초기화 값(들)..};

배열 첨자(index)를 사용하여 각각의 배열원소(element) 사용하면서

배열 첨자는 0 부터 시작!이라는 것 ㅎㅎ

그렇다면 실제로 배열을 하나 만들어보겠습니다.

Desktop View

대표사진 삭제

사진 설명을 입력하세요.

arr이름의 int 타입의 배열을 만들었는데요 배열길이, 편하게 말해서 방의 갯수는 5개로 설정을 했습니다.

그리고 배열번호는 0부터 시작한다고 했죠? 따라서 0부터 4까지 5개의 배열원소에 각각 1부터 5까지의 값을 넣었습니다. 그렇다면 printf(“%d”,arr[2]); 의 문장을 통해서 3번째 배열원소의 값이 제대로 들어갔는지 확인해보도록 하겠습니다.

Desktop View

대표사진 삭제

사진 설명을 입력하세요.

정확히 출력이 되었네요~

*배열 초기화

배열을 위처럼 int arr[5]; 로 선언을 했었죠? 그 다음엔 제가 일일이 배열 원소에 값을 집어 넣었지만, 원소 초기화 방법엔 한 가지만 있는 것이 아닙니다. 또한 배열 선언만 하고 배열원소를 초기화하지 않는다면 쓰레기값(garbage value)이 발생합니다. 따라서 초기화를 해주는 것이 중요한데요.

첫 번째는 제가 했던 것처럼 직접 하나씩 넣어서 초기화를 하는 방식입니다. 하나씩 하기 때문에 배열길이가 커지면 많이 번거로워 지겠죠?

두 번째는 배열 선언과 동시에 초기화 하는 것이니다. 저는 선언 따로 배열원소 초기화 따로 했는데

int arr[3]={0,1,2}; 이런 것처럼 선언과 동시에 할 수 있습니다.

세 번째는 배열 길이만 하고 첫번째 배열원소만 초기화 하는 것인데요.

int arr[100] = { 0}; 이렇게 했습니다. 배열길이가 무려 100이나 되는 거대한 배열인데요. 보시는 것처럼 첫번째 배열원소에만 0값을 초기화 했습니다. 나머지 99개는 어떻게 될까요? 자동으로 0으로 초기화가 됩니다. 이것은 제가 처음 원소를 0으로 정해서 그런게 아니라 어떤 값을 넣어도 초기화 되지 않은 원소들은 다 0으로 됩니다.

네 번째 방법은 선언할 때 배열길이에 아무것도 넣지 않고 배열원소를 초기화 하는 방법입니다.

int arr[] ={ 1,2,3} 으로 선언하면 자동으로 배열길이는 3으로 지정됩니다.

*배열의 용량(size)

배열의 용량은 어떻게 정해질까요? int 타입은 4byte죠? 따라서 int 타입의 배열에 배열길이가 4라면 총 16byte가 되겠네요!

*배열의 크기와 길이(size and length)

크기는 배열의 총 용량입니다. 길이는 배열개수입니다. 여기서는 sizeof() 라는 연산자에 대해서 알아볼건데요. 이것은 데이터의 크기를 byte(정수)로 리턴하는 연산자입니다. 그렇다면 sizeof(100)은 어떤 값이 리턴이 될까요? 네 맞습니다. 100은 정수죠? 정수는 int 타입의 크기로 4입니다. sizeof(s)는? 네 영어문자 하나의 크기는 2byte죠? 따라서 2가 출력됩니다. 또한 타입명 그 자체도 입력이 가능한데요. sizeof(double) 은? 당연히 8의 값이 리턴이 됩니다!

그렇다면 이것을 활용해서 배열의 길이를 구하는 방법을 알아보겠습니다.

sizeof(배열이름) / sizeof(배열원소타입) 입니다. 설명을 하자면 배열이름을 적으면 그 전체 배열 크기가 나옵니다.

전체 배열크기는 배열원소타입크기 x 배열길이 , 즉 int타입의 배열길이가 3이라면 4x3 이 전체 배열 크기겠죠? 여기에 배열원소 타입 값을 다시 나누면 남는것은 배열 길이만 남겠네요 ^^

*주의 할 점은 C언어에서는 길이 0짜리 배열은 선언이 불가하다는 점입니다.

*배열에서의 최대값과 최소값

배열 하나를 만들어 보았습니다.

Desktop View

대표사진 삭제

사진 설명을 입력하세요.

상수 MAX를 5로 지정하고 for문을 사용하여 배열길이가 5인 int타입 arr배열에 5개의 정수 값을 입력했습니다. 그렇다면 여기서 최대값과 최소값은 어떻게 알 수 있을까요?

Desktop View

대표사진 삭제

사진 설명을 입력하세요.

최대값을 구하는 코드를 만들었습니다. 설명을 하자면 5개의 원소를 가진 배열에서 우리가 최대값을 구한다면 어떻게 될까요? 첫번째와 두번째를 처음 비교해보고 그다음 , 그다음 이어나가겠죠? 그렇다면 4번의 비교를 하게됩니다. 원소가 100개라면? 99번해야하는데 당연히 우리가 할 수 없겠죠? 그래서 저렇게 for문을 만들었습니다. max라는 변수에 첫번째 원소를 넣고 for문으로 (i는 1부터) 더 큰 값을 max 라는 변수에 집어넣게 해서 마지막 원소까지 돌린다면 최대값이 max에 대입이 되겠죠. 최소값도 반대로 하시면 됩니다.

Desktop View

대표사진 삭제

사진 설명을 입력하세요.

이렇게 말이죠.

*배열과 문자열(string)

C언어에서는 “문자열”의 정체는 ‘char []배열’ 입니다.

그리고 C언어의 “문자열”은 끝이 ‘\0’(null문자)로 끝나는 ‘char []배열’ 입니다.

null문자는 공백과는 다릅니다. 공백은 하나의 문자이지만 null은 0byte의 크기를 가진 문자라고 할 수 있습니다.

따라서

char str1[20] = “nice”에는 각 원소에 n, i, c, e가 있겠지만 문자열 끝에는 null문자가 있으므로 str[4], 즉 5번째 원소에는 널문자가 있다는 것이죠. 다른 예로,

char str2[] ={‘n’,’i’,’c’,’e’}; 라고 적어 놓으면 printf로 str2가 출력이 될까요? 해보겠습니다.

Desktop View

대표사진 삭제

사진 설명을 입력하세요.

이상한 문자가 있죠? 맞습니다. 이러한 문자열에는 끝에 null이 있어야 컴파일러는 그 전까지만 읽습니다. 여기에는 null문자를 끝에 넣지 않았기 때문에 nice 외에도 끝이 없는 문자코드를 출력하게 되는 것이죠. 따라서

char str2[] = { ‘n’,’i’,’c’,’e’,’\0’ }; 이렇게 해줘야 제대로 nice가 출력이 된답니다.

*다차원 배열(n-dimensional array)

다차원 배열이란 배열 첨자를 복수개를 사용한 것입니다. 두개 사용을 하면 2차원 배열이죠.

그렇다면 다차원 배열은 어디서 쓸모가 있을까요? 필드가 2개이상인 자료를 다룰 때 유용하죠. 예를 들어 학생들은 5명이고 각 학생마다 4과목의 시험을 보고 그 점수를 입력할 때 말이죠. 여기에선 2차원을 예시로 설명을 하도록 하겠습니다.

선언

선언은 int arr[4][3]; 이런식으로 하면 됩니다. 행렬로 비교하면 4행 3열이라 할 수 있겠네요.

초기화

초기화는 1차배열과 같은 방식입니다. for문을 사용하면 편하다고 했죠? 하지만 1차배열에 값을 넣을때와는 다르게 중첩순환문을 사용합니다.

Desktop View

이렇게 4행3열의 배열을 선언하고 중첩 순환문을 통해서 [0][0],[0][1],[0][2] … 이렇게 값을 넣을 수 있도록 문장을 썼습니다.

이것은 직접 값을 넣어 초기화를 하는 것이고,

arr[4][3] ={0}; 처럼 첫번째 원소만 정하고 나머지는 0으로 초기화 되도록 하는 방법도 1차배열과 동일합니다.

오늘은 배열에 대해서 알아봤습니다!

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.