[왕초보 임베디드-C 공부 일기] 2. 함수(1) - 구조와 의미

함수는 매개변수화된 특정 연산에 이름을 부여하는 것으로, 특정 알고리즘을 코드로 구현한 것이다. 


I. 함수의 구조


   1) 반환형(Return Type) : 함수 작업 후 반환하는 값의 유형
      -int(정수), char(문자).... 등이 해당
      -void : '반환할 값이 없다.'는 뜻

   2) 함수 이름(Function Name) : 함수를 호출할 때 부르는 이름
      -영문자, 숫자, 언더바(_) 사용, 숫자로 시작 불가
      -ex) print_sensor_data, CalculateSpeed

   3) 매개변수(Parameters) : 함수가 작동하는 데 필요한 입력값을 받는 변수
      -콤마( , ) 로 구분해서 여러 개를 받을 수 있음
      -입력값이 필요 없다면 비워두거나 void라고 표기

   4) 함수 몸체(Body) : 중괄호 '{ }' 안에 작성된 실제 동작 코드
      -반환형이 void가 아니라면, 반드시 끝에 return 값이 있어야 함

II. 선언과 정의 

   C언어 컴파일러는 코드를 위에서 아래로 읽는다. 그래서 main함수 뒤에 다른 함수를 만들면, 컴파일러가 인식하지 못하고 에러를 낸다. 
   이를 방지하기 위해 선언과 정의를 나눈다. 

   1) 함수 선언(Prototype)
      -위치 : 코드 맨 위(보통 main함수 앞)
      -역할 : 나중에 이 이름의 함수가 나올 거라고 컴파일러에게 예고하는 것
      -형태 : 중괄호 없이 세미콜론( ; )으로 끝남. 
  int sum (int a, int b); 

   2) 함수 정의(Definition)
      -위치 : 보통 main함수 뒤, 또는 별도의 .c 파일
      -역할 : 실제 함수의 동작 내용을 적는 것
      -형태 : 중괄호 안에 코드를 작성
int sum (int a, int b) { 
   return a + b; 
}

III. 매개변수 전달 방식(Pass by Value)

   -함수를 호출할 때 넣어주는 값(인자)은 '복사'되어 전달됨
   -즉, 함수 안에서 매개변수 값을 아무리 바꿔도, 함수 밖의 원본 변수에는 영향을 주지 않는다. 
   (원본을 바꾸고 싶을 때는 '포인터' 를 사용해야 함.)

IV. 함수가 중요한 이유 : 모듈화(Modularity)의 핵심


   1)재사용성 : 모터 굴리는 함수 motor_run()을 하나 잘 만들어주면, 바퀴가 4개든 6개든 그 함수만 계속 쓰면 된다.
   2)유지보수 : "센서 값이 이상하다?" 그러면 main을 다 찾아보는 게 아니라 read_sensor()함수만 고치면 된다.
   3)추상화 : 내부의 복잡한 기계적/논리적 작동 원리는 숨기고, 사용자가 꼭 필요한 조작 함수(함수 이름, 매개변수)만 설명하면 됨


참고한 강의 :
Coursera - Introductory C Programming - Course 1(Duke University)
Udemy - Microcontroller Embedded C Programming: Absolute Beginners(FastBit Embedded Brain Academy)

이외에 공부 중 궁금했거나 찾아봐야 했던 정보는 Gemini질문으로 해결하였습니다. 혹시 틀리거나 부족한 부분은 댓글로 말씀하시면 수정하겠습니다.