함수 (컴퓨터 과학)

위키백과, 우리 모두의 백과사전.
61.75.63.67 (토론)님의 2015년 6월 2일 (화) 17:15 판 (→‎구조)

함수(function), 서브루틴(subroutine), 루틴(routine), 메서드(method), 프로시저(procedure)는 소프트웨어에서 특정 동작을 수행하는 일정 코드 부분을 의미한다.

함수는 대부분의 프로그래밍 언어에서 지원하는 기능으로, 하나의 큰 프로그램을 여러 부분으로 나누어주기 때문에 같은 함수를 여러 상황에서 여러 차례 호출할 수 있으며 일부분을 수정하기 쉽다는 장점을 가진다.

구조

함수를 지원하는 일반적인 프로그래밍 언어에서는 다음과 같은 구조를 갖는다.

  • 어떤 루틴에서 함수를 호출한다. 이때 함수가 가지는 특정 변수에 값을 전달하기도 하며, 이 특정 변수를 매개변수(parameter)라고 하며 전달되는 값을 인자(argument)라고 부른다.
  • 함수가 호출되어 계산을 수행한다.
  • 함수가 종료되고 실행 흐름이 원래의 루틴으로 돌아온다. 경우에 따라서는 함수가 계산하여 반환된 값(반환값, return value)을 원래의 루틴에서 사용하기도 한다.

일부 프로그래밍 언어에서는 함수와 서브루틴을 구분하기도 한다. 파스칼이나 포트란과 같은 언어는 반환값이 없는 경우를 서브루틴, 반환값이 있는 경우를 함수로 부른다. 반면 C 등의 언어에서는 함수와 서브루틴이 동의어이다.

함수가 결과값을 반환하는 것 이외에 외부에 영향을 주는 작동을 할 경우 부작용이 있다고 부른다. 부작용이 없는 함수를 순수한 함수로 부르며, 하스켈과 같은 순수 함수형 프로그래밍에서는 모든 함수가 순수한 함수이다.

장점

  • 하나의 큰 프로그램을 여러 부분으로 분리함으로써 구조적 프로그래밍이 가능하다.
  • 같은 코드를 계속 쓰지 않음으로서 프로그램의 용량을 줄일 수 있고, 다른 부분이나 다른 프로그램에서 같은 코드를 사용할 수 있다.
  • 함수의 기능과 내부 구현을 분리하는 캡슐화가 이루어진다.

언어별 지원

비주얼 베이직

비주얼 베이직은 함수를 성격에 따라 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++, 자바 등의 경우, 반환형과 함수 이름은 같아도 인자 목록의 개수나 자료형이 다르면 호출할 때 사용한 인자 목록에 따라 적절한 함수가 호출되도록 컴파일되는 오버로딩 함수를 지원한다.