검수요청.png검수요청.png

"함수 (프로그래밍)"의 두 판 사이의 차이

위키원
이동: 둘러보기, 검색
잔글
잔글 (참고자료)
209번째 줄: 209번째 줄:
 
{{각주}}
 
{{각주}}
  
==참고 자료==
+
==참고자료==
 
* Dev Cristoval, 〈[https://data-make.tistory.com/212 추상 클래스(Abstract Class)]〉, 《개인블로그》, 2019-08-12
 
* Dev Cristoval, 〈[https://data-make.tistory.com/212 추상 클래스(Abstract Class)]〉, 《개인블로그》, 2019-08-12
 
* 위키백과, 〈[https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98 함수]〉, 《위키피디아》
 
* 위키백과, 〈[https://ko.wikipedia.org/wiki/%ED%95%A8%EC%88%98 함수]〉, 《위키피디아》

2020년 8월 28일 (금) 13:21 판

함수(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로 쓰였다.

자료형은 정수형, 실수형, 나열형, 무치형으로 나누어지는데 이는 아래 표와 같다.[7]

구분 자료형 범위 바이트
정수형 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 반환값 또한 실수형으로 사용한다.

return은 결과를 반환하는 것 외에 함수를 중지시키는 역할도 한다.

int test() {
    return 1; //출력
    return 2; //미출력
    return 3; //미출력
}

int main() {
    int a = test();
    printf("%d", &a);
}

위와 같이 작성되어 있을 때 1만 출력되고 2와 3은 출력되지 않는다. 그 이유는 return이 결과를 반환하는 동시에 함수를 중지시키고 1이라는 값을 반환하기 때문에 2 이하의 값은 출력하지 않게된다.

매개 변수

매개변수는 함수로 유입되는 입력 값을 의미한다. 어떤 값을 인자로 전달하느냐에 따라서 함수가 반환하는 값이나 동작방법을 다르게 할 수 있다.

int test(int a) {
    return a;
}

int main() {
    int result;
    
    result = test(10);
    printf("%d", &result);
}

이와 같이 코드가 작성됐을 때의 출력은 10이 된다. test 함수의 매개 변수로 10이 들어가 함수에서 10을 반환했기 때문이다. 이렇게 하나의 매개 변수를 가질 수 있으며 추가하고 싶다면 더 추가해서 사용해도 상관없다. 단, 매개 변수의 이름은 서로 달라야 한다.[5]

종류

함수의 종류는 프로그램의 시작과 종료를 나타내는 함수인 주함수 main()이 있으며, 이미 만들어 놓은 함수인 라이브러리 함수와 사용자가 정의하는 사용자 정의 함수가 있다.[8]

사용자 정의 함수

사용자가 구현하고 싶은 기능을 구현하는 것으로 문제를 분석하여 필요한 기능으로 분류해 기능별로 코딩하고자 할 때 만드는 함수이다.[8] 형태는 위에 작성된 것과 같이 사용한다.

void func(int a) { 내용 }
반환자료형 함수이름(인수목록) { 내용 }

라이브러리 함수

라이브러리 함수는 사용자가 직접 정의한 것이 아닌 이미 개발툴에서 만들어져있는 함수이다. 사용자가 직접 만들지 않고 쉽게 가져다 쓸 수 있는 기능들을 도서관에서 책을 꺼내 읽듯이 만들어 놓은 것이라고 볼 수 있다.[9] 외부 파일에 만들어져있는 함수를 불러오는 형식으로 각 언어마다 라이브러리 함수의 내용도 다르고 불러오는 방법 또한 다르다. 대표적인 C언어의 경우 #include <헤더파일> 형태로 불러오며 자바의 경우 import 형태를 이용해 불러온다. 라이브러리 함수들은 이미 작성이 완료되어 있으므로 사용 방법만 찾아서 활용하면 된다.

활용

함수는 각 프로그래밍 언어에 따라 정의 방법과 호출이 다르다. 대부분의 정의 방법은 반환 자료형과 함수이름에 매개변수 목록을 작성하고 함수의 몸체에 내용을 작성하여 정의한다.

이 때 함수는 여러 개의 매개변수를 사용할 수 있지만 반환하는 값은 하나만 가능하다.

함수의 정의는 다음과 같이 할 수 있다.

#include <stdio.h>

int sum(int a, int b) {
    return a+b;
}

int main() {
   int result;

   result=sum(10, 20);
   printf("%d", &result);

}

sum이라는 함수를 정의해주고 main함수에서 result라는 변수를 만든다. result는 sum의 매개변수로 10과 20을 넣어 함수를 호출해 result 변수에 10과 20을 더한 30을 저장하게 되고 printf라는 라이브러리 함수를 호출해 result 변수 내의 int형 데이터를 출력한다.

함수정의1.PNG

또한 함수가 주함수보다 밑에 정의되어있는 경우에는 아래 정의되어있다는 표시를 해주어야하기 때문에 주함수 윗부분에도 정의를 해주어야한다.

함수정의방법2.PNG


각주

  1. 위키백과, 〈함수〉, 《위키피디아》
  2. TCPSCHOOL, 〈함수의 정의〉, 《개인블로그》
  3. 위키백과, 〈함수(프로그래밍)〉, 《위키피디아》
  4. 4.0 4.1 이명헌의 경영과 투자, 〈프로그래밍 언어의 간단한 역사〉, 《개인블로그》, 2020-07-02
  5. 5.0 5.1 프로그래밍 언어들, 〈함수〉, 《Opentutorials.org》, 2013-05-22
  6. codedragon, 〈함수(Function) - 함수 종류, 함수의 기본형태〉, 《개인블로그》, 2019-08-12
  7. 딴지마인드, 〈C언어의 기본 자료형〉, 《개인블로그》, 2011-05-10
  8. 8.0 8.1 늅이, 〈C언어 함수(function)의 구성, 정의 기초 개념잡기 - 함수 종류, 함수의 기본형태〉, 《개인블로그》, 2017-03-07
  9. SLL, 〈C언어 라이브러리함수〉, 《개인블로그》, 2015-09-08

참고자료

같이 보기


  검수요청.png검수요청.png 이 함수 (프로그래밍) 문서는 프로그래밍에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.