본문 바로가기
CS/C

쉽게 풀어쓴 C 언어 EXPRESS 개정 3판 챕터8. 함수

by 대니스 2025. 8. 7.

함수란?

함수(function)

- 함수는 특정 작업을 수행하는 명령어들의 모음에 이름을 붙이는 것

- 작업에 데이터를 전달받을 수 있으며, 작업이 완료된 후에는 작업의 결과를 호출자에게 반환한다.

- 함수를 이용하면 여러 번 반복해야 되는 처리 단계를 하나로 모아서 필요할 때 언제든지 호출하여 사용할 수 있다.

함수의 중요성

- 함수(function)는 프로그램을 구성하는 기본적인 구성 요소

- 함수는 한번 만들어지면 다른 프로그램에서도 재사용될 수 있으며 가독성이 증대되고, 유지관리도 쉬워진다.

 

함수의 종류

- 함수는 컴파일러에서 미리 작성하여서 제공하기도 하고, 프로그래머가 직접 작성할 수 있다.

 

라이브러리 함수(library function)

- 컴파일러에서 지원되는 함수들을 라이브러리 함수라고 한다.

- 프로그래머가 필요로 하는 다양한 기능을 제공하기 때문에 프로그래머는 보다 쉽게 프로그래밍을 할 수 있다.

- 라이브러리는 수학적인 계산, 문자열 조작, 입/출력 등을 수행하는데 필요한 풍부한 함수를 제공한다.

- 라이브러리 함수를 이용하는 편이 개발 기간을 단축시킨다.

 

사용자 정의 함수(user-defined function)

- 개발자가 직접 만들어서 사용하는 함수

 

함수 정의

함수 헤더

- 변환형과 함수 이름, 매개 변수(위의 함수에는 없다)를 합쳐서 함수 헤더라고 한다.

- 중괄호로 둘러싸인 함수 몸체로서 작업에 필요한 문장들이 들어간다.

반환형

- 함수가 처리를 종료한 후에 호출한 곳으로 반환하는 데이터의 유형

함수 이름

- 함수 이름은 식별자에 대한 규칙만 따른다면 어떤 이름이라도 가능하다

- 다만 소스 코드를 읽기 쉽게 하기 위하여 함수의 기능을 암시하는 이름을 부여하는 것이 좋다.

 

함수 몸체

- 함수 몸체에는 함수가 수행하는 작업에 필요한 문장들이 들어간다

- 함수 몸체에 포함될 수 있는 문장에는 아무런 제한이 없다.

- 함수 내에서도 변수도 정의하여 사용할 수 있으며 모든 제어 구조들도 사용할 수 있다.

- 함수 몸체 안에서 다른 함수들도 호출하는 것이 가능하다.

 

함수 호출

함수 호출(function call)

- 함수의 이름을 써주는 것

- 함수를 호출하게 되면 현재 실행하고 있는 코드는 잠시 중단되고, 호출된 함수로 이동하여서 함수 몸체 안의 문장들이 순차적으로 실행된다.

- 호출된 함수의 실행이 끝나면 호출한 위치로 되돌아가서 잠시 중단되었던 코드가 실행을 재개한다.

 

매개 변수와 반환값

- 일반적인 함수를 외부로부터 값들을 전달받는다.

- 처리 결과를 외부로 반환한다.

- 매개 변수와 반환값을 지정하여야 한다.



인수와 매개변수

- 인수와 매개 변수는 함수 호출 시에 데이터를 주고 받기 위하여 필요하다.

 

인수(argument)

- 호출 프로그램에 의하여 함수에 실제로 전달되는 값

매개 변수(parameter)

- 인수 값을 전달 받는 변수

- 함수를 정의할 때는 각 매개 변수에 대하여 자료형과 이름을 지정하여야 한다.

- 함수가 호출될 때마다 인수는 달라질 수 있다.

- 여기서 주의할 점은 매개 변수의 개수는 정확히 일치하여야 한다

- 인수와 매개 변수의 타입은 서로 일치하여야 한다.

반환값

반환값(return value)

- 함수가 호출한 곳으로 반환하는 작업의 결과값이다.

- 함수는 자신을 호출한 곳으로 값을 반환할 수 있다.

- 값을 변환하려면 return 문장 다음에 수식을 써주면 수식의 값이 변환된다.

- 인수는 여러 개가 있을 수 있으나 반환값은 하나만 가능하다.

- 반환형은 char, int, long, double 등이 될 수 있다.

- 만약 값을 반환하지 않는다면 void라고 표시한다. 만약 변환형을 명시하지 않으면 int형을 가정한다.

- 그러나 특별한 경우가 아니라면 반환형을 생략하면 안된다.

- 반환되는 값이 없다면 return 키워드 다음에 아무것도 써주지 않으면 된다. 또 한 가지 방법은 아예 return 문장을 사용하지 않는 것이다.

 

함수 원형

- 일반적으로 함수를 사용할 때는 미리 컴파일러에게 함수에 대한 정보를 알려야 한다.

- 따라서 항상 함수를 먼저 정의하고 나중에 사용하는 것이 원칙이지만 이렇게 하지 못하는 경우도 있다. 그런 경우에 함수 원형(function prototype)을 정의해주면 된다.

- 함수 원형은 함수의 이름, 매개변수, 반환형을 함수가 정의되기 전에 미리 알려주는 것이다.

- 함수 원형은 함수 헤더에 세미콜론(;)만을 추가한 것과 똑같다.

- 다만 함수 원형에서는 매개 변수의 이름은 적지 않아도 된다. 매개 변수의 자료형만 적으면 된다.

- 함수 원형을 사용하지 않는 방법은 비교적 단순한 프로그램에서만 가능한 방식으로, 표준적인 방법이 아니다. 따라서 항상 함수 원형을 사용하는 것이 좋다.

 

함수 원형과 헤더 파일

- 함수 원형들이 많이 정의되는 곳이 헤더 파일이다

- 간단한 경우에는 소스 파일의 시작 부분에 기술하지만 함수의 개수만 많으면 함수 원형을 헤더 파일에 저장하고 헤더 파일을 소스 파일에 포함시키는 것이 일반적이다.

 

라이브러리 함수(난수)

- 라이브러리 함수는 표준 입출력, 수학 연산, 문자열 처리, 시간 처리, 오류 처리, 데이터 검색과 정렬 이 있다.

- 일반적으로 라이브러리 함수의 원형을 개별적으로 포함하는 것이 아니라 원형이 들어 있는 헤더 파일을 포함시키면 된다.

 

난수 함수

난수(random number)

- 규칙성이 없이 임의로 생성되는 수이다.

- rand()는 의사 난수(pseudo random number)를 생성하는 함수이다.

- 의사 난수란 다음에 뭔가 나올지 모르는 진짜 난수가 아니라 초기값에 따라서 나오는 순서가 어느 정도 결정되어 있는 난수를 말한다.

- rand()의 원형은 stdlib.h에 정의되어 있다.

- 매번 난수를 다르게 생성하려면 시드(seed)라는 개념을 사용한다.

- 어떠한 값도 시드값이 될 수 있으나 많이 사용하는 겂은 예측이 불가능하면서 상황에 따라 변경되는 값이다. 그래서 많은 사람들이 사용하는 값은 현재 시각이다. 그 이유는 프로그램이 실행되는 시간은 다를 가능성이 많기 때문이다.

- 현재 시각은 보통 time()을 사용한다. 이것을 srand()라는 함수를 이용하여서 시드값으로 설정하면 된다.

 

라이브러리 함수(수학 함수)

- 수학 함수들에 대한 원형은 헤더파일 math.h에 있다.

- 수학 함수는 일반적으로 double형의 매개 변수와 반환값을 가진다.

floor()와 ceil() 함수

- floor()와 ceil() 함수는 각각 바닥과 천장 함수라고도 한다.

- 실수를 아래 정수 값으로 '밀어 내리거나', 다음 정수 값으로 '밀어서 올린다.'

fabs() 함수

- fabs()는 실수를 받아서 절대값을 반환한다.

 

pow()와 sqrt() 함수

- pow() 함수는 제곱값을 계산하고 sqrt() 함수는 값의 제곱근을 반환한다.

 

cos(double x), sin(double x), tan(double x)

- cos(double x), sin(double x), tan(double x) 함수들은 삼각 함수의 값을 계산한다.

 

라이브러리 함수(기타 함수)

함수를 사용하는 이유

소스 코드의 중복성을 없애준다.

- 가장 중요한 이유는 소스 코드의 중복을 막기 위해서이다.

- 작성된 함수는 여러 번 호출이 가능함으로서 중복을 최소화하여 프로그램을 간결하게 만들 수 있다.

 

한번 제작된 함수는 다른 프로그램을 제작할 때도 사용이 가능하다

- 소스 코드를 그대로 옮기기만 하면 사용할 수 있다.

 

복잡한 문제를 단순한 부분으로 분해할 수 있다.

- 함수를 사용하게 되면 개발 과정이 쉬워지고 보다 체계적이 되면서 유지보수도 쉬워진다는 것이다.

- 대규모의 프로그램을 개발하고 유지보수하기 위해서는 전체 프로그램이 하나의 덩어리로 되어 있는 것보다 작은 부분들로 나누어져 있는 것이 더 관리하기가 쉽다. 이것이 모듈(module)이다.

- 각 함수들은 특징적인 한 가지 작업(기능)만을 맡아야 한다.

- 소스 코드의 가독성이 높아진다.

- 함수 이름만 보아도 어떤 작업인지를 대략 알 수가 있어서 소스 코드를 다른 사람이 읽기 쉬워진다.