CS 기초/배열

[CS50] 배열

담크 2021. 8. 7. 23:25

지금까지 특정 자료형의 변수를 선언하면 컴퓨터 메모리상 어딘가에 특정 크기만큼의 자리를 차지하게 됩니다.

이번 포스팅에서는 메모리상에서 여러값을 연이어 저장하는 방법을 공부해보도록 하겠습니다.

 

C에는 여러가지 자료형과 그에 맞는 메모리의 크기가 있습니다.

- char : 1byte

- bool : 1byte

- int : 4byte

- float : 4byte

- long : 8byte

- double : 8byte

- string : 알 수 없음(길이에 따라 다르다)

 

이러한 데이터들은 RAM이라고 하는 컴퓨터 하드웨어에 저장이 됩니다.

 

이제 여러값을 연이어 저장해서 사용하기 위해서는 먼저 배열이란 단어에대해 알아야합니다.

 

배열이란?

번호(인덱스)와 번호에 대응하는 데이터들로 이루어진 자료구조이다.(출처 : 위키백과)

라고 합니다. 이게 정확히 무엇을 뜻하는지 예시를 들어 설명하겠습니다.

 

만약 3개 정수의 평균을 구하는 코드를 작성했다고 생각해봅시다.

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int score1 = 80;
    int score2 = 65;
    int score3 = 40;

    printf("Average: %i\n", (score1 + score2 + score3) / 3);
}

이 코드의 단점이라고 한다면 정수가 3개 이상이 된다면 프로그램의 많은 부분을 수정해야 한다는점이 있습니다.

그렇다면 배열을 이용하면 이 코드는 어떻게 될까요?

#include <cs50.h>
#include <stdio.h>

int main(void)
{
    int scores[3];
    scores[0] = 80;
    scores[1] = 65;
    scores[2] = 40;

    printf("Average: %i\n", (scores[0] + scores[1] + scores[2]) / 3);
}

위의 int scores[3];의 의미는 int 자료형을 가지는 크기3의 배열을 scores라는 이름으로 만들겠다 라는 의미입니다.

배열의 번호(인덱스)는 1이 아닌 0부터 시작하기 때문에 위 코드처럼 3개의 수는 차례대로 0, 1, 2를 가집니다.

따라서 scores[0] = 72;의 의미는 scores의 0번지에 72라는 값을 넣겠다 라는 의미입니다.

이렇게 배열을 사용해면 같은 타입의 데이터를 쉽게 연이어 저장할 수 있습니다.

 

하지만 이렇게 배열을 이용해도 위의 코드는 앞의 코드와 동일하게 정수가 3개 이상이 될 시 여전히 제약이 많습니다.

 

전역변수

그러기 위해서는 먼저 전역변수에 대해 이해가 필요합니다. 보기와 같이 N이 고정된 값(상수)이라면 앞에 const를 붙여 함수 밖에서 선언해주면 전역변수는 코드 전반에 거쳐 바뀌지 않는 값임을 지정해 줄 수 있습니다.

#include<cs50.h>
#include<stdio.h>

const int N = 3;

int main(void){
	int scores[N];
    scores[0] = 80;
    scores[1] = 65;
    scores[2] = 40;

    printf("Average: %i\n", (scores[0] + scores[1] + scores[2]) / N);
}

 

자 이제 우리가 처음 원했던대로 정수가 몇개가되든 자유롭게 받아서 동작하는 동적인 코드를 작성해보겠습니다.

#include <cs50.h>
#include <stdio.h>

float average(int length, int array[]);

int main(void)
{
    int n = get_int("Scores:  ");

    int scores[n];
    for (int i = 0; i < n; i++)
    {
        scores[i] = get_int("Score %i: ", i + 1);
    }

    printf("Average: %.1f\n", average(n, scores));
}

float average(int length, int array[])
{
    int sum = 0;
    for (int i = 0; i < length; i++)
    {
        sum += array[i];
    }
    return (float) sum / (float) length;
}

먼저 main함수에 점수의 갯수를 입력받는 int n을 선언해줍니다.

그다음 평균을 리턴하는 함수 average를 만드는데 평균은 배열의 합 / 배열의 길이이므로 length와 array[ ]를 입력받는곳에 적어줍니다. 그리고 보통 평균은 소수점(실수)으로 나오는 경우가 많으니 float로 리턴타입을 적어줍니다.

그리고 마지막으로 모든 코드는 위에서 아래로 흐르기때문에 함수가 main보다 아래있으면 main에서 average값을 받아오질 못합니다. (코드입장에서 본다면 선언되기 전에 사용되어서) 이럴땐 예전 포스팅에서 설명했던 프로토타입을 이용해서 float average(int length, int array[ ]);를 사용해 아래의 함수를 먼저 선언해줍니다.

 

** 프로토타입을 이용한 선언은 앞에서 설명드렸습니다.

https://darmk.tistory.com/entry/CS50-%EC%82%AC%EC%9A%A9%EC%9E%90-%EC%A0%95%EC%9D%98-%ED%95%A8%EC%88%98-%EC%A4%91%EC%B2%A9-%EB%A3%A8%ED%94%84

 

[CS50] 사용자 정의 함수, 중첩 루프

프로그래밍을 하다 보면 반복적으로 같은 코드를 작성해야 할 때가 있는데, 이때 코드를 여러 번 쓰는 게 아니라 함수 형태로 지정해두면 코드를 간결하게 사용이 가능합니다. 더불어 하나의 루

darmk.tistory.com

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

'CS 기초 > 배열' 카테고리의 다른 글

[CS50] 문자열의 활용  (0) 2021.08.09
[CS50] 문자열과 배열  (0) 2021.08.08
[CS50] 코드의 디자인  (0) 2021.08.06
[CS50] 디버깅  (0) 2021.08.05
[CS50] 컴파일링  (0) 2021.08.04