ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [C] 함수
    C 2023. 4. 13. 00:10

     

    함수

    • 프로그램에서 원하는 특정한 작업을 수행하도록 설계된 독립된 프로그램 단위
    • 필요한 입력을 받아 원하는 어떤 기능을 수행한 후 결과를 반환(return)하느 프로그램 단위
    • 라이브러리 함수(library function)와 사용자 정의 함수(user defined function)로 구분
      • 라이브러리 함수 : 이미 개발환경에 포함되어 있는 함수
      • 사용자 정의 함수 : 필요에 의해서 개발자가 직접 개발하는 함수

     

    • C 프로그램
      • 여러 함수로 구성되는 프로그램
      • 최소한 main() 함수와 필요한 다른 함수로 구성되는 프로그램
        • 함수 main() : 이름이 지정된 함수로서 프로그램의 실행이 시작되는 특수한 함수

     

    • C 프로그램 main() 함수
      • 첫 줄에서 시작하여 마지막 줄을 마지막으로 실행한 후 종료
      • 사용자가 직접 개발한 함수를 사용하기 위해서는 함수선언(function declaration), 함수호출(function call), 함수 정의(function definition)가 필요하다.
      • 하나의 응용 프로그램은 하나의 main() 함수와 여러 개의 다른 함수로 구성
      • 필요에 따라 여러 소스 파일로 나누어 프로그래밍 가능

     

     


    절차적 프로그래밍

    • 하나의 프로그램을 여러 함수로 나누어 프로그래밍
    • 문제 분해(problem decomposition) : 하나의 프로그램을 작은 단위의 여러 함수로 나누는 것, 문제 해결의 한 방법
    • 절차적 프로그래밍(procedural programming) 방식
      • 함수 중심의 프로그래밍 방식
      • 모듈화 프로그램(modular program) 또는 구조화된 프로그램(structured program)
        • 적절한 함수로 잘 구성된 프로그램

     

    함수 정의

    • 함수머리(function header)함수몸체(function body)로 구성

     

    • 함수머리(function header)
      • 반환형과 함수이름, 매개변수 목록으로 구성
      • 반환형 : 함수 결과값의 자료형
      • 함수 이름 : 식별자의 생성규칙을 따름.
      • 매개변수 목록 : 자료형 변수이름의 쌍으로 필요한 수만큼 콤마로 구분하여 기술

     

    • 함수몸체(function body)
      • {···}와 같이 중괄호로 시작하여 중괄호로 종료 
      • 함수가 수행해야 할 문장들로 구성
      • 마지막은 대부분 결과값을 반환하는 return 문장으로 종료
      • 결과값이 없다면 생략 가능
    반환형 함수이름 (매개변수 목록)		# 함수머리
    {
    	···				# 함수몸체	
        여러 문장들;
        
        return (반환연산식);
    }

     

     

    • 이름 add2로 두 정수의 합을 구하는 함수를 정의
      • 함수머리는 int add2(int a, int b)로 쓸 수 있으며, 함수몸체는 { int sum = a + b; return (sum); }으로 구현할 수 있다. 
      • 함수이름에 이어 나오는 (int a, int b)를 매개변수(parameter variable)라 한다.
      • 매개변수가 정수이므로 반환형은 int로 하고, 함수이름은 add2, 매개변수 목록은 2개이므로 int a, int b로 구성한다.
      • 함수몸체에서는 매개변수 이름이 a, b이므로 이들의 합을 구하여 반환한다. 간단히 return (a+b);의 한문장으로 가능하다.
    int add2(int a, int b)
    {
        int sum = a + b;
    
        return (sum);
    }
    
    int add2(int a, int b)
    {
        return (a + b);
    }
    int findMax(int a, int b)
    {
    	int max = a > b ? a : b;
        
        return max;
    }

     

     

    반환형과 return

    • return : 함수에서 반환값을 전달하는 목적과 함께 함수의 작업 종료를 알리는 문장
    • 함수가 반환값이 없다면 반환형으로 void를 기술
    return (반환연산식);
    
    return 0;
    return (a + b);
    return 2 * PI * r;
    return ;

     


     

    함수원형 (function prototype)

    • 함수를 선언하는 문장
    • 함수원형은 함수선언으로 변수선언과 같이 정의된 함수를 호출하기 전에 반드시 선언
    • 구문 : 함수머리에 세미콜론을 넣은 문장
    • 함수원형 구문에서 매개변수의 변수이름은 생략할 수 있다.
      • int add2(int, int);
    반환형 함수이름 (매개변수 목록);
    
    int add(int a, int b);
    int add(int, int);
    int findMin(int x, int y);
    int findMin(int, int);

     


    함수의 정의와 호출

    #include <stdio.h>
    
    # int add(int a, int b);
    
    int main(void) {
    
    	int a = 3, b = 5;
    	int add(int a, int b);	# int add(int, int)도 가능
    
    	# 위 함수원형이 없으면 함수 호출에서 경고 발생
    	int sum = add(a, b);
    	printf("합: %d\n", sum);
    
    	return 0;
    }
    
    # 함수 add의 함수 구현 또는 함수 정의 부분
    int add(int a, int b)
    {
    	int sum = a + b;
    
    	return (sum);	// 괄호 생략 가능
    }
    
    # 위 main() 함수에서 호출이 없으므로 이 함수 구현은 실행되지 않음
    int findMin(int x, int y) {
    	
    	int min = x < y ? x : y;
    
    	return (min);
    }
    합: 8

     

     


     

    매개변수

     

    • 함수 매개변수 (parameter)
      • 함수를 호출하는 부분에서 함수몸체로 값을 전달할 목적으로 이용
      • 함수정의에서 매개변수는 자료형과 변수명의 목록으로 나타내며 필요 없으면 키워드 void를 기술

     

    • 반환값
      • 함수를 호출하는 부분에서 함수가 작업을 수행한 후, 다시 함수를 호출한 영역으로 보내는 결과값

     

    형식매개변수와 실매개변수

     

    • 형식매개변수(formal parameters)
      • 함수 정의에서 기술되는 매개변수 목록의 변수
      • 함수 내부에서만 사용될 수 있는 변수
    • 실매개변수(real parameters)실인자
      • 함수를 호출할 때 기술되는 변수 또는 값
      • 실인자(real argument) 또는 인자(argument)라고 부름
      • 실인자는 상수와 변수, 함수호출, 그리고 수식도 가능
    • 일반적으로 매개변수, 인자, 인수 구분하지 않고 사용하는 경우도 많음

     

    • 값에 의한 호출(call by value)
      • 함수가 호출되는 경우 실인자의 값이 형식인자의 변수에 각각 복사된 후 함수가 실행된다.
      • 함수에서 일반 매개변수의 값을 수정하더라도 함수를 호출한 곳에서의 실매개변수의 값은 변화되지 않는 특징
      • 형식인자 a, b와는 전혀 다른 변수

     

    int findMax(int a, int b)	# (형식매개변수)
    {
    	int max = a > b ? a : b;
        return max;
    }
    
    int main(void){
    
    	int a = 3, b = 5;
    	int max = findMax(a, b);	# (실매개변수)
        
    	int max = findMax();		# 오류발생
    	int max = findMax(2);		# 오류발생
    	int max = findMax(2.4);		# 오류발생
    	int max = findMax(2.4, 6.8);	# 오류발생
        
    }

     

     


     

     

    매개변수로 배열 사용

     

    • 배열이름으로 전달
      • 함수의 매개변수로 배열을 전달하면 한 번에 여러 개의 변수를 전달하는 효과

     

    • 함수 sum() : 실수형 배열의 모든 원소의 합을 구하여 반환하는 함수
      • 형식매개변수는 실수형 배열 double ary[]와 배열크기 int n
      • 첫 번째 형식매개변수에서 배열 자체에 배열크기를 기술하는 것은 아무 의미가 없다. 그러므로 double ary[5] 보다는 double ary[]라고 기술하는 것을 권장
      • 실제로 함수 내부에서 실인자로 전달되는 배열크기를 알 수 없으므로 배열크기를 두 번째 인자로 사용한다.
    # 둘 다 사용 가능
    double sum(double ary[], int n);
    double sum(double[], int);
    
    	···
    double data[] = {2.3, 3.4, 4.5, 5.6, 6.7}
    	···
        ...sum(data, 5)		# 함수 호출 시 배열이름으로 배열인자를 명시
    
    double sum(double ary[], int n) 
    {
    	double total = 0.0;
    	for (int i = 0; i < n; i++)
    		total += ary[i];
    
    	return total;
    }

     

     

    배열을 매개변수로 사용하는 방법

    • 함수크기를 제외한 int ary[]로 기술
      • 배열의 크기도 매개변수로 함께 전달
      • 함수 이름인 point 또는 &point[0]을 사용

     

    # 실매개변수인 point와 &point[0] 모두 형식매개변수인 int ary[]의 값이다.
    printf("함수 sumary() 호출로 구한 합은 %d\n", sumary(point,	aryLength));
    printf("함수 sumary() 호출로 구한 합은 %d\n", sumary(&point[0],	aryLength));
    
    # 배열의 크기는 의미가 없어 어떤 수를 써도 상관없으므로 생략하고 배열크기를 다른 인자로 사용
    int sumary(int ary[], int SIZE)
    {
    	···
    }
    int sumary(int ary[10], int SIZE)
    {
    	···
    }

     

     

    다차원 배열을 함수 인자로 이용하는 방법

    • 함수원형과 함수정의의 헤더에서 첫 번째 대괄호 내부의 크기를 제외한 다른 모든 크기는 반드시 기술

     

     

     

     

     

     

     

     

    'C' 카테고리의 다른 글

    [C] 변수 유효범위①  (0) 2023.04.26
    [C] 재귀함수와 라이브러리 함수  (0) 2023.04.13
    [C] 배열②  (0) 2023.04.11
    [C] 배열①  (0) 2023.04.05
    [C] 반복  (0) 2023.04.03
Designed by Tistory.