페이지

2025년 12월 21일 일요일

2.4.4. C언어 문법 : 배열

안녕하세요! 여러분의 AI-IT 멘토, '파이컴'입니다. 😊

지난 시간에 피에조 부저로 '학교종'을 연주했던 것, 모두 기억하시나요? tone()delay() 함수를 계속해서 반복하다 보니 코드가 꽤 길어졌었죠. 만약 연주할 곡이 100마디가 넘어간다면 어떨까요? 아마 코드만 입력하다가 지쳐버릴지도 몰라요. 😥

하지만 걱정 마세요! 오늘은 '배열'이라는 아주 똑똑한 데이터 보관함과 'for 반복문'을 함께 사용해서, 아무리 긴 악보라도 아주 짧고 우아한 코드로 연주하는 마법 같은 방법을 알려드릴게요. 그럼, 바로 시작해볼까요?

Slide 1: C언어 문법 : 배열

오늘 우리가 정복할 주제는 바로 C언어 문법의 핵심 중 하나인 '배열(Array)' 입니다. 배열이 무엇인지, 그리고 아두이노에서 어떻게 활용해서 피에조 부저로 멋진 연주를 할 수 있는지 차근차근 알아볼 거예요.

Slide 2: 배열을 이용한 연주 - 소개

문제점: 끝없는 복사-붙여넣기

이전 '학교종' 코드는 tone()delay() 함수의 반복이었어요. 음 하나하나를 명령하다 보니 코드가 길어질 수밖에 없었죠. 이런 방식으로는 100마디짜리 긴 곡을 코딩하는 건 거의 불가능에 가까워요.

해결책: 배열과 반복문의 환상적인 조합!

바로 이 문제를 해결해 줄 똑똑한 방법이 있어요!

  • 배열: 멜로디(음계)와 박자 데이터를 미리 '배열'이라는 서랍장에 차곡차곡 정리해둬요.
  • for 반복문: 반복문을 이용해 서랍장을 순서대로 열면서 음계와 박자를 꺼내 연주하도록 시키는 거죠.

결과는? 훨씬 짧고 깔끔한 코드로 똑같은 연주를 해낼 수 있답니다!

Slide 3: 회로 구성 – 학교종 연주하기와 동일

이번 실습의 회로는 이전에 했던 '학교종 연주하기'와 완전히 똑같아요. 새로 만들 필요 없이 그대로 사용하면 된답니다!

  • 준비물: 아두이노, 피에조 부저, 브레드보드, 점퍼선
  • 회로 구성:
    • 피에조 부저의 긴 다리(+) → 아두이노 11번 핀
    • 피에조 부저의 짧은 다리(-) → 아두이노 GND 핀
  • 주의사항: 피에조 부저는 극성(+, -)이 있는 부품이에요. 다리 길이를 꼭 확인하고 연결해주세요!

Slide 4: 학교종 배열 버전 - 코드

자, 드디어 마법 같은 코드를 만나볼 시간이에요! 이전 코드와 비교하면 얼마나 간결해졌는지 한눈에 보일 거예요.

CODE 2.13 | 배열을 이용한 학교 종 연주하기 코드
01void setup() {
02 int i;
03
04 // 학교 종 멜로디(주파수)를 배열 a에 저장
05 int a[7] = {392, 392, 440, 440, 392, 392, 330};
06
07 // 각 음의 박자(시간)를 배열 b에 저장
08 int b[7] = {1000, 1000, 1000, 1000, 1000, 1000, 2000};
09
10 // 0번째부터 6번째까지 7번 반복
11 for (i = 0; i < 7; i++) {
12 tone(11, a[i], b[i]); // a[i]멜로디를 b[i]시간만큼 연주
13 delay(b[i]); // 소리가 날 때까지 대기
14 }
15}
16
17void loop() {
18}

코드를 하나씩 살펴볼까요?

  • 멜로디 배열 a: int a[7] = { ... };
    '솔솔라라솔솔미'에 해당하는 7개 음의 주파수 값을 a라는 이름의 배열에 순서대로 저장했어요.
  • 박자 배열 b: int b[7] = { ... };
    각 음을 얼마나 길게 연주할지(시간, ms) b라는 배열에 저장했어요. 마지막 '미'는 길게 연주해야 하니까 2000(2초)으로 설정했네요.
  • 반복문 for: for (i = 0; i < 7; i++) { ... }
    이 부분이 바로 핵심이에요! i라는 변수가 0부터 6까지 1씩 증가하면서 총 7번 반복해요.
    • tone(11, a[i], b[i]);: 반복문이 돌 때마다 i번째 멜로디(a[i])와 i번째 박자(b[i])를 가져와서 11번 핀으로 연주하라는 뜻이에요.

이 코드를 업로드하면 아두이노가 배열에 정리된 악보를 보고 스스로 연주를 시작할 거예요. 정말 스마트하죠?

Slide 5: 배열 기본 개념

배열(Array)이란?

개념을 좀 더 자세히 알아볼게요. 변수가 물건을 딱 하나만 담을 수 있는 '상자'라면, 배열은 번호가 매겨진 '사물함'이나 '기차'와 같아요. 비슷한 종류의 데이터 여러 개를 하나의 이름으로 묶어서 번호로 관리하는 아주 유용한 방법이죠.

형식

배열은 아래와 같은 형식으로 만들어요.
자료형 배열이름[개수] = {값1, 값2, ...};

예시

int a[3] = {10, 20, 30}; 이라는 코드를 분석해볼까요?

  • int: 이 배열에는 정수(숫자)만 들어갈 수 있다는 뜻이에요.
  • a: 이 배열의 대표 이름은 'a'예요.
  • [3]: 방(공간)이 총 3개 있다는 뜻이에요.
  • {10, 20, 30}: 각 방에 10, 20, 30이라는 값을 순서대로 채워 넣는다는 의미죠.

Slide 6: 배열의 인덱스

가장 중요한 규칙: 번호는 0부터!

여기서 정말 정말 중요한 규칙이 하나 있어요. 바로 배열의 방 번호(인덱스, Index)는 1이 아니라 0부터 시작한다는 점이에요. 프로그래밍 초보자들이 가장 많이 하는 실수 중 하나니 꼭 기억해주세요!

예시

int a[3] = {10, 20, 30}; 배열을 다시 볼게요.

  • 첫 번째 방: a[0] (값: 10)
  • 두 번째 방: a[1] (값: 20)
  • 세 번째 방: a[2] (값: 30)

슬라이드의 사물함 그림을 보면 이해가 더 쉬울 거예요. 3개의 칸이 있지만 번호는 a[0], a[1], a[2]로 붙어있죠? 즉, 방이 3개인 배열의 마지막 방 번호는 2번이랍니다.

Slide 7: 배열과 반복문

찰떡궁합, 환상의 짝꿍!

배열의 인덱스가 0, 1, 2... 와 같은 숫자라는 점, 뭔가 떠오르지 않나요? 맞아요! for 반복문에서 0부터 1씩 증가하는 변수 i와 완벽한 짝을 이뤄요. 이 둘을 함께 사용하면 정말 강력한 기능을 발휘한답니다.

코드 예시

CODE X.X | 코드 제목
01int a[3] = {10, 20, 30};
02
03for (int i = 0; i < 3; i++) {
04 tone(11, a[i], 1000); // a[i] 값을 1초간 연주
05 delay(1000);
06}

위 코드는 아래 3줄의 코드를 반복해서 실행하는 것과 완전히 똑같아요.

  • i가 0일 때 → tone(11, a[0], 1000); (10Hz 소리 연주)
  • i가 1일 때 → tone(11, a[1], 1000); (20Hz 소리 연주)
  • i가 2일 때 → tone(11, a[2], 1000); (30Hz 소리 연주)

이렇게 i 값만 바꾸면 배열의 모든 값을 순서대로 사용할 수 있으니, 코드가 간결해지고 유지보수도 훨씬 쉬워지겠죠?

Slide 8: 배열 사용의 장점

오늘 배운 배열을 사용하면 어떤 점이 좋을까요? 3가지로 정리해볼게요.

  1. 코드 간결성: 수십, 수백 줄이 될 수도 있는 반복 작업을 단 몇 줄의 코드로 자동화할 수 있어요.
  2. 유지보수 용이성: 만약 '학교종' 멜로디를 다른 곡으로 바꾸고 싶다면? 복잡한 코드 로직을 건드릴 필요 없이 배열 ab에 들어있는 값만 수정해주면 끝! 정말 간편하죠?
  3. 확장성: 100마디짜리 긴 곡을 연주하고 싶다면? 배열의 크기([7] 이 부분을 [100]으로)를 늘리고, 그 안에 음계와 박자 값만 쭉 채워주면 돼요. 코드의 기본 구조는 전혀 바꿀 필요가 없답니다.

오늘은 배열과 반복문을 활용해 코드를 획기적으로 다이어트하는 방법을 배워봤어요. 이제 어떤 긴 악보라도 자신 있게 코드로 옮길 수 있겠죠? 처음에는 인덱스가 0부터 시작하는 것이 조금 낯설 수 있지만, 몇 번만 직접 코드를 짜보면 금방 익숙해질 거예요.

여러분도 좋아하는 동요나 노래의 악보를 찾아서 직접 배열로 만들어 연주해보는 건 어떨까요? 직접 해보는 것만큼 좋은 공부는 없으니까요!

오늘 내용 중 궁금한 점이 있다면 언제든지 댓글로 질문해주세요. 그럼 다음 시간에 더 유익하고 재미있는 주제로 다시 만나요! 👋

이 포스팅의 내용은 교재 [주니어 공학교실 아두이노의 기초] 153-157 페이지에 수록된 내용입니다.

댓글 없음:

댓글 쓰기