블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
     

    - 함수 전달의 3가지

    참조(reference) / 주소(address)

    값(value)

    ⇒ 참조는 주로 객체 지향에서 나오는 말이다. 그렇기에 객체 지향에서는 주소와 값을 묶어서 같은 카테고리로 생각해 볼 수 있다.

    ⇒ C에서는 참조가 없으므로 주소와 값으로 생각하며, 참조와 주소는 같은 의미로 쓴다고 생각한다.

    ※ 가장 확실한 것은 3가지를 각각으로 생각하는 것이다.


    - 재귀함수(recusive fuction)

    ⇒ 함수의 실행부 내에서 그 자신을 호출하는 함수.

    ⇒ 재귀호출은 프로그램을 매우 간결하게 작성할 수 있도록 해주며, 프로그램 내의 모든 반복문은 재귀호출로 바꿀 수 있고, 그 역으로 모든 재귀 호출은 반복문으로 고쳐 쓸 수 있다.


    // 양의 정수 n을 입력받아, 재귀 호출을 이용하여 n부터 1까지 출력하는 프로그램

    #include<stdio.h>

    void recursive_print(int n); // 함수의 선언

    int main()

    {

            int num;


            printf("Please enter a positive integer: ");

            scanf("%d", &num);

            recursive_print(num);


            return 0;

    }

    void recursive_print(int n)

    {

            if(n<=0) // 함수의 종료 조건

            {

                    return;

            }

            else

            {

                    printf("recursive_print: n = %d\n",n);

                    recursive_print(n-1); // 함수의 재귀 호출. 즉, 스스로를 호출한다.

            }

            return;

    }

    ⇒ 실행결과


    → 재귀함수의 기본적인 형태는 if-else문이다. if 절에서는 종료 조건을 명시하고 함수의 실행을 종료시킨다. else 절에서는 반복해서 재귀호출을 시도한다. 이때 재귀호출 인수를 변경하여 마지막에는 제귀호출이 종료하게 된다.


    → main 함수를 재귀함수의 형태로 사용하면은 무한히 반복한다.

    ※ 윈도우에서 생각해 보면 이것은 stack이 계속해서 쌓이게 되므로 문제가 발생한다. 그리고 이렇게 stack이 계속 쌓여 다른 영역의 stack을 침범하는 것을 stack overflow 라고 하며 해킹의 방법이 되기도 한다.

    ※ 재귀함수의 문제는 stack을 많이 사용하게 되는 것이다. 재귀함수는 stack을 함수의 반복이 끝날 때 까지 반환하지 않고 계속 사용하게 된다. 즉, 반복의 크기가 stack의 한도를 초과하게 되면 비정상적인 문제가 발생한다.

    ※ stack이 과도하게 많아진다는 것은 메모리의 사용량이 증가하게 되고 문제를 발생시킨다.

    ※ 그렇기 때문에 재귀함수는 프로그램을 간결하게 하는 장점에도 불구하고 남용해서는 안된다. 특히 큰 프로그램 등을 통해 반복을 많이 하게 된다면 재귀함수는 무척이나 위험하다.

    ※ 프로그램의 분석을 위해 재귀함수 종료조건은 확실히 알아두어야 한다.



    ※ touch test.h → 0byte 짜리 test.h 파일이 생성된다. 만약 test.h 파일이 원래 있었다면 파일의 수정 시간이 바뀐다.

    ⇒ touch 파일명.확장자 를 하게 되면 파일의 수정 시간이 바뀌게 된다.

     

    #include"test.h"

    → 현재 디렉토리로부터 test.h를 포함한다는 뜻.

    → “ ”는 외부파일을 불러올 때 사용하며 < >는 라이브러리에서 참조할 때 구분해서 사용한다.

     

    ⇒ ifndef → if not def(define test가 되어있지 않으면)

    ⇒ #if 와 #endif 중괄호와 같은 역할이며 안에 함수 원형을 넣을 수 있다.

    ⇒ vi /usr/inclue/stdio.h 를 확인해 보면 동일 include를 하나만 인지하도록 위와 같은 형식이 선언되어 있다.

    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함