본문 바로가기

Computer Engineering

[c] 0x0D 함수(Function)

From Evernote:

[c] 0x0D 함수(Function)

프로젝트 + 설날 크리로 인해서 포스팅 정리를 못했다.
그렇다고 밀린것 부터 하자니 양이 너무나 방대한 관계로 일단은 오늘 배운 것 부터 정리해보기 시작했다.

오늘은 '함수'에 대해서 알아보자!!

일단 함수라는 단어(?)가 무슨말인지 알아봅시다~~!
함수 = 각각의 기능을 이야기하는 것이다.

▲이렇게 이야기하면 너무 쉬워보일 수 있으니 조금 더 자세하게 이야기하자면
1. 독립적인 일을 수행하는 프로그램의 한 단위 ( 비슷한 말로 '모듈' 이 있다.)
2. 프로그램을 관리하기 용이하다.
3. 반복적인 구문을 쉽게 처리할 수 있다.

함수가 C언어에서 어떻게 이루어져있는지 확인해보자!!

return type 함수명 (함수) //함수의 머리부분(head)
{
return 값; //함수의 몸체(body)
}

return type : 'return 값'의 자료형, return 값을 포괄할 수 있는 것으로 생각하면 된다.

우리가 그 동안 많이 사용한 main() 함수를 예로 들어서 살펴보자.

int main()
{
return 0;
}

main() 함수 : 시작함수라고 할 수 있다. 전체적인 흐름을 나타내고 여러 함수를 이용해서 조립을 하는 역할을 한다.
▲ 에서는 return type 이 int 이다. 그 결과 retrun 값이 0 인 것을 확인할 수 있다.

여기서 잠깐!! 만약 return 값이 콜라, 사이다, 환타 일 때 return type 은 무엇이라고 할 수 있을까?
=> 바로 음료수가 return type 이라고 할 수 있는 것이다.

그리고 그 동안 이야기하지 않은 type 중에 'void'라는 녀석이 있다.

사전에서 'void'를 찾아보면 '빈 공간','아무것도 없는...' 이라는 뜻을 갖고 있는데
이 void 를 C언어에서는 return값이 없다는 것을 나타낸다.
굳이 표현을 하자면 'return ;' 이렇게 소스에서 적어주면 된다.

이제 함수가 무엇인지 알았으니 함수가 실제 소스에서 어떻게 사용되는지 보자.

함수정의 : 실제적인 기능만 구현해 놓은 것이다. 문제가 생겼을 때에 확인하는 Black Box라고 할 수 있다. 

함수호출 : 기능이 필요할 때 호출하는 것이다. 특히 반복적인 기능이 있을시에 유용하게 사용할 수 있다.

함수선언 : 정보를 제공하는 역할을 한다. main() 함수 전에 입력해서 가독성을 UP , 함수정의와 헷갈려하지 않도록...

이렇게 말로만 적어 놓으면 이게 무슨 말인가? 라고 생각할 수 있다. 그래서 예제를 통해서 확인해보자.

간단한 연산을 하는 예제 소스코드이다.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

// 함수 선언 
void largeNum();    //최대수 구하기
void Z_GOB();    // 제곱수 구하기
void FactorialNum();    //팩토리얼수 구하기
void rootNum();    //제곱근 구하기
void Just_Z_GOB();    //거듭제곱 구하기
void onlyNum();    //절대값 구하기

int main()
{
  int choice;
  while(1){
    printf(
  "\n\n\t\t** 메뉴를 선택해 주세요**\n\n"
  "-------------------------------------------------\n"
  "\t\t1. 최대값 구하기\n"
  "\t\t2. 제곱수 구하기\n"
  "\t\t3. 팩토리얼수 구하기\n"
  "\t\t4. 제곱근 구하기\n"
  "\t\t5. 거듭제곱 구하기\n"
  "\t\t6. 절대값 구하기\n"
  "\t\t0. 프로그램 종료\n"
  "메뉴 번호를 입력 [    ]\b\b\b\b"
  );

    scanf("%d",&choice);
    system("clear");
    switch(choice){
    case 0 :
      printf("프로그램을 종료합니다.\n");
      exit(0);
     // 함수 호출 
    case 1 :    largeNum();    break;
    case 2 :    Z_GOB();    break;
    case 3 :    FactorialNum();    break;
    case 4 :    rootNum();    break;
    case 5 :     Just_Z_GOB();    break;
    case 6 :    onlyNum();    break;    

    }
  }

  return 0;
}

// 함수 정의
void largeNum(){
  int one,two, result;
  printf(
"\n\n\t\t** 두 수 중 큰 수를 구하기 **\n\n"
"-------------------------------------------------\n"
"두 정수를 입력 : "
);
  scanf("%d %d",&one,&two);
  if ( one >= two){
    result = one;
  } else result = two;

  printf ("%d와 %d중 큰 수는 %d입니다.\n",one,two,result);  
}

void Z_GOB(){
  int one, result;
  printf(
"\n\n\t\t**제곱수를 구하기 **\n\n"
"-------------------------------------------------\n"
"정수를 입력 : "
);
  scanf("%d",&one);
  result = one * one;
  printf ("%d의 제곱수는 %d입니다.\n",one,result);  
}

void FactorialNum(){
  double one, result=1, start;
  printf(
"\n\n\t\t**팩토리얼수를 구하기 **\n\n"
"-------------------------------------------------\n"
"정수를 입력 : "
);
  scanf("%lf",&one); 

  for( start=one; start>=1; start--){
    result = start * result;
    if (start != 1) printf("%.f * ",start); 
    else printf("1\n");
  }
  printf ("%.f의 팩토리얼수는 %.f입니다.\n",one,result);  
}

void rootNum(){
  double one, result;
  printf(
"\n\n\t\t**제곱근 수를 구하기 **\n\n"
"-------------------------------------------------\n"
"정수를 입력 : "
);
  scanf("%lf",&one); 
  result = sqrt(one);
  printf ("%.f의 제곱근 수는 %.2f입니다.\n",one,result);  

}

void Just_Z_GOB(){
  double result=1;
  int start,one, two;
  printf(
"\n\n\t\t**거듭제곱근 수를 구하기 **\n\n"
"-------------------------------------------------\n"
"두 정수를 입력(ex 2^3 ==> 2 3) : "
);
  scanf("%d %d",&one, &two); 

  for(start=1; start<=two; start++){
    result = one*result;
  }
  printf ("%d의 %d거듭제곱 수는 %.f입니다.\n",one,two,result);  

}

void onlyNum(){
  int one, result;
  printf(
"\n\n\t\t**절대값을 구하기 **\n\n"
"-------------------------------------------------\n"
"정수를 입력 : "
);
  scanf("%d",&one);
  if (one < 0) result = -1*one;
  else result = one;
  printf ("%d의 절대값은 %d입니다.\n",one,result);  
}

예제를 통해서 함수 정의, 호출, 선언이 무엇인지 좀 더 구체적으로 알 수 있었을 것이다.
위의 소스코드에서 보면 onlyNum , largeNum 이렇게 함수명을 적었는데 함수명을 적을 때에는 크게 두 가지 방식으로 사용된다!!
- Pascal : 시작단어 대문자, 연결단어 대문자
- Camel : 시작단어 소문자, 연결단어 대문자
=> 두 가지 방식이 있는데 두 방식 모두 연결단어로 대문자를 사용하는 이유는 여러개의 단어를 사용시에 대문자를 기점으로 하면 읽기 편하기 때문이다.

그리고 함수안을 보면 공통적으로 one, result 라는 변수가 나온다.
이와 같이 { } 안에 묶어있는 변수(함수 안에 있는 변수)를 지역 변수(Local Variable) 또는 자동 변수(Auto Variable)이라고 할 수 있다.
반면에 choice 처럼 함수 밖에 존재하는 변수는 전역 변수(Global Variable)이라고 하며 어디에서나 사용가능하다.

그리고 C언어를 처음접하면서 궁금했던 점 중에 하나.
항상 stdio.h 를 적는데 무엇인가 했는데 ***.h 는 헤더파일로 정보를 제공하는 파일이다. 이 부분에 우리가 사용하는 printf 나 scanf 같은 함수가 선언되어있는 것이다.
그래서 compile 시에 이 부분을 확인해서 논리적인 검사를 해준다고 한다.
그렇다면 함수 선언만 해주었는데 어떻게 사용될수 있을까? 라는 생각을 할 수 있다.
이 궁금증에 대한 답은 링킹(Linking) 시에 ***.lib 파일에서 실제 함수를 연결해 주는 것이다.
즉 Link 단계에서 함수와 연결 + 시동(시작)코드를 구현하는 것이다.

Posted via email from zzackzack2's Space

'Computer Engineering' 카테고리의 다른 글

[C] 0x0F 포인터(Pointer)  (0) 2012.01.27
KLDPWiki: Emacs Change Fonts (Emacs 글꼴 바꾸기)  (0) 2012.01.25
[C] 0x07 조건문(Switch)  (0) 2012.01.13
[C] 0x06 조건문(if)  (0) 2012.01.12
[C] 0x05 연산자(Operator)  (0) 2012.01.11