2010. 7. 10. 02:01

제 11장 C언어의 핵심, 함수 - 1

 

 

 

C언어로 만들어진 프로그램은 ?

    : 함수로 시작해서 함수로 끝나는 프로그래밍 언어

 

 - 중요도는 함수가 포인터가 상대적으로 높다.

 

 - 포인터는 활용하는데 정말 중요

 

 - 함수를 적절히 이용하는건 더 어렵게 걸린다.

 

 - 포인터를 얼마냐 잘 사용되느냐가 아닌

 

 - 함수를 어떻게 정하는건지 실력판단.

 

 - 좋은함수를 만들수 있어야한다.

 

 

 

main()함수 다시보기

 

int main (void)
{

 // 함수몸체

}


1. 함수는 이름이 필요하다

 

(void)  : 입력의 형태

 

 (int)   : 출력의 형태(반환 혹은 리턴형)

 

{    }  : 함수의 몸체(함수의 기능)

 

 

2, 함수를 정의하는 이유

 

  - 모듈화(기능별로 분리)에 의한 프로그램의 질 향상

 

  - 유지 보수, 확장의 용이성
    ex) 프로그램을 바꿀때, 기능별로 순차적으로 수정이 가능

 

 - 문제를 분리하고,전체를 정복하라 (Divide and Conquer)

 

  - 체계적인 프로그래밍 가능

 

  - 코드 읽기의 효율성

 

 

3. 함수의 형태
 
int Sum(int a, int b) // int형을 return 할 Sum 이라는 이름의 함수
{                          // 변수 a, b로 받아준다.
 int sum = a+b;       // 연산값을 sum에 대입

 return sum;         // return : sum을 반환해라, 던져줘라
}

 

예제 ===============================================

 

#include <stdio.h>

 

int Sum(int a, int b) // 여기에 a = 10, b = 20
{
 int result = a+b;

 return result;            // result를 던진다.(뱉어낸다)
}

 

int main()
{
 int val;

 val = Sum(10, 20);// 뱉어낸 값을 받아서 val에 보관
 printf("val = %d \n", val);

 return 0;
}

 

// 함수가 리턴값은 어디로 넘어가는가?

// 리터형 함수는 어떤것들이 있는가?

 

 

4 다양한 형태의 함수

 

int Sum(int val)     // 전달인자, 리턴값 둘다 있다.
void Sum(int val)  // 전달인자는 있지만 리턴값이 없다.
int Sum()              // 전달인자는 없고, 리턴값은 있다.
void Sum(void)    // 전달인자, 리턴값 둘다 없다.

 

 

5. 함수 선언의 필요성

 

 - 컴파일러의 특성상, 함수는 호출되기전에 정의되야 한다.

 

 - 호출할 함수정의는 main함수 이전에 무조건 선언 되야 한다.

 

 - 호출할 함수원형을 선언후, main()함수 밑에 선언도 가능

 

 - 컴파일은 위에서 아래의 순서대로 읽기때문에, 컴파일이 호출할 함수를 읽어야 한다.


예제 ===============================================

 

#include <stdio.h>

 

int Add(int a, int b);        // 더하기 함수선언
int Minus(int a1, int b1); // 빼기 함수선언
int Input();                    // 입력하는 함수선언
void Print(int k, int k1);  // 출력하는 함수선언
void Title();                  // 프로그램제목 함수선언

//-------------------------------------- 까지 함수 선언부분

int main()
{
 int num1, num2;
 int sum1, sum2;

 

 Title();                                // 제목함수호출

 

 num1 = Input();                    // Input함수를 호출하여, 결과값을 num1에 반환
 num2 = Input();                    // Input함수를 호출하여, 결과값을 num2에 반환

 

 sum1 = Add(num1, num2);    // Add(더하기)함수 호출하여 결과값을  sum1에 반환
 sum2 = Minus(num1, num2); // Minus(빼기)함수 호출하여 결과값을 sum2에 반환

 

 Print(sum1, sum2);              // 출력함수 호출

 return 0;                            // 0을 리턴한다.
}

//-------------------------------------- 부터 함수 정의부분

void Title()                         // Title 함수정의부분
{
 printf("  ▲                               ▲\n");
 printf("■ 함수를 이용한 프로그램 예제입니다 ■\n");
 printf("  ●                               ●\n");
}

 

int Add(int a, int b)             // Add 함수정의부분
{
 int result = a + b;
 return result;
}

 

int Minus(int a1, int b1)      // Minus 함수정의부분
{
 int result1 = a1 - b1;
 return result1;
}

 

int Input()                        // Input 함수정의부분
{
 int val;
 printf("값을 입력하세요 : ");
 scanf("%d", &val);

 return val;
}

 

void Print(int k, int k1)     // Print 함수정의부분
{
 printf("더한 결과 : %d \n", k);
 printf("빼기 결과 : %d \n", k1);
}

 

// 위(main함수 위)에는 함수를 선언한부분

// 밑(mani함수 밑)에는 선언한 함수를 정의한 부분이다

 

예제 ===============================================


// 함수 선언의 의미

#include <stdio.h>

 

int Large_Num(int a, int b); // 함수 선언부분

 

int main()
{
 int a = 10;
 int b = 12;

 int c = 3;
 int d = 2;

 

 printf("%d 와 %d중 큰 수는 %d \n", a, b, Large_Num(a, b));
 printf("%d 와 %d중 큰 수는 %d \n", c, d, Large_Num(c, d));

 

// printf의 인자값을 반환값이 존재하는 함수가 올수 있다

 

 return 0;
}

 

int Large_Num(int a, int b)  // 함수정의 부분, main 함수내의  변수 a,b와는 별개인 변수다
{
 if(a > b)
  return a;

 else
  return b;
}

 

// Tip !

// 한 함수내의 { } 안에 선언된 변수의 이름은 그 안에서만 효력이 발생한다.

// 다른 함수에 똑같은 이름의 변수가 있더라도, 영향을 받지 않지만,

// 프로그램의 가독성 및 혼란성을 피하기 위해서, 다른 변수를 넣어주는것이 좋다.

ex)

in Add()

{

int a;

}

 

int Add_1()

{

int a;

}

 

이둘의 a값은 컴파일의 혼란을 야기 시키지 않는다. 이름만 같을뿐, 서로 다른변수다.

 

 

 

Posted by 토실토실천재