함수 (전산학)
위키백과 ― 우리 모두의 백과사전.
컴퓨터과학에서 함수(function)란 특정 계산을 수행하는 독립된 프로그램을 말한다. 함수라는 것은 특정 인자를 받아 결과값을 반환하는 개체를 말하기 때문에 서브루틴(subroutine)이라 해야 옳지만 대개 함수라고 한다. 메소드(method), 프로시저, 서브프로그램이라고도 한다. 큰 프로그램을 기능상으로 분류하여 기능을 고치거나 디버그하기 쉬우며 재귀 호출(스택)을 이용한 기능을 사용할 수도 있다.
목차 |
[편집] 함수의 종류
많은 프로그래밍 언어에서는 값을 반환하는 것과 반환하지 않는 것으로 구분하며, 전자를 함수 혹은 함수형 서브프로그램, 후자를 서브루틴 혹은 프로시저라고 부른다. 반면에 C/C++, LISP와 같으면 반환형을 잡는 방법에 따라 구별되며 형식에서 구분하지는 않는다.
[편집] 1류 함수(First-class functions)
- 이 부분의 본문은 1류 함수입니다.
어떤 프로그래밍 언어에서 실행 시간에 함수를 새로 생성·자료 구조에 함수를 저장하거나 함수 자체를 함수의 반환값으로 사용하는 것이 가능할 경우, 그 언어는 1류 함수를 지원한다고 말한다. 이러한 언어에서는 함수가 일반 자료형과 구분되는 어떤 특수한 개념이 아닌 일반 자료와 동일하게 다루어질 수 있다.
[편집] 고차 함수(Higher-order functions)
- 이 부분의 본문은 고차 함수 (전산학)입니다.
위의 1류 함수와 비슷한 개념이나, 보다 수학적인 관점에서 함수에 대한 연산이 가능한 함수를 뜻하는 용어이다.
[편집] 순수 함수
- 이 부분의 본문은 함수형 프로그래밍입니다.
어떤 함수가 부수효과를 가지지 않을 때 그 함수를 순수 함수라고 부른다. 이러한 특징을 갖는 언어들을 참조 투명성을 지원한다고 하며, 그러한 함수들은 그 자체로 스레드 안전하다.
[편집] 함수 사용의 장점
- 같은 코드를 계속 쓰지 않음으로써 프로그램의 용량을 줄일 수 있다.
- 다른 부분, 더 나아가 다른 프로그램에서 같은 코드를 사용할 수 있다.
- 복잡한 문제를 푸는 알고리즘을 각 단계로 분리할 수 있다.
- 프로그램의 가독성을 높여 기능을 수정하거나 디버그하기 쉽다.
- 프로그램의 일부만 없애거나 다른 기능을 추가하기 쉽다.
[편집] 함수의 요소
- 고유 이름
- 반환 자료형
- 인자 목록 : 호출할 때의 입력값과 자료형 (단독 연산인 경우 없음)
- 호출되면 실행할 코드 : 보통 함수의 몸체라고 불린다.
- 반환값(출력값)
[편집] 정의역과 공역
프로그래밍 언어에 따라 인자의 자료형과 리턴값의 자료형에 의해 정의역과 공역이 정해진다. 정의역과 공역은 지정된 자료형으로 제한되는 것이며, 치역은 정의역에 따라 함수가 실제로 만들어내는 결과값들이 된다.
[편집] 언어별 성격
[편집] 비주얼 베이직
비주얼 베이직은 함수를 성격에 따라 Sub와 Function으로 구분하는데, Sub은 독립적으로 프로그램에 접근하며 값을 반환하지 않으나 Function은 특정 값을 반환할 수 있다. Sub은 호출한다고 하며 Call()을 사용하고, Function은 값을 대입하도록 한다. Function형 함수에 특별히 자료형을 부여할 필요는 없다.
이를테면 다음과 같다.
Private Sub Note () Print ("안녕하세요") End Sub Private Sub frmMain_Load () Call Note () End Sub
frmMain이 로드되면 호출된 Note()가 '안녕하세요'를 출력한다. 반면에,
Private Function Note () Note = "안녕하세요" End Function Private Sub frmMain_Load () Dim Text as String Text = Note () Print (Text) End Sub
이 프로그램에서는 frmMain이 로드되면 호출한 Note가 반환한 '안녕하세요'를 출력하게 된다.
[편집] C, C++
C와 C++에서는 서브루틴과 함수를 구별하는 제약 조건이 그다지 까다롭지 않다. 대신 반환형은 항상 일치해야 하며, 반환하지 않는 함수는 void로 선언된다. 추가된 함수를 메인 함수보다 나중에 놓는 경우에는 함수의 원형(프로토타입)을 선언해야 한다.
아래는 인자도 받지 않고 아무런 반환값도 없는 함수의 예이다.
void my_func(void) { // do something }
다음은 함수의 원형이 어떻게 선언되는지 보여준다. 보통 함수의 반환형, 이름, 인자 목록을 그대로 쓰되 중괄호로 묶인 코드 대신 세미콜론으로 끝내는 형식이다.
// header int my_func(char* your_name); // code int my_func(char* your_name) { // ... return x; }
이 외에 C++, 자바 등의 경우, 반환형과 함수 이름은 같아도 인자 목록의 개수나 자료형이 다르면 호출할 때 사용한 인자 목록에 따라 적절한 함수가 호출되도록 컴파일되는 오버로딩 함수를 지원한다.

