본문으로 바로가기

아두이노 기초 13. 배열

category 아두이노/기초 개념 2017.01.10 16:10



배열(array)


배열은 다수의 변수를 모아 놓은 것이다. 동일한 자료형의 데이터를 일일히 선언할 필요 없이 연이어 저장할 수 있도록 해준다. 즉, 배열은 자료형이 동일한 데이터를 연이어 저장할 수 있도록 하는 기억공간 모임이다. 예를 들어 여러명의 전화번호를 기억하는 변수가 있다고 가정해보자. 소수의 사람이면 상관없겠지만 수십, 수백명의 전화번호를 기억해야 한다면 어떤가? 수십 수백개의 int 자료형을 선언할 것인가? 이렇듯 다수의 데이터를 저장하고 처리해야하는 경우에 배열은 매우 유용하다.


배열의 선언



배열의 길이만 추가하면 일반 변수를 선언하는 것과 유사하다. 그대로 읽어보면 int형 변수 10개로 이루어진 arr배열을 선언한다.

배열은 각각의 요소를 개별적으로 접근할 수 있다. 이렇게 각 요소에 접근하기 위해 색인(index)을 지정해서 사용한다. 배열의 색인은 0부터 시작해서 번호를 순서대로 증가 시킨다. 이렇게 배열의 길이는 10으로 10개의 요소를 가지고, arr[0]~arr[9]까지의 값을 가진다. [10]의 의미는 10개라는 의미이지 10까지라는 의미가 아니다. 색인이 0부터 시작하기 때문에 많이 헷갈리는 부분이므로 주의하기 바란다.

<배열의 메모리 할당>

배열은 위와같이 int형으로 선언된 arr를 arr[0]~arr[9]까지 10개의 변수를 가지고 있는 것이다. 메모리 크기는 8bit 아두이노 보드 기준으로 20byte를 차지하게 된다.

<배열 선언 후 메모리에 초기값이 저장된 모습>

int arr[3] = {10, 30, 20};

이라 선언하면 길이가 3인 int형 arr배열에 각각 arr[0]=10; arr[1]=30; arr[2]=20;로 초기화를 하여 선언한다.라는 의미이다.


배열의 초기화


선언 후 초기화

선언 후 초기화는 배열은 먼저 선언하고, 나중에 초기화하는 방법이다.


선언과 동시에 초기화

1. 배열의 길이와 초기값의 개수가 동일한 경우.

배열의 길이가 3이고 초기값의 개수가 3이므로 아무 문제없이 초기화를 할 수있다.


2. 배열의 길이보다 초기값의 개수가 적을 경우.

배열의 길이는 5이고, 초기값의 개수는 3개이다. 이럴 경우 나머지 2개의 값은 0으로 자동초기화가 된다.


3. 배열의 길이보다 초기값의 개수가 많을 경우.

배열의 길이보다 초기값이 많을 경우 "too many initializers for 'int [*]'"해당문구와 함께 에러가 난다. 그러므로 배열의 길이를 지정해 줬으면 초기값의 개수도 길이와 맞춰주어야 한다. 


4. 길이는 생략하고 초기값만 넣었을 경우.

길이는 생략하고 초기값만 넣으면 컴파일러에서 자동으로 배열의 개수를 결정한다. 필자도 가장 많이 사용하는 방법이다.


5. 길이는 생략하고 초기값도 생략할 경우.

선언 후 초기값을 넣고자 할 때 배열의 길이를 지정하지 않으면 에러가 발생하므로 선언 후 초기화를 사용할 경우 꼭 배열의 크기를 지정해줘야 한다.


2차원 배열


배열은 1차원 혹은 2차원 배열을 가장 많이 사용하며 그 이상의 다차원 배열도 사용할 수 있다. 그러나 4차원 정도까지 가면 불필요하기도 하고 사람이 이해하기 어려운므로 2차원 배열 까지만 학습해도 무방하다.


2차원 배열의 선언 및 초기화


2차원 배열의 선언도 1차원 배열과 크게 다르지 않다. 1차원 배열과 마찬가지로 배열을 이루는 자료형, 배열의 이름, 배열의 길이 순으로 작성한다.


<2차원 배열의 메모리 구조>

2차원 배열은 위와같이 테이블 형태로 구성되어 있다. arr[2][3]은 행의 길이가 2, 열의 길이가 3인 것으로, 2x3의 테이블이 만들어 진다.


<2차원 배열의 메모리 할당 구조>

2차원 배열로 int arr[2][3] = { {10, 20, 30}, {50, 70, 60} };로 선언하였다면 2x3의 테이블이 만들어지고 arr[0][0]=10; arr[0][1]=20; arr[0][2]=30; arr[1][0]=50; arr[1][1]=70; arr[1][2]=60;으로 각각 초기화를 한 것이다.

초기화를 할 때 바깥쪽 중괄호 { }는 초기화를 하겠다는 의미이고, 안쪽 중괄호 { 10, 20, 30 }는 행은 고정하고 열을 증가시키면서 값을 넣는 의미이다. 

즉, { {10, 20, 30} //0번째 행에대한 초기화

, {50, 70, 60} //1행에 대한 초기화 }

위와 같은 방법으로 초기화를 진행 할 수 있다.

나머지 초기화 방법은 1차원 배열과 동일하니 1차원 배열 초기화 방법을 참고하면 된다.




댓글을 달아 주세요

  1. 학생 2017.01.11 17:24 신고

    어려운 내용인데 간단하게 설명해주셔서 과제하는데 도움되네요 감사합니다

  2. 학생 2017.02.04 19:09 신고

    좋은 강의 항상 감사드립니다.

  3. ㅁㅁㅁ 2018.01.03 22:38 신고

    기초 이제 끝냈습니다! 예제도 재미있게 잘 듣겠습니다 감사합니다 ^^

  4. 궁금 2018.03.14 03:06 신고

    배열로 5개 길이를 만들었으면 각각 0 ~ 9개의 값을 가스센서에서 받아서 5회 평균을 내고 싶은데 어떻게하는 걸까요? ex) 43 + 70 + 80 + 90 + 120 / 5 이렇게 하고싶은데 가스값이 과거의 값을 어떻게하는지 모르겠네요

    • Dux_o 2018.06.12 10:46 신고

      총 5번 가스센서에서 값을 받아 평균을 낸다면
      int gas[5]; //선언
      float Gasaverage;
      ~~~ 생략 ~~~
      loop( ){
      for(int i=0; i<5; i++){
      gas[i] = analogRead(가스센서단자);
      Gasaverage += 1.00 * gas[i] ;
      }
      Gasaverage = Gasaverage/5 ;
      ~~~~ 생략 ~~~~
      이렇게 하면 되지 않을까요? 마침저도 비슷한거라 ㅎㅎ

티스토리 툴바