페이지

2026년 1월 1일 목요일

2.3.5. C언어 문법 : 함수

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

지난 시간에는 3색 LED로 다채로운 색을 만들어봤죠? 오늘은 여기서 한 단계 더 나아가, 버튼 3개를 사용해서 우리가 원할 때마다 LED 색깔을 마음대로 바꿔보는 프로젝트를 진행할 거예요.

기능이 많아지면 코드가 길고 복잡해지기 마련인데요, 이럴 때 코드를 깔끔하게 정리하고 관리하는 아주 스마트한 방법이 있답니다. 바로 '함수(Function)'라는 C언어 문법이에요. 마치 서랍을 칸칸이 나눠 물건을 정리하듯, 관련 있는 코드들을 묶어주는 마법 같은 기술이죠.

자, 그럼 오늘 배울 내용을 슬라이드와 함께 차근차근 살펴볼까요?

Slide 1: C언어 문법: 함수

C언어 문법: 함수

이번 시간의 주제는 바로 '함수'입니다. 3색 LED를 제어하면서 자연스럽게 함수의 개념과 필요성을 익혀볼 거예요.

Slide 2: C언어 문법: 함수 개요

C언어 문법: 함수 개요

오늘 우리가 만들 작품의 목표는 명확해요. 버튼 3개를 눌러 3색 LED의 색깔을 원하는 대로 바꾸는 것!

그런데 생각해보세요. 버튼 1개를 누를 때마다 빨간색, 초록색, 파란색을 켜는 코드를 각각 작성하면 loop() 함수 안이 금세 복잡해지겠죠?

바로 이 문제를 해결하기 위해 '함수(Function)'를 사용할 거예요. 함수를 사용하면 다음과 같은 장점이 있어요.

  • 코드 정리 정돈: 관련된 명령어들을 하나의 꾸러미로 묶어 코드를 깔끔하게 만들어요.
  • 관리의 용이성: red(), green()처럼 쉬운 이름을 붙여두면, 나중에 코드를 다시 봤을 때 "아, 이건 빨간불 켜는 코드였지!" 하고 바로 이해할 수 있답니다.

Slide 3: 회로 구성하기

회로 구성하기

코드를 작성하기 전에 먼저 회로부터 튼튼하게 만들어야겠죠?

✅ 준비물

  • 아두이노 우노
  • 3색 LED
  • 저항 (220옴 정도)
  • 푸시 버튼 3개
  • 브레드보드와 점퍼선

✅ 회로 연결 방법

이번 회로는 이전에 만들었던 '3색 LED' 회로에 버튼 3개만 추가하면 완성돼요.

  1. 3색 LED 연결:
    • 빨강(R) 핀 → 저항 → 아두이노 11번 핀
    • 파랑(B) 핀 → 저항 → 아두이노 10번 핀
    • 초록(G) 핀 → 저항 → 아두이노 9번 핀
    • 가장 긴 다리(GND) → 아두이노 GND 핀
  2. 버튼 3개 연결:
    • 첫 번째 버튼의 한쪽 다리 → 아두이노 2번 핀
    • 두 번째 버튼의 한쪽 다리 → 아두이노 3번 핀
    • 세 번째 버튼의 한쪽 다리 → 아두이노 4번 핀
    • 각 버튼의 반대쪽 다리는 모두 GND에 연결해주세요.

어? 버튼에 저항을 연결 안 해도 되냐고요? 네, 맞아요! 이번에도 코드에서 내부 풀업 저항(INPUT_PULLUP) 기능을 사용할 거라 외부 저항 없이 회로를 아주 간단하게 구성할 수 있답니다.

Slide 4: 나만의 명령어, 사용자 정의 함수 만들기

사용자 정의 함수 만들기

자, 이제 오늘의 핵심인 '함수'를 만들어 볼 시간이에요. 매번 색을 바꿀 때마다 analogWrite() 명령어를 3줄씩 쓰는 건 너무 번거롭잖아요? 그래서 우리는 '빨간불 켜기', '초록불 켜기' 같은 동작들을 하나의 '나만의 명령어'로 만들어 둘 거예요.

CODE 4.1 | 사용자 정의 함수 만들기
01// 빨간불 켜! 라는 나만의 명령어 만들기
02void red() {
03  analogWrite(11, 255); // 빨간색은 최대로 켜고
04  analogWrite(10, 0);   // 파란색은 끄고
05  analogWrite(9, 0);    // 초록색도 끈다
06}
07 
08// 초록불 켜! 라는 나만의 명령어 만들기
09void green() {
10  analogWrite(11, 0);
11  analogWrite(10, 0);
12  analogWrite(9, 255);
13}
14 
15// 파란불 켜! 라는 나만의 명령어 만들기
16void blue() {
17  analogWrite(11, 0);
18  analogWrite(10, 255);
19  analogWrite(9, 0);
20}
21 
22// LED 불을 꺼! 라는 나만의 명령어 만들기
23void off() {
24  analogWrite(11, 0);
25  analogWrite(10, 0);
26  analogWrite(9, 0);
27}

이렇게 red(), green(), blue(), off()라는 4개의 함수를 미리 만들어두면, 앞으로 우리는 복잡한 analogWrite 코드 대신 이 간단한 이름만 불러서 사용하면 된답니다. 정말 편리하겠죠?

Slide 5: 전체 소스 코드 구조 살펴보기

전체 소스 코드 구조

함수를 만들었으니 이제 전체 코드 구조를 살펴볼게요. 코드는 크게 setup()loop() 두 부분으로 나뉘어요.

🔧 setup() 함수: 초기 설정

CODE 5.1 | setup() 함수
01void setup() {
02  // 버튼 3개를 입력 모드로 설정 (내부 풀업 저항 사용)
03  pinMode(5, INPUT_PULLUP); // 초록색 버튼
04  pinMode(6, INPUT_PULLUP); // 파란색 버튼
05  pinMode(7, INPUT_PULLUP); // 빨간색 버튼
06}

setup()에서는 아두이노가 처음 켜질 때 한 번만 실행될 초기 설정을 해요. 여기서는 5, 6, 7번 핀에 연결된 버튼들을 입력 모드(INPUT_PULLUP)로 설정해주었습니다.

🔄 loop() 함수: 핵심 로직

CODE 5.2 | loop() 함수
01void loop() {
02  if (digitalRead(5) == LOW) {      // 5번 버튼(초록)이 눌렸다면?
03    green();                        // green() 함수 실행!
04  } else if (digitalRead(6) == LOW) { // 6번 버튼(파랑)이 눌렸다면?
05    blue();                         // blue() 함수 실행!
06  } else if (digitalRead(7) == LOW) { // 7번 버튼(빨강)이 눌렸다면?
07    red();                          // red() 함수 실행!
08  } else {                          // 아무 버튼도 안 눌렸다면?
09    off();                          // off() 함수 실행!
10  }
11}

loop() 함수가 훨씬 간결해진 것 보이시나요? 복잡한 코드 대신 우리가 만든 함수 이름만 호출하니 어떤 동작을 하는지 한눈에 쏙 들어오죠. if ~ else if ~ else 구문을 사용해서 여러 버튼의 상태를 순서대로 확인하고 그에 맞는 함수를 실행하도록 만들었어요.

Slide 6: 실행 결과 확인하기

실행 결과 확인하기

코드를 모두 업로드하고 나면 우리가 의도한 대로 잘 작동하는지 확인해봐야겠죠?

  • 5번 핀 연결 버튼을 누르면 → 초록색 LED가 켜져요.
  • 6번 핀 연결 버튼을 누르면 → 파란색 LED가 켜져요.
  • 7번 핀 연결 버튼을 누르면 → 빨간색 LED가 켜져요.
  • 버튼에서 손을 떼면 (아무것도 안 누르면) → LED가 꺼집니다.

여러분도 똑같이 동작하나요? 축하합니다! 함수를 이용한 첫 번째 프로젝트 성공이에요!

Slide 7: '함수'에 대해 조금 더 깊이 알아볼까요?

함수 깊이 알아보기

이제 우리가 사용한 '함수'가 문법적으로 어떻게 이루어져 있는지 조금 더 자세히 들여다볼게요.

🤔 함수란?

  • 나만의 명령어를 만드는 기술이에요.
  • 여러 줄의 복잡한 코드를 하나의 간단한 이름으로 묶어주는 역할을 해요.

📜 기본 형식

CODE 7.1 | 함수 기본 형식
01void 함수이름() {
02  실행할 내용
03}
  • void (보이드): '비어있다'는 뜻이에요. 이 함수는 어떤 계산 결과를 돌려주지 않고, 그냥 맡은 일만 묵묵히 처리하고 끝낸다는 의미랍니다.
  • 함수이름(): 우리가 직접 지어주는 함수의 이름이에요. red(), green()처럼 알기 쉽게 짓는 게 좋겠죠?
  • { } (중괄호): 이 괄호 안에 함수가 호출되었을 때 실제로 실행될 코드들을 넣어줘요.

Slide 8: 함수, 어떻게 사용하나요? (정의와 호출)

함수의 정의와 호출

함수를 사용하는 과정은 크게 '정의(Definition)''호출(Call)' 두 단계로 나눌 수 있어요.

1️⃣ 함수 정의하기 (만들기)

CODE 8.1 | 함수 정의하기
01void red() {
02  analogWrite(11, 255);
03  analogWrite(10, 0);
04  analogWrite(9, 0);
05}

이렇게 함수의 이름과 실행할 내용을 정해주는 과정을 '정의'라고 해요. "아두이노야, 앞으로 red()라고 부르면 이 3줄의 코드를 실행하는 거야!"라고 가르쳐주는 것과 같아요.

2️⃣ 함수 호출하기 (사용하기)

CODE 8.2 | 함수 호출하기
01loop() {
02  red(); // 이렇게 이름만 불러주면 끝!
03}

정의해 둔 함수가 필요할 때 그 이름을 부르는 것을 '호출'이라고 해요. loop() 안에서 red(); 한 줄만 쓰면, 아두이노는 위에서 정의했던 red() 함수의 내용 3줄을 찾아서 실행해 준답니다.

Slide 9: 선택지가 여러 개일 때! 다중 조건문 (if ~ else if ~ else)

다중 조건문

이번 프로젝트에서는 버튼이 3개였죠? 이렇게 선택지가 여러 개일 때 아주 유용한 것이 바로 다중 조건문이에요.

❓ 왜 필요한가요?

기존의 if ~ else 문은 '참일 때'와 '거짓일 때' 두 가지 경우밖에 처리하지 못해요. 하지만 버튼이 3개면 "1번 버튼 눌림?", "2번 버튼 눌림?", "3번 버튼 눌림?", "아무것도 안 눌림?"처럼 여러 상황을 따져봐야 하죠. 이럴 때 else if를 사용합니다.

📜 기본 형식

CODE 9.1 | 다중 조건문 기본 형식
01if (조건 A) {
02  // 조건 A가 참일 때 실행
03} else if (조건 B) {
04  // 조건 A는 거짓이고, 조건 B가 참일 때 실행
05} else {
06  // 조건 A와 B가 모두 거짓일 때 실행
07}

else if는 원하는 만큼 계속 추가해서 더 많은 조건을 검사할 수 있어요.

Slide 10: if, else if, else 각각의 역할

if, else if, else 역할

다중 조건문을 구성하는 세 요소의 역할을 명확히 알아두면 코드를 이해하기 훨씬 쉬워져요.

  • if
    • 가장 먼저 조건을 검사해요.
    • 만약 if의 조건이 참이면, 해당하는 코드를 실행하고 나머지 else ifelse는 쳐다보지도 않고 조건문 전체를 빠져나갑니다.
  • else if
    • 바로 앞의 ifelse if의 조건이 거짓일 때만 자신의 조건을 검사해요.
    • 필요한 만큼 여러 개를 이어서 사용할 수 있어요.
  • else
    • 위의 모든 ifelse if 조건이 전부 거짓일 때 최후의 수단으로 실행돼요.
    • 모든 가능성을 제외한 나머지 경우이므로, 별도의 조건식이 필요 없어요.

Slide 11: 다중 조건문, 어떤 순서로 실행될까요?

다중 조건문 실행 순서

아두이노는 이 다중 조건문을 위에서부터 순서대로, 마치 질문을 던지듯이 처리해요.

CODE 11.1 | 다중 조건문 실행 순서
01if (digitalRead(5) == LOW) {
02  green(); // 1순위: 5번 버튼 눌렸니? → 맞으면 초록불 켜고 끝!
03} else if (digitalRead(6) == LOW) {
04  blue();  // 2순위: (5번은 아니고) 6번 버튼 눌렸니?
05} else if (digitalRead(7) == LOW) {
06  red();   // 3순위: (5,6번도 아니고) 7번 버튼 눌렸니?
07} else {
08  off();   // 최종: 아무것도 안 눌렸구나 → 그럼 불 꺼!
09}

이처럼 if문은 우선순위를 가지고 동작해요. 만약 여러 개의 버튼을 동시에 누르더라도, 코드상에서 가장 먼저 검사하는 if 또는 else if문에 해당하는 동작 하나만 실행된답니다.

오늘은 정말 중요한 두 가지 개념을 배웠어요.

  1. 함수(Function): 복잡한 코드를 의미 있는 이름으로 묶어 재사용하고, 전체 코드의 가독성을 높이는 정리 정돈의 기술!
  2. 다중 조건문(if ~ else if ~ else): 여러 개의 선택지 중 하나를 골라야 하는 상황을 논리적으로 처리하는 방법!

이제 여러분은 기능이 더 많아지는 프로젝트를 만나더라도 코드가 복잡해지는 것을 두려워할 필요가 없어요. 오늘 배운 함수로 기능별 코드를 착착 정리하고, 다중 조건문으로 다양한 상황에 대처할 수 있게 되었으니까요.

스스로에게 칭찬 한번 해주시고, 다음 시간에는 더 재미있는 프로젝트로 돌아오겠습니다. 모두 고생 많으셨어요! 🎉

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

댓글 없음:

댓글 쓰기