배열을 활용한 성적 확인 프로그램 만들기

CHOI·2021년 6월 19일
0

C 언어

목록 보기
13/28
post-thumbnail

1. 배열이 생긴 이유

여태까지 우리는 컴퓨터의 메모리를 읽을 때 변수를 통해서 메모리를 읽고 쓰고를 했다. 변수 이름 하나가 그 변수 타입에 해당하는 만큼의 공간을 메모리상에 나타내고 있다. 예를 들어서 int a 를 하면 int 는 4바이트니까 변수 a 는 메모리상에 4바이트 공간을 나타내고 있다.

그런데 만약 여러개의 변수를 한꺼번에 다룬다면 어떻게 될까?

물론

int a1, a2, a3, a4, a5, a6, a7, a8, a9, a10;

이렇게 한다면 가능하겠지만 만약 변수가 10개가 아니라 100개면?? 1000개면??

이렇게 된다면 문제점이 발생한다.

  1. 매 번 변수 이름을 나열해야 한다.
  2. 해당 변수를 가지고 작업하는 것이 불편하다(예를들어 변수들을 모두 더하라고 하면 a1+a2....a10까지 써야함)

따라서 C언어에서는 여러개의 변수를 한 번에 다루는 , 즉 컴퓨터 메모리상에 같은 타입의 변수들을 한 꺼번에 정의 할 수 있는 방법을 제공하고 있는데 그것이 바로 배열(Array)이다.

예를들어서 int형 배열은 int형 변수들이 메모리상에 여러개 존재한다.

2. 배열의 기초

#include<stdio.h>
int main(){
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    
    printf("3번째 원소는 %d 이다.\n",arr[2]);
    return 0;
    
}

배열은 말 그대로 특정한 형(Type)의 변수들의 집합이다.

이전에 변수를 정의 했을 때

(변수의 형) (변수의 이름);

이런식으로 정의 했는데 배열을 정의 할 때도 이와 비슷하게

(배열의 형) (배열의 이름)[원소의 개수];

와 같이 해주면 된다. 위의 경우

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

이와 같이 했는데 이는 int 형 타입의 배열 arr 에 10개의 원소가 들어있는데 그 원소들은 {1,2,3...,10} 이라는 말이다. 만약 char arr[10] 을 해주었다면 10개의 원소들 모두 char 형으로 정의된다.

그리고 또한 ={ } 를 하면 배열의 각각 원소는 중괄호 안에 있는 값들이 순차적으로 들어가게 된다 첫 번째 원소는 1 두번째 원소는 2.. 이런식으로 들어가게 된다.

참고로 이 방법은 배열을 정의 할 때만 가능하고 이미 정의된 배열은 사용할 수 없다. 예를 들어서

int arr[3] = {1, 2, 3};  // 가능

arr = {4, 5, 6};  // 불가능!

위에는 가능하지만 아래는 불가능 하다.

또한 만약에 = { } 이런식으로 배열의 원소를 정의 했다면 배열의 크기를 생략해도 원소의 개수에 맞게 컴파일러가 알아서 정의 해준다. 예를 들어서

int arr[] = {1, 2, 3, 4};        // 크기가 4 인 배열 정의
int arr2[] = {1, 2, 3, 4, 5, 6}  // 크기가 6 인 배열 정의

이런식으로 말이다.

배열에서의 원소의 접근

배열에서 각각의 원소에 접근하는 방법은 간단하다. 배열 n 번째 원소에 접근하려면 arr[n-1] 이런식으로 해주면 된다. 예를 들어서

printf("Array 3 번째 원소 : %d \n ", arr[2]);

이런식으로 해주면 된다. 왜 n-1 이냐면 1부터 시작하는 것이 아니라 0부터 시작하기 때문이다. 즉 배열의 첫 번째 원소가 arr[0] 이기 때문이다. 그렇기 때문에 배열의 두 번째 원소는 arr[1] , 세 번째 원소는 arr[2] 이런식이기 때문에 n번째 원소는 arr[n-1]을 해주는 것이다.

(왜 0부터 시작하는지는 나중에 다루겠다.)

그렇다면 만약에 arr[10]을 하면 어떻게 될까?

#include<stdio.h>
int main(){
    int arr[10] = {1,2,3,4,5,6,7,8,9,10};
    
    printf("%d 이다.\n",arr[10]);
    return 0;
    
}


-348585814 라는 뜬금 없는 숫자가 나왔다. 경우에 따라서 아예 오류를 내고 종료할 수 있다.

배열의 위험성

이를 이해하기 위해선 배열이 메모리상에 어떻게 있는지 알아야 한다.

(arr 이 메모리 상에서 0x1234 에서 시작한다고 생각해보자.(출처 : https://modoocode.com/18))

위 그림은 배열 arr 가 메모리상에 어떤식으로 배치되어 있는지 나타낸 것이다. 위의 배열의 경우 0x1234가 시작 주소이다.

C의 배열은 단순히 해당 타입의 변수들의 나열이라고 생각하면 된다. 따라서 배열에는 배열의 크기에 관한 그 어떠한 정보도 없다. 다시 말해서 arr[3] 을 하면 그냥 C언어 상에서 아 배열의 처음 위치로 부터 4 번째 원소구나 라고 생각하는 것이다.


(arr 의 끝 부분)
그러면 arr 배열의 끝부분을 보자. 처음에 10개의 원소를 정의 했으니까 마지막은 arr[9] 일 것이고 그 뒤 메모리 부분에는 다른 변수들의 데이터가 들어 있을 것이다. 그런데 arr[10] 을 하게 되면 프로그램 입장에서는 마치 arr[9] 뒤에 arr[10] 이 있을 것이라고 생각해서 해당 위치의 값을 보여주게 된다. 만일 해당 위치가 접근이 불가능한 영역이라면 프로그램은 오류를 내고 종료될 것이다. 아니라면 해당 부분에 사용중인 데이터의 값을 보여주는 것이다.

지금 같은 경우는 해당 위치에 -348585814 라는 값이 있기 때문에 이 값을 가져온 것이다.

이는 매우 위험한 것이다. 왜냐하면 해당 값이 덮여 씌여질 수 있기 때문이다. 만약 해당 영역에 b 라는 변수가 정의 되어 있다고 할 때 arr[10] = 3 이라고 하면 b = 3 을 한 듯한 효과가 일어난다. 이는 정말 찾기 힘든 어려운 버그로 이어질 수 있다. 따라서 배열을 사용할 때는 반드시 우리가 참조하는 원소의 위치가 배열의 크기보다 작은지 확인해야 한다.

profile
벨로그보단 티스토리를 사용합니다! https://flight-developer-stroy.tistory.com/

0개의 댓글