컴퓨터 공부/© C

[C언어] 6. 배열

letzgorats 2021. 1. 28. 17:19

6. 배열

 

<배열을 사용하는 이유>

 

- 3개의 숫자가 있을 때 가장 큰 숫자를 구하는 프로그램을 작성한다고 하면, 기본적으로 변수의 이름을 a,b,c로 설정하면 된다.

하지만, 숫자가 100개라면 어떻게 처리할 수 있을까? 비효율적이긴 하지만 변수 100개를 초기화 시킬 수 있다.(만들어서 선언할 수는 있다. 정말 비효율적)

하지만, 숫자가 100만개라면..? 일일이 변수를 만들어서 처리할 수 없을 것이다. 

따라서, “동일한 자료형여러 개 담는 기술이 필요한데이것이 바로 배열이다!

 

- 배열을 사용하면 동일한 성격의 데이터를 다수 표현할 수 있다.

 

배열의 선언

자료형(double, float, int 등등) 배열명 [배열의 크기]={초기화 값};

 

- 배열의 크기는 배열의 개수라고 생각하면 된다

- 초기화 값은 있을 수도 없을 수도 있다.

  ex) 배열의 크기가 3이라면 {1,2,3} ,  배열의 전체 원소가 전부 0이라면 {0,}

 

 

(예제1) 배열의 선언과 초기화

 

- a[index] 는 무엇을 뜻할까?

ex) a배열이 {1,2,3} 이면 a[1] 2. 인덱스는 위치값인데 0,1,2,3,4,..순이다, 0부터 시작한다.

#include <stdio.h>

int main(void){

        int a[10] = {6,5,4,3,9,8,0,1,2,7};

        int i;

        for (i = 0 ; i < 10 ; i++) {

                printf("%d",a[i]);

        }

        system("pause");
        return 0;
}

(해설) a의 값을 차례로 출력하는 프로그램이다. 먼저 배열을 선언한 뒤에, for문을 이용해 차례로 원소값을 불러서 출력하였다.여기서 printf문에서는 a[i]처럼 인덱싱을 사용해 a라는 배열에 i번째 숫자를 출력 하라고 요청했고, for문은 이것을 반복하여 결국 전체를 다 출력해서 a라는 배열의 원소가 주루룩 나오는 것이다.

여기서 {초기화 값}을 지우고 {0,}라고 바꾸게 되면 010개 출력되기도 한다. 근데 {3,}으로 바꾸면 어떻게 될까?

그러면 맨 첫 원소가 3이고 나머지 뒤 원소는 다 0이 출력된다.

그럼 {3,2,}는 어떻게 출력되는걸까?

 맞다. 앞에 두 원소가 3,2 이고 나머지 8개는 0이 출력된다. 원리 알겠쥬?

 

(예제2) 배열의 원소 중에서 최댓값 찾기

#include <stdio.h>

#include <limits.h>

int main(void){

        int a[10] = {6,5,4,3,9,8,0,1,2,7};

        int i, maxValue = INT_MIN;

        for (i = 0 ; i < 10 ; i++) {

                if (maxValue < a[i]) maxValue=a[i];

        }

        printf("%d",maxValue);

        system("pause");
        return 0;
}

(해설) #include <limits.h>를 불러오면 여기에는 다양한 자료형들의 최솟값이나 최댓값, 즉 그 한계에 해당하는 값들을 포함하고 있다.

int i는 각각의 값들에 접근할 수 있도록 해주고 maxValueINT_MIN 이라는 것을 담을 건데 이 INT_MIN은 상수로서 <limits.h>에 정의가 되어 있다. -20억정도에 해당하는 숫자인데, 우리가 그 숫자를 외울 수가 없으니까 INT_MIN이라는 걸 이용해서 정의할 수 있도록 만들어 준 것이다.

 쉽게말해 “INT_MIN”“int의 최솟값을 표현한 것이고 “INT_MAX”“int의 최댓값을 표현한 것이다.

처음 시작 할 때, int형으로 표현할 수 있는 숫자 중에서 가장 작은 숫자(최솟값) maxValue에 담기기 때문에 결과적으로는 첫번째 숫자부터 마지막 숫자까지 반복하면서 가장 큰 숫자가 maxValue에 담기는 걸 확인 할 수 있고, 우리는 그러한 maxValue를 출력하면 된다.

또한, if문에서 {중괄호}로 열고 닫아줘도 되지만, 배웠던 것처럼 그냥 (괄호) 로 조건 적어주고 실행할 구문 쭈욱 적어준다음에 ;(세미콜론)으로 닫아줘도 된다. (한줄에 한해서)

 

<INT_MIN>

 

- INT_MIN은 최댓값,최솟값을 구하기 위해 자주 사용되는 기능이다.

- <limits.h>헤더파일에 정의가 되어 있는 것으로 int형 범위의 최솟값(-20억까지)을 반환한다.

- INT_MAX 또한 사용 할 수 있다.

 

<문자열과 배열>

 

- C언어는 기본적으로 자체적인 문자열 자료형으로 제공하지 않는다.

- 따라서 C언어에서는 문자(Char)를 여러 개 묶어 놓는 형태문자열을 표현한다.

  (문자열=문자+배열 이라고 할 수 있는 것이다.)

- C++에서는 이러한 불편함을 알고 있기에 자체적으로 string자료형을 제공한다.

- C언어에서는 하나의 문자는 1바이트만 담으므로 문자의 배열을 사용해서 문자열을 표현 할 수 있다.

ex) char a[20] =”HELLO WORLD” 처럼 최대 20자까지 들어 갈 수 있는 a라는 배열을 만들었고 거기에 20자보다는 약간 작은 문자열을 넣을 수 있는 것이다.(여기서 string a 가 아니라 char a 이다!)

 

(예제 3)문자열을 입력 받아서 그대로 출력

 

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main(void) {

        char a[20];

        scanf("%s", &a);

        printf("%s\n", a);

        system("pause");
        return 0;
}

(해설) 문자열을 처리할 때는 %s 라는 형식지정자를 사용해주는 것을 알아야한다. (int형을 처리할 때는 %d였쥬?) 아무튼! 궁금한게 있을 거다. a[20]을 설정해줬으면 그럼 사용자가 a라는 배열이 문자가 최대 20자인 배열이므로 20개를 초과하는 단어로는 출력이 안될까? 하고 말이다.

실제로 20자를 넘는 문자를 입력해봤는데 결론은 출력은 되긴 됐다.

하지만, Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. 라는 오류가 나왔는데, 이는 원래 의도한 크기의 자료형보다 더 큰 자료형의 데이터를 넣으려고 했거나 오타로 인해 의도하지 않은 데이터가 들어갔구나라는 뜻이다.

코드를 수행한 곳이 Visual Studio 여서 이렇게 오류메시지가 나온 것에 행운을 느껴라.

 

 

<문자의 배열에서의 인덱싱>

 

- C언어에서 문자열로 문자의 배열을 쓴다는 점을 귀찮게 생각할 수도 있지만, 그 대신 C언어에서는 특정한 인덱스의 문자에 바로 접근할 수 있다는 장점이 있다.

 

(예제 4)

#include <stdio.h>


int main(void) {

        char a[20]="Hello World";

        a[4] = ',';

        printf("%s\n", a);

        system("pause");
        return 0;
}

(해설) 파이썬에서는 특정한 문자열에 바로 특정한 인덱스의 접근하기가 C언어보다는 약간 까다로운데, C언어는 문자열 자체가 내부적으로는 문자의 배열형태로 처리 되기 때문에 바로 특정한 인덱스에 접근해서 값을 바꾸거나 할 수 있다. 문자열은 큰따옴표를 이용해서 초기화를 시켜줄 수 있고 a[4]=‘,’ 는 인덱스 위치가 4‘o’라는 문자를 ,(콤마)로 바꾸는 코드다. 이처럼 특정한 인덱스의 문자에 바로 접근할 수 있다.  

 

(예제5)문자열에 포함된 ‘l’의 개수 출력하기

#include <stdio.h>


int main(void) {

        char a[]="Hello World";

        int count=0;

        for (int i = 0; i <= 10; i++) {

                if (a[i] == 'l') count++;

        }

        printf("%d\n", count);

        system("pause");
        return 0;
}

(해설) char a[] 처럼 [배열의 크기]안에는 굳이 값을 안 넣어줘도 된다. 배열의 크기는 할당되는 문자열의 문자 개수에 맞춰 자동으로 지정된다. 문자열을 저장할 때의 배열의 최소크기가 여기서는 Hello World 이므로 11NULL 하나를 더해 12이 된다. i0부터 10까지 (11자니까) 증가하도록 만들어서 각각의 자리에서 문자가’l’이면 count1씩 더해줌으로써 코드를 짜면 된다.

 

(정리)

1) 배열을 이용하면 많은 양의 데이터를 쉽게 처리할 수 있다.

2) C언어에서의 문자열은 내부적으로 문자의 배열이다.

 

반응형

'컴퓨터 공부 > © C' 카테고리의 다른 글

[C언어] 8. 문자  (0) 2021.02.13
[C언어] 7. 포인터  (0) 2021.01.28
[C언어] 5. 함수  (0) 2021.01.27
[C언어] 4. 반복문  (0) 2021.01.27
[C언어] 3. 조건문  (0) 2021.01.27