본문 바로가기
Basic/C/C++

[C언어] 제 23 강 : 그 외 함수들과 파일 분할

by boxbop 2012. 1. 29.
반응형


 이번 장은 C언어의 마지막 장으로 대표적인 함수들과 파일 분할 방법에 데하여 살펴보고 마치도록 하겠습니다.

 [수학 관련 함수]

: 다음과 같은 함수를 사용하기 위해서는 math.h에 선언되어 있으므로 이를 포함해야 합니다.(#include<math.h>)

 double  fabs(double x);  x의 절대값 반환
 double  ceil(double x);  x보다 작지 않은 최소 크기의 정수 반환
 double  floor(double x);  x보다 크지 않은 최대 크기의 정수 반환
 double  exp(double x);  e^x 값 반환
 double  pow(double x, double y);  x^y 값 반환
 double log(double x);  logx값 반환 (밑은 e)
 double log10(double x);  logx값 반환 (밑은 10)
 double sqrt(double x);  루트x 값 반환

 : 다음과 같은 함수를 사용하기 위해서는 stdlib.h에 선언되어 있으므로 이를 포함해야 합니다.(#include<stdlib.h>)

 int  abs(int x);  x의 절대값 반환
 int  labs(long x);  x의 절대값 반환

cf) 실수형 연산을 하는 수학 함수들은 math.h에 선언
     정수형 연산을 하는 수학 함수들은 stdlib.h에 선언

 int rand(void);
->의사 난수를 반환한다. 그러나 rand함수는 난수를 발생시키지만, 그 생성되는 패턴이 항상 동일하기 때문에 진정한 난수는 아니기 때문에 '의사(가짜)' 난수라고 하는 것 입니다.

 rand함수가 동일한 패턴의 난수를 발생시키는 이유는 난수를 생성하는 기초 정보인 시드(seed) 값이 한상 동일하기 때문입니다. 그래서 난수의 생성 패턴을 유동적으로 바꾸기 위해서는 시드값도 바꿔주어야 합니다. 콩심은데 콩나고 팥심은데 팥나죠. 시앗을 바꿔주어야 나오는 결과물도 달라진다고 생각해보세요~

 void srand(unsigned seed);
->함수를 호출하면서 정수를 전달하면, 전달된 정수로 시드 값이 변경됩니다. 때문에 rand함수의 난수 생성 패턴은 달라집니다.

 [시간과 날짜 관련 함수]

시간 관련 함수를 사용하기 위해서는 헤더파일 time.h를 꼭 포함해야 합니다~

clock_t  clock(void);
성공 시 프로세스 타임 반환, 실패 시 형 반환하여 -1 반환
->프로그램이 실행된 이후로 지나간 시간을 의미하는 '프로세스 타임'을 반환합니다. clock_t 형은 좀 더 알아보면 typedef long clock_t로 정의되어 있습니다. 즉, long형으로 새로 정의된 자료형의 이름입니다. 프로스세 타임은 0부터 시작해서 그 값이 증가하는 형태를 띠고 있습니다. 이 값이 1씩 증가하는 시간의 간격(클럭 틱 clock tic)은 매크로 CLOCKS_PER_SEC를 통해서 확인할 수 있습니다. 1초당 클럭 틱이 발생하는 횟수를 의미합니다! 즉 이 값이 1000이라면 클럭 틱은 0.001초에 한번 씩, 1초에 총 1000회의 클럭틱이 발생 했다는 의미입니다.

ex)
   clock_t start, finish;
   start = clock();
      .......
    finish = clock();
    printf(" 소요된 시간 : %f 초", (double) (finish-start)/CLOCKS_PER_SEC);

 time_t  time(time_t*  tptr);
성공 시 1970년 1월 1일 자정 이후로 경과한 시간을 초 단위로 반환, 실패 시 -1
->time 함수는 우리가 일상적으로 사용하는 형태의 날짜와 시간정보를 출력합니다. '1970년 1월 1일 00시 00분 00초' 이후로 경과한 시간을 표현합니다.

ex)
 time_t current;
 current = time(NULL);

 사실 time 함수는 날짜와 시간 정보를 초 단위로 계산하여 (1970년 1월 1일을 기준으로) 반환하기 때문에 현재의 시간과 날짜를 계산하려면 별도의 연산관정을 거쳐야 합니다. 따라서 time 함수가 반환한 값을 가지고 현재의 날짜와 시간을 계산하기 위한 편리한 함수가 ctime 함수입니다.

 char*  ctime(const time_t* tptr);
성공 시 현재 지역의 시간과 날짜를 문자열의 형태로, 실패 시 NULL 반환

ex)
 time_t current;
 current = time(NULL);
 printf("현재 시간 : %s",ctime(&current));

 ctime 함수의 장점은 현재 사긴을 보기 좋게 출력할 수있지만 시간 정보를 가지고 연산하기에는 부족합니다. 이러한 경우 정수의 형태로 년, 월, 일, 시, 분, 초 정보를 추출하기위한 함수가 localtime 입니다.

 struct  tm*  localtime(const time_t* t);
현재 지역의 시간과 날짜 정보를 담은 tm구조체 변수의 포인터 반환

struct tm
{
    int tm_sec;  //0~59
    int tm_min;  //0~59
    int tm_hour;  //0~23
    int tm_mday;  //1~31
    int tm_mon;  //0~11
    int tm_year;  //1900을 기준
    int tm_wday; //요일은 일~토 까지 0 ~ 6으로 표현
    int tm_yday;  //0~365
    int tm_isdst; //써머 타임
 }

위 와 같이 구조체 tm은 정의되어 있다는거 참고해두세요~

ex)
 time_t  current;
 struct  tm*  sptime;

 current = time(NULL);
 sptime = localtime(&current);
 
 printf("년 :  %d \n", sptime->tm_year + 1900);
 printf("월 :  %d \n", sptime->tm_mon + 1);
 printf("일 :  %d \n", sptime->tm_mday);
 printf("시 :  %d \n", sptime->tm_hour);
 printf("분 :  %d \n", sptime->tm_min);
 printf("초 :  %d \n", sptime->tm_sec);

 자 그럼이제 time 함수를 활용하여 난수 생성을 다시한번 시도해봅시다. srand함수의 호출을 통해서 시드 값을 매번 바꿔줘야 한다고 했죠? 역시나 시드 값도 매번 바꿔줘야 한다는 이야기 입니다. 이때!!! time함수를 이용하면 매우 유용합니다.

 srand( (unsigned) time (NULL));
 printf("%d", rand());


 time 함수는 현재의 시간 정보를 반환합니다. 현재 시간이라는 것은 매번 달라지는 값이기 때문에 strand 함수의 전달 인자로 설정해 놓으면, 프로그램이 실행될 때마다 다른 시드 값을 성정하는 효과를 볼 수 있습니다.



 이번에는 파일의 분할에 대하여 알아보도록 하겠습니다. C언어로 구현된 프로그램의 소스코드는 사실 여러 개의 파일로 구성이 됩니다. 몇 천줄, 몇 만줄이나 되는 실제 프로그램의 소스코드는 한 파일에 구성할 수는 없겠죠? 때문에 여러 개의 파일로 소스코드를 나눕니다. 그렇게되면 프로그램의 코드 분석도 용이해지고 관리 또한 쉬워집니다.

 단순히 코드를 나눠버리면 문제가 발생합니다. 컴파일러는 파일 단위로 컴파일을 진행하기 때문에 만약 변수의 선언 부분과 실제 구현 부분이 서로 다른 파일에 존재 한다면 이는 컴파일 오류를 발생시킵니다.

 extern 이라는 키워드는 외부에 선언 및 정의되었다고 컴파일러에게 알려줍니다. 반대로 static 키워드는 외부 파일에서의 접근을 허용하지 않습니다. 중요한건 static은 전역변수와 지역변수의 쓰임새가 조금 다릅니다. 전역 변수로 사용 되었을때 외부 파일에서의 접근을 허용하지 않는다는 의미를 나타냅니다.

 일반적으로 변수의 선언 및 정의 / 함수의 선언 및 정의 / 실제 구현되는 main 코드로 프로그램을 구성하게됩니다. 이들 파일을 생성하고 프로젝트에 추가하는 방법은 글로만 설명하기는 어려우므로 생략하도록 하겠습니다. 아마 C언어 기본서가 있다면 나와있을거라 생각도 되구요. 혹시라도 나중에 기회가 된다면 추가적으로 설명하도록 하겠습니다~ 어찌하다보니까 급 마무리하게 되네요...;;;ㅎㅎㅎㅎㅎ 

 이상으로 C언어에 대한 내용을 모두 마치도록 하겠습니다~ 다음 부터는 C++, My-Sql, 네트워킹등 다양한 주제를 가지고 포스팅을 해 볼 생각입니다~



 
반응형