06. 함수

함수의 구성

함수의 정의

프로그램은 함수들로 구성되고 함수들이 순서대로 실행됨으로써 프로그램이 제 기능을 발위한다. 즉, 함수는 프로그램을 구성하는 단위로서 프로그램의 부품 역할을 한다. C++에서는 함수의 이런 부품 역할을 객체가 대신 한다.

함수는 표준 함수와 사용자 정의 함수로 나뉜다. 표준 함수는 컴파일러와 함께 배포된 C언어와 함께 작성되어 제공되는 것이다. 사용자 정의 함수는 개발자가 필요에 따라 만들어 쓰는 함수이다.

함수

  • name : 함수의 이름. 이 이름을 통해 함수를 호출한다. 함수의 이름도 명칭이므로 명칭을 만드는 규칙대로 만든다.
  • 인수 목록 : 함수가 넘겨 받아야 할 값들.
  • type : 함수가 리턴하는 값의 데이터형.
  • 본체 : 함수가 호출되었을 때 수행될 코드.

인수

호출원에서 함수에게 넘겨주는 작업 대상.  전달받는 값이 없다면 void를 써 명시해 준다. 예전에는 형식 인수의 이름만 적고 본체가 시작되기 전에 이 인수들의 타입을 밝히기도 하였다.

return

타입으로 정해진 값을 리턴함과 동시에 함수를 종료한다. 값을 반환하지 않는 void형 함수도 종료를 위해 사용할 수 있다.

함수와 프로시저

함수는 특정 계산을 수행하며 리턴값이 있다. 반드시 수식내에서만 사용할 수 있으며 함수 단독으로 문장을 구성할 수 없다. 이 경우는 수학적 의미릐 함수와 거의 유사하다.

프로시저는 특정 작업을 수행하며 리턴값이 없다. 리턴값이 없기 때문에 수식 내에서는 사용할 수 없으며 단독으로 문장을 구성할 수는 있다. C의 void 함수가 해당한다.

다른 언어와 구분되는 C의 함수의 특징

  1. 함수끼리는 서로 평등한 관계에 있으며 상호 수평적이다.
  2. 리턴값은 있을 수도 있고 없을 수도 있다.
  3. 항상 단독으로 문장을 구성할 수 있다.
  4. 값에 의한 호출방식을 사용한다.

헤더 파일

함수의 원형

C는 1패스 방식으로 단 한 번 읽어서 번역을 하기 때문에, 사용되기 전에 컴파일러가 미리 그 형태를 알 수 있도록 원형을 선언한다. 미리 선언해 두면 본체가 어디에 있더라도 함수 호출부에서 이 명칭이 함수이고 어떤 인수를 요구한다는 것을 미리 알 수 있게 된다.

원형의 형식

type name (인수 목록);

으로 세미콜론을 붙여 끝낸다. 인수 목록에서 형식 인수명도 적어줄 수도 있고, 인수의 타입만 간략하게 밝힐 수도 있다. 읽는 사람을 위해 가급적이면 함수의 원형을 완전하게 적는 것이 더 권장된다.

헤더 파일

표준 함수 역시 함수이기에 사용되기 전에 선언되어야 한다. #include에 대해서는 뒤에서 설명할 것이다. 어떤 헤더에 어떤 함수가 선언되어 있는지는 인터넷에서 찾아볼 수 있다.

헤더 파일에 들어있는 것은 다음과 같다.

  1. 표준 함수의 원형
  2. 각 표준 함수들이 사용하는 매크로 상수들
  3. 각 표준 함수들이 사용하는 열거형 타입
  4. 자료의 가공을 간편하게 해 주는 매크로 함수들
  5. 구조체, 공용체 등 표준 함수가 요구하는 사용자 정의 타입의 정의

모듈

모듈 분할 컴파일

함수의 그룹 별로 모듈을 구성, 각 부를 구현하는 함수 집합에 대해 따로 만들어 개별적으로 컴파일해 하나의 실행 파일로 합치는 방식이다.

모듈 분할 컴파일의 장점

  1. 컴파일 속도가 빠르다
    함수들이 여러 개의 모듈에 분산되어 있으므로 한 함수를 수정한 경우 그 모듈만 컴파일 하면 된다. 잘게 나눌 수록 이 효율은 증대된다.
  2. 분담 작업이 가능하다.
    파일을 여럿으로 나누어 관리할 수 있으므로 가능하다.
  3. 프로젝트 관리가 쉽다
    모듈별로 관련 함수를 모아 놓았기 때문에 문제 부분을 찾아 수정하기 쉽다.
  4. 모듈을 재사용 할 수 잇다.
    기능적으로 독립되어 있는 집합이므로 후일 같은 기능을 구현해야 한다면 저비용으로 재사용이 가능하다.

함수의 호출 방식

값 호출

함수 호출 시 전달되는 대상이 실 인수 그 자체가 아니라 실인수의 값이다. 형식 인수가 함수 내에서 변경되더라도 실 인수에는 전혀 영향을 주지 않는다.

참조 호출

번지값을 넘겨받아 직접 실 인수로 작업을 수행한다. 참조 호출 함수의 실 일수로는 좌변값만 사용할 수 있다.

C++의 참조 호출

C는 포인터를 사용하며 참조 호출 흉내는 낸다. C++은 포인터를 이용하는 방법 외에 레퍼런스라는 개념으로 참조 호출을 추가로 지원한다. C언어의 참초 호출은 사실 엄밀한 의미의 참조 호출이 아니라 변수의 번지값을 넘겨받는다. C++의 레퍼런스도 엄밀히 따지면 값 호출이다.

전처리기

#include

#include 〈file.h〉

는 표준 헤더를 포함하고자 할 때 사용하고, 

#include "file.h"

는 사용자가 직접 작성한 헤더 파일을 포함시키고자 할때 사용한다. 사실 헤더의 검색 순위만 다를 뿐 바꿔써도 같은 이름의 다른 내용의 파일이 두 경로에 있지 않는 한 문제는 되지 않는다.

헤더가 아니더라도, 텍스트파일이기만 하면 다 포함할 수 있다. include하는 문서가 include한다면 그 문서도 include된다.

#define

#define 매크로명 실제값

소스의 모든 매크로명과 일치하는 부분을 찾아 실제값으로 치환한다. 같은 값을 반복해서 쓰기 힘들때 사용한다. 매크로는 중첩된다. 상수 뿐 아니라 함수 역시 치환해 사용할 수 있다. 여러 줄 일 경우 반드시 \를 뒤에 붙여 개행한다. 매크로는 단순하게 생각했을때와 결과가 다를 수 있으므로 사용에 주의해야 한다.

Leave a Reply