함수 (프로그래밍)
함수(function)는 수학에서 첫 번째 집합의 임의의 한 원소를 두 번째 집합의 오직 한 원소에 대응시키는 이항관계[1]라고 하며 프로그래밍에서는 수학과 비슷한 개념으로 하나의 특별한 목적의 작업을 수행하기 위해 독립적으로 설계된 코드의 집합이다.[2]
개요
함수는 수학에서 사용하는 의미와 비슷하게 프로그래밍에서는 소프트웨어의 특정한 동작을 수행하는 일정 코드 부분을 의미한다. 대부분의 프로그래밍 언어에서 지원하는 기능으로, 하나의 큰 프로그램을 여러 부분으로 나누어 주기 때문에 같은 함수를 여러 상황에서 여러 차례 호출할 수 있다.[3]
역사
1940년 대 컴퓨터의 초창기에는 2진수로 쓰여진 기계 언어만을 해석할 수 있었다. 그리고 프로그램 언어의 첫걸음인 어셈블리어 언어가 생기고 보다 친숙한 컴퓨터 언어인 고급 언어들이 생겨났다.
고급 언어는 사람이 알기쉽게 고급스러운 형식으로 표현되었던 언어이며 그 이후 소프트웨어 프로세스의 복잡성과 소프트웨어 공학이 전문분야로서 상대적으로 미성숙함으로 인해 여러 안 좋은 증상들이 나타났는데, 이것을 소프트웨어 위기라고 표현했다. 이 위기를 극복하고자 소프트웨어 공학 수단을 더 적극적으로 활용하는 방법으로 구조적 프로그래밍이라는 아이디어가 제안되었다.[4]
구조적 프로그래밍 이전에는 프로그램을 길게 늘여뜨러 놓은 코드였기 때문에 나열된 코드 여기저기를 옮겨다녀야 했으며 프로그램 내에 각 파드를 구분짓는 경계 또한 없었다. 프로그래밍 중 한 부분을 이동하려면 긴 코드 전체를 움직여야 하는 절차를 거쳤다.
구조적 프로그래밍이 등장하면서 코드를 단위로 구분지어주어 프로그램을 잘 짜여진 챕터로 구분지어 이전보다 용이하게 찾아 갈 수 있도록 만든 것이다. 하지만 절차를 표준화하고 보다 예측가능한 형태로 쓰일 수 있게 만들어 보편화 된것은 구조적 프로그래밍 이후이다. 복잡한 데이터 세트를 하나의 그룹 혹은 구조로 묶어주는 방식으로 사용되어 이전에 했던 방식들 처럼 원시적인 데이터 형으로 이루어진 수백 개의 배열을 남발하기 보다는 여러 개의 데이터형식을 하나의 구조로 통합한 뒤 어디서든 손 쉽게 참조하도록 만들었으며 이것이 현재 프로그래밍에서의 함수이다. [4]
특징
함수는 하나의 로직을 재실행 할 수 있도록 하는것으로 코드의 재사용성을 높여준다. 함수는 연산이나 논리에 직접적으로 관여하기 보다는 방대한 양의 코드를 줄여주고, 유지보수를 쉽게해주며, 에러가 발생하는 정도를 줄여주는 것이다.[5] 객체지향에서는 함수를 메소드라고 하며 특정 작업을 하는 일련의 코드를 하나의 이름으로 묶어 놓은 코드의 집합으로 여러 개의 문장을 하나로 묶어주는 특징을 가지고 있다.
기능
함수는 한번 정의하면 몇 번이든 실행할 수 있어 반복적인 작업을 처리할 때 유용하다. 또한 함수를 이용하여 프로그램을 구조적, 논리적으로 만들 수 있다. 프로그램을 여러 개의 함수로 나누어 작성하게되면, 모듈화로 인해 전체적인 코드의 가독성이 좋아지며 코드의 반복 사용을 줄일 수 있다. 그리고 프로그램에 문제가 발생하거나 기능을 변경할 때 손쉽게 유지보수를 하기 좋으며 단위 테스트를 이용해 함수의 동작을 검증 할 수 있다.[6]
형태
함수의 형태는 반환 자료형, 함수 이름, 인수 목록으로 나뉘며 몸체는 '{}'괄호를 사용한다.
int main () { //반환 자료형 + 함수 이름 + 인수목록 + { return 0; //반환값 }
기본적인 형태의 예시를 들면 아래와 같다.
void func (){ //반환값X, 매개변수X }
반환 자료형이 void의 경우 반환값이 없으며 매개변수는 추가하거나 쓰지 않아도 상관없다.
void func (int a){ //반환값X, 매개변수O }
위와 같이 매개변수를 사용할 수 있다.
void func (int a, int b){ //반환값X, 매개변수O }
매개변수를 사용 할 때 두 개 이상을 사용할 수 있지만 사용시 변수명이 중복되서는 안된다.
반환 자료형
반환 자료형이란 메인함수의 사용에서 return 0; 부분을 보면 0을 반환한다는 말인데 정수형을 반환하므로 여기서 int로 쓰였다.
자료형은 정수형, 실수형, 나열형, 무치형으로 나누어지는데 이는 아래 표와 같다.
구분 자료형 범위 바이트 정수형 char unsigned char
-128 ~ 127 0 ~ 255
1(8) 1(8)
short int
long
unsigned short
unsigned int
unsigned long
-32768 ~ 32767 -2,147,483,648 ~ 2,147,483,647
-2,147,483,648 ~ 2,147,483,647
0~65535
0~4,294,967,295
0~4,294,967,295
2(16) 4(32)
4(32)
2(16)
4(32)
4(32)
실수형 float double
8.4X10^-37 ~ 3.4X10^38 2.2X10^-308 ~ 1.8X10^308
4(32) 8(64)
나열형 enum 정수를 대신하여 사용하는 별명, int형의 크기 무치형 void 실제 자료는 없음을 명시적으로 선언
반환 자료형은 변형이 가능하며 반환값 또한 반환 자료형과 동일해야한다.
int func (){ //반환값O, 매개변수X return 0; }
int형의 경우 정수형이기 때문에 return 반환값 또한 정수형으로 사용한다.
double func (){ //반환값O, 매개변수X //반환 자료형은 변형이 가능하며 반환값 또한 반환 자료형과 동일해야한다. return 1.2345678; }
double형의 경우 실수형이기 때문에 return 반환값 또한 실수형으로 사용한다.
종류
함수의 종류는 이미 만들어 놓은 함수인 라이브러리 함수와 사용자가 정의하는 사용자 정의 함수가 있다.
각주
참고 자료
- Dev Cristoval, <추상 클래스(Abstract Class)>, 《개인블로그》, 2019-08-12
- 위키백과, <함수>, 《위키피디아》
- 위키백과, <함수(프로그래밍)>, 《위키피디아》
- 이명헌의 경영과 투자, <프로그래밍 언어의 간단한 역사>, 《개인블로그》, 2020-07-02
같이 보기