가상 메모리 ( Virtual Memory )

  • 주기억 장치인 RAM 의 실제 물리적인 공간 외에 하드 디스크 (보조기억장치) 에 부족한 시스템 메모리를 보조해 주는 역할

  • 새로운 프로세스가 실행되어 실제 메모리의 공간이 부족하면 휴면상태인 프로세스를 임시 공간인 가상메모리로 보낸 후에 새로운 프로세스를 실행하게 된다.

  • 실제 메모리와 가상 메모리 사이로 데이터를 옮기는 과정이 추가 되어 시스템이 느려지는 원인이 될 수 있습니다. 이유는 램에 비해 디스크의 속도면에서 차이가 나기 때문이다

  • 그렇기 때문에 가상 메모리는 되도록 사용 안하는 것이 좋다. 그만큼 실제 메모리 (RAM) 의 용량이 충분해야 할 필요가 있을 것이다. 일부의 프로그램에서 메모리 공간이 부족하지 않더라도 가상 메모리를 사용하는 경우도 있으니 참고하기 바랍니다.

  • 가상 메모리 관리
  1. 가장 빠른 디스크에 설정하는 것이 좋다.
    SSD에 윈도우와 가상 메모리가 위치해 있는 경우 분리를 위해 HDD로 옮기게 되면 엑세스 부하를 줄여 얻는 이득에 비해 엑세스 속도 저하로 인한 손해가 큽니다.

  2. 램 용량이 충분하면 가상메모리는 아예 없애는 것이 좋다.
    일부 소수의 프로그램들이 가상메모리를 사용하는 경우가 있기 때문에 최소한으로만 설정하여 사용하는 것이 좋다.

  3. 가상 메모리는 고정된 크기로 설정하는 것이 좋다.
    자동의 경우에는 계속해서 늘어나는 경우도 생길 것이고 잘못된 고정값을 설정하게 되면 부족한 현상이 발생될 수 있습니다. 따라서 자신에 사용에 맞게 설정하는 것이 가장 좋습니다.

  4. 나에게 적당한 가상 메모리 용량은 얼마일까?
    가상 메모리 크기를 64비트 기준으로 최소값인 16MB로 설정 후 최대 크기는 여유 있게 지정합니다. 그 이후에 재부팅 후 변화를 적용하고 평상시 사용하는 프로그램들을 실행해 봅니다.
    가상 메모리 설정 창에서 확인하면 사용한 만큼 늘어나 있을 것이고 그렇지 않다면 RAM의 용량이 충분하다는 것입니다. 평균적인 가상 메모리 크기를 알아낸 뒤에는 1.2~1.5배의 여유를 둔 가상 메모리를 설정합니다.

  5. 가상 메모리는 사용되지 않을 수록 좋다
    주기억장치에 비해 보조기억장치의 속도는 전투기와 거북이 수준으로 차이가 납니다.
    따라서 램 용량은 자신의 현재 원하는 작업 수준 보다 한단계 높은 수준으로 셋팅 해주는 것이 좋습니다. 그래야 가상 메모리 사용을 줄이거나 없앨 수 있기 때문입니다.


페이징 ( Paging )

  • 내용








세그먼테이션 ( Segmentation )

  • 내용








제목

  • 내용







내부 단편화

  • 내용








외부 단편화

  • 내용








결론

내용

내용

출처 : 



'프로그래밍 > 프로그래밍 기초' 카테고리의 다른 글

바인딩과 바인딩 타임 그리고 할당  (0) 2016.04.21
메모리 구조  (0) 2016.03.23


표준함수

  • 기능에 따른 표준함수 분리

    분류

    함수

    입출력 함수

    printf, scanf, gets, puts, getch, putch

    수학 함수

    sin, cos, tan, pow, floor, ceil, hypot

    문자열 함수

    strcpy, strlen, strcat, strstr, strchr

    시간 함수

    time, asctime, clock

    파일 입출력 함수

    fopen, fclose, fseek, fread, fwrite

    프로그램 제어

    exit, abort, system

    메모리 할당

    malloc, free, realloc, calloc

    기타

    rand, dela



삼각함수

  • 수학적인 계산을 하는 함수들. 원형은 math.h에 선언되어 있다.
    사용을 위해선 항상 전처리문 #include <math.h> 를 추가해 주어야 한다.
    이해하기 쉬운 삼각함수에 대해 알아보자. 이름만 다를 뿐 원형은 아래와 같이 동일하다.

    double sin(double x);
    double cos(double x);
    double tan(double x);
    double asin(double x);
    double acos(double x);
    double atan(double x);
    double sinh(double x);
    double cosh(double x);
    double tanh(double x);

  • 삼각함수의 인수들인 double x는 360분법의 각도가 아닌 호도(라디안)값이다.
    공식은 다음과 같다
    호도 = 각도*3.1416/180



지수함수

  • 지수함수는 거듭승, 제곱근, 로그 따위의 값을 구하는 함수.
    실수계산을 하기 때문에 리턴 값은 정밀도가 높은 double 실수 형이다.

    함수

    설명

    double sqrt(double x);

    x 제곱근

    double pow(double x,double y);

    xy. x y

    double log(double x);

    자연 대수

    double log10(double x);

    상용 대수

    double exp(double x);

    자연 대수 exp

    double hypot(double x,double y);

    직삼각형의 사변 길이


  • sqrt 함수는 제곱근, 두 번 곱해서 그 값이 되는 수 <sqrt(4)의 값은 2.0>
  • pow(Power의 약자) 함수는 보통 세제곱 이상의 수를 구하는 경우 사용 <pow(2,10) 2의 10승>
  • log 함수는 로그값을 계산하고 log10은 밑이 10으로 고정된 상용로그 값을 구한다.
  • hypot(Hypotenuse의 약자) 함수는 인수로 주어진 x,y의 제곱의 합에 대한 양의 제곱근이다.
    즉 피타고라스의 정리이다. < sqrt(pow(x,2)+pow(y,2)) / sqrt(x*x,y*y) > 


정수화 함수

  • 실수형 데이터에서 정수부만을 취하는 즉 소수점 이하는 잘라버리는 함수며, 
    리턴값이 정수가 아닌 실수이다.
    double floor( double x );
    double ceil( double x );

  • floor 함수의 경우 소수점 이하를 버리고 정수부만 취하고
    반대로 ceil 함수의 경우 소수점 이하를 올림해서 정수를 1증가 시킨다.

  • floor : 주어진 인수보다 크지 않는 최대 정수 (마루,바닥)
    ceil : 주어진 인수보다 작지 않는 최소 정수 (천장)


절대값 함수

  • 인수의 부호를 강제로 양수로 바꾼다.
    int abs(int n);
    long labs(long n);
    double fabs(double x);

  • abs함수 : 정수형에 대한 절대값
    labs함수 : long형에 대한 절대값
    fabs함수 : 실수형에 대한 절대값
    예전 16비트 환경에서는 int형과 long형의 길이가 달라서 다르게 되어 있지만 32비트에선 같으므로 abs와 labs는 동일한 함수라 할 수 있다.


난수 함수

  • 난수(Random Number) : 무작위로 만들어 지는 알 수 없는 값.
    int rand(void);
    void srand(unsigned int seed);

  • rand 함수는 0~RAND_MAX 범위의 수중 무작위로 한 수를 생성.
    RAND_MAX 는 컴파일러에 따라 다르지만 일반적으로 32767(0x7fffff) 로 정의되있다.
    일정한 규칙에 따라 난수를 생성하는데 규칙이 항상 같기 때문에 난수가 생성되는 순서도
    항상 동일하게 생성된다.


  • srand 난수를 발생시키는 시작점(seed) 를 제공하여시작점을 기준으로 난수를 발생시킨다.
    시작점의 변도에 따라 생성되는 난수가 달라진다.

     - time 함수를 시작점으로 이용한 난수발생 : srand((unsigned)time(NULL));

  • rand() % 48 의 경우 : 0~47사이의 난수

  • 보통은 사용이 불편하기에 define을 이용하여 대신 사용한다.
    #define randomize() srand((unsigned)time(NULL))
    #define random(n) (rand()%(n))


난수의 생성

  1. 0~n 사이의 난수는 random(n)으로 생성
    인수 자체는 제외되며 난수 중 제일 큰 값은 n-1

  2. random 함수가 만드러내는 난수의 값은 0으로 고정
    하지만 random 함수 뒤에 상수를 더해 시작과 끝값에 범위를 조정이 가능하다.
    random(20)+10 => (0~19)+10 => 10~29

  3. 난수 사이의 간격은 난수를 구한 후 곱을 사용
    범위를 지정하는 인수는 곱해주는 수리 미리 나누어 구해야 한다.
    0~100 미만의 짝수 중 하나 구하는 공식
    random(100/2)*2 => (0~49) * 2 => 0~98로 범위 확장.
    2를 곱했으니 생성된 난수는 짝수 여기에 +1을 할 경우 홀수

  4. 실수 난수가 필요하면 먼저 충분한 크기의 정수 난수를 구하고 필요한 유효자리 만큼 10의 거듭승으로 나눈다.
    random(100)/10.0 => 0~99 / 10.0 => 0.0~9.9

  5. 분리된 범위의 난수도 원한다면 생성가능
    0~4, 14~18 사이의 범위에 있는 수를 골라준다.
    (random(5)+5)*(random(2)==0? 1 : -1)+9
    뒤쪽의 삼항연산자는 난수의 부호를 정하는 것

  6. 혀 연관성이 없는 수들 중 하나를 난수로 선택
    3,7,12,15 중 하나를 선택하고 싶다면 아래와 같이 하면 된다.
    int i;
    do
    {
         i=random(16);
    } while (i!=3 && i!=7 && i!=12 && i!=15);
    무한 루프로 돌리면 언젠간 나올 것이다. 



시간 함수

  • time 함수 : 컴퓨터 안에 내장되어 있는 시계는 항상 정확한 시간을 유지.
    프로그램에서 필요한 경우 시간함수를 이용하여 조사가 가능하다.

    모든 함수의 원형은 time.h 이고 time.h는 미리 인클루드 해두어야 한다.

    time_t time( time_t *timer );
    char *ctime( const time_t *timer );

  • time_t 는 시스템에 따라 달라지며 윈도우즈에선 4바이트 정수 (typedef long time_t;)로 정의

  • ctime 은 time_t형의 경과초를 출력하기 편리한 문자열 형태로 바꾸며 UTC로 된 시간을
    지역 설정에 맞게 조절 해주기도 한다. 


  • void main()
    {     
        time_t t;
         time(&t);     
        printf("현재 시간은 %s입니다.\n",ctime(&t));
    }
  • 날짜와 시간을 문자열 형태로 바꾸는 함수
    char *_strdate(char *datestr);
    char *_strtime(char *timestr);

  • _strdate 의 경우 MM/DD/YY 포맷
    _strtime 의 경우 HH:MM:SS 포맷이고 24시간 제이다



시간 구조체

  • time_t형의 값을 tm구조체로 변환
    struct tm *gmtime(const time_t *timer);
    struct tm *localtime(const time_t *timer);
    time_t mktime(struct tm *timeptr);


  • gmtime, locatime 함수는 둘다 time_t형 값을 tm 구조체로 변환
    gmtime은 세계표준시 localtime은 지역시간으로 변환 

    멤버

    설명

    tm_sec

    (0~59)

    tm_min

    (0~59)

    tm_hour

    시간(0~23)

    tm_mday

    날짜(1~31)

    tm_mon

    (0~11)

    tm_year

    1990 이후 경과 년수

    tm_wday

    요일(0~6). 0 일요일

    tm_yday

    년중 날짜(0~365)

    tm_isdst

    일광 절약 시간과의 


  • mktime은 tm 구조체를 time_t형으로 변환하는 것이다.

  • asctime 함수는 tm구조체를 문자열로 바꾼다. time_t형에 ctime과 같은 함수

  • char *asctime(const struct tm *timeptr);
    size_t strftime(char *strDest, size_t maxsize, const char *format,
                    const struct tm *timeptr);


  • strftime(버퍼, 버퍼길이, 포맷팅방식, tm 구조체)
    3번째 인자인 포맷팅 방식에 따라 다양한 형식의 문자열로 바꿀 수 있다.




기타 시간 함수

  • clock 함수 : 프로그램이 실행을 시작한 후 경과된 시간 ( Process Time ) 을 조사
    원형 : clock_t clock(void)
    clock_t 타입은 long 형으로 정의 조사한 값을 CLOCKS_PER_SEC(윈도우즈 : 1000)으로
    나누면 프로그램 실행 후 경과 초를 알 수 있다. 

  • difftime 함수 : 두 시간 사이의 시간 차를 구해주는 함수
    원형 : double difftime(time_t timer1, time_t timer0);


표준함수에는 여러가지가 있다.

수학 함수와 난수 함수 시간 함수에 대해 알아 보았다.

삼각,지수,정수화,절대값과 난수생성과 시간과 시간에 구조체에 대해 알아 보았다.

출처 : soen.kr    



'언어 > C' 카테고리의 다른 글

배열과 포인터 그리고 문자열  (0) 2016.04.19
배열  (0) 2016.03.25
기억부류  (0) 2016.03.19
함수와 프로시저  (0) 2016.03.18
연산자  (0) 2016.03.14


기억부류

  • 기억 부류 : Storage Class)
    변수가 저장되는 위치에 따라 결정되는 변수의 여러가지 성질
    크게 4가지로 구분


 기억부류

 전역

 지역

 정적

 레지스터

 지정자

 extern

 auto

 static

 register

 지정 장소

 정적 데이터 영역

 스택

 정적 데이터 영역

 CPU의 레지스터

 선언 위치

 함수의 외부

 함수의 내부

 함수의 내부

 함수의 내부

 통용 범위

 프로그램 전체

 함수의 내부

 함수의 내부

 함수의 내부

 파괴 시기

 프로그램 종료시

 함수 종료시

 프로그램 종료시

 함수 종료시

 초기값

 0으로 초기화

 초기화되지 않음

 0으로 초기화

 초기화되지 않음


  • 기억부류에서 가장 중요하는 것은 전역변수와 지역변수를 구분하는 것이다.


지역변수와 전역변수

  • 변수의 선언 위치가 다르다.
    전역 변수는 함수 바깥쪽에서 선언하고 지역 변수는 함수 내부에서 선언 한다.

  • 통용 범위 또한 다르다. 통용범위란 변수가 사용될 수 있는 범위
    전역 변수는 특정 함수 내에 선언 된 것이 아니라 함수에 속하지 않고 프로그램 전체에서 사용
    지역 변수는 자신이 선언된 함수에 소속되어 있기 때문에 함수 외부에서는 변수 사용이 불가하다
    자신의 임수를 수행하기 위해서 잠씨 쓰고 버리는 것. 

  • 변수의 파괴 시기가 다르다. 변수는 값을 기억하기 위해 메모리를 할당받아 사용
    사용 이후에 변수가 파괴되는데 변수를 파괴한다는 것은 곧 메모리의 회수를 의미
    지역변수는 특정 함수 내부에서만 사용 : 함수가 실행 중일 때만 메모리를 차지하며 함수가 끝나면 변수의 생명도 끝나고 사라진다. ( 함수와 함께 운명을 같이 한다.)
    전역변수는 프로그램에 소속되어 있고 모든 함수에서 사용 가능해야 하므로 프로그램 실행중인 동안에는 파괴 되지 않는다. ( 프로그램과 운명을 같이 한다. )

  • 변수가 생성되는 기억 장소가 다르다 
    전역 변수는 한 번 정해진 위치에 계속 남아 있어야 하므로 정적 데이터 영역에 생성
     - 정적 데이터 영역이란 프로그램의 코드 바로 다음에 위치하는 실행 파일의 한 부분
    지역 변수는 프로그램 실행 중에 생성, 파괴를 반복 하므로 스택(데이터의 임시 저장소)에 생성
     - 프로그램은 실행에 필요한 임시적인 정보들을 스택에 차곡차곡 저장한다. 

  • 초기화 여부가 다르다.
    전역 변수는 별도의 초기식이 없더라도 0으로 초기화 해준다.
    전역 변수는 컴파일될 때 컴파일러에 의해 초기화된 채로 실행 파일에 새겨지므로 초기화 시간은 0
    지역 변수는 초기식이 없을 경우 초기화되지 않는다. 이 때에는 무슨 값인지 알 수 없는 쓰레기값(Garbage) 라고 한다. 초기식이 없을 때 초기화 하지 않는 이유는 함수가 호출 될 때마다 변수가 새로 생성되기 때문에 매번 변수를 초기화 하자면 그만큼 실행 속도가 느려지므로 안한다.



  • 지역 변수의 장점
    1. 함수의 독립성 향상 : 프로그램은 함수로 구성 함수는 프로그램의 부품
    재활용을 높이기 위해 부품끼리 공유하는 것(전역변수)이 많다보면 의존 관계를 가지게 되므로 좋지 않은 구조를 만들어 낸다. 지역 변수는 함수가 자신이 필요로 하는 모든 정보를 가질 수 있도록 (Self Contained) 해주므로 독립성을 높여 준다.
    2. 디버깅 효율을 향상 : 버그, 즉 논리적인 에러가 발생하는 원인의 십중팔구는 변수의 조작 미스!!
     전역 변수가 편하다고 남발하다 보면 디버깅 시에 살펴 봐야할 변수의 수가 증가!! 
     작은 프로그램의 경우 크게 상관은 없지만 큰 프로그램을 만들다 보면 변수가 수백개이면 지역변수의 경우 그 해당 함수만 보면 되지만 전역 변수의 경우 모든 곳을 다 돌아 봐야하는데 시간이 오래 걸리기 때문이다!!!
    3. 메모리의 절약 : 전역 변수는 프로그램 실행 시 생성 되어 계속 값을 유지하므로 그만큼 메모리를 항상 차지하게 된다. 지역 변수는 함수가 호출될 때만 생성되며 함수가 종료되면 즉시 파괴되므로 자신이 속해 있는 함수가 실행중일 때만 메모리를 차지한다. 
    4. 재귀 호출이나 상호 호출같은 특별한 기법은 지역 변수가 있어야 사용. 함수가 호출될 때마다 새로은 변수가 생성되어야만 가능한 기법이다.

  • 외부변수 : 변수의 확장형
    [지정자]타입 변수명;

    지정자(Specifier)는 기억 부류를 비롯하여 상수 지정, 최적화 금지 등 변수의 여러 가지 성질을 지정하는 키워드인데 필요가 없을 경우 생략가능
    기억부류 지정 키워드 : auto, extern, static, register
    - auto : 지역변수 선언시 변수의 타입 앞에 auto 키워드를 붙인다.
            함수 내부 : auto로 인식하여 지역변수
            함수 외부 : 전역변수로 선언

    - extern : 정보가 공개된 이후에만 사용이 가능한데 이러한 선언을 하는 키워드
        함수에서 전역 변수를 사용하기 위해 extern 선언이 원칙적이지만
        다음 규칙이 만족할 경우 extern의 생략이 가능
          - 함수보다 앞 쪽에 선언되어 있는 외부변수는 extern 선언을 하지 않아도 된다.
          - 변수 선언문이 더 앞쪽에 있다면 상관이 없지만 뒤 쪽에 있을 경우 extern 선언이 필요!
          - 외부 모듈에 있는 전역 변수를 참조하고자 할 때 소스의 선두에 extern 선언!!!!!!!!


정적변수

  • 전역변수와 지역변수의 성격을 동시에 가지는 특별한 기억 부류
    위의 도표에 있는 특징을 살펴 보자
    1. 선언 위치 : 함수의 내부(지역변수)
    2, 통용 범위 : 함수의 내부(지역변수)
    3. 저장 장소 : 정적데이터영역(전역변수)
    4. 프로그램 실행 중에 항상 존재
    5. 초기값 지정이 없으면 0으로 초기화되고 프로그램 실행시 단 한번면 초기화!!!!
    정적변수 지정자 : static

  • 정적 변수는 함수 내부에서 그 안에 있는 값을 함수가 삭제되고 난 뒤에도 값을 유지하고 싶을 경우에 사용하게 된다. 따라서 다른 프로젝트로 가져가도 사용이 쉽워 재사용성이 높아진다.

  • 주의 사항 : 초기화가 언제되는 지를 알아야 한다.
    매번 함수를 호출할 때마다 static int blac=0; 이라는 코드를 통해 0으로 계속 초기화 한다면 
    static 을 사용하는 의미가 퇴색되게 된다. 
    전역 변수와의 가장 다른 점은 extern 선언을 통해 외부 모듈로 정보 공개가 되지 않는다. 


레지스터 변수

  • 레지스터 변수의 특이점으로 지역, 전역, 정적 변수들은 정적 데이터 영역이든 스택이든 메모리의 한 구석에 생성 되지만 레지스터형 변수는 CPU의 레지스터에 저장된다.
    레지스터(Register)란 CPU의 구성 부품 중 하나 이며 CPU가 데이터를 처리하기 위해 사용하는 임시 작업장이라 할 수 있다. 
    컴퓨터의 가장 핵심 부분인 CPU의 한가운데에 있는 기억 장소이기 때문에 레지스터의 속도는 메모리 보다 훨씬 빠르다 읽고 쓰는 속도는 수십억분의 1초 정도 밖에 걸리지 않는다. 
    CPU의 종류에 따라 다르지만 레지스터에 따라 다르지만 레지스터는 보통 10개~20개 정도밖에 없는 아주 귀한 기억 장소인데 여기에 변수를 저장하면 이 변수를 참조하는 문장의 속도가 빨라진다.



  • 레지스터의 크기는 CPU의 비트수를 결정하는 중요한 기준인데 레지스터가 32비트면 32비트 CPU라고 부른다. 대부분 CPU는 32비트이므로 레지스터들도 전부 32비트 이고 따라서 저장 가능한 변수의 타입은 int, unsigned, 포인터 형 등의 32비트형, double 같은 실수형은 저장할 수 없으며 구조체나 배열은 안된다. 에러는 아니지만 지정해 봐야 무시당한다.
    레지스터의 개수가 많지 않기 때문에 레지스터형 변수두 개까지만 선언이 가능하다.

  • 한정된 자원이기 때문에 일시적으로 사용할 지역변수에만 지정할 수 있으며 전역변수는 지정이 불가능 하다. 프로그램과 생명을 같이 하는 전역변수가 레지스터 하나를 차지한다면 프로그램 실행 중 레지스터 하나가 묶여 버리게 될 것이다.

  • 레지스터형 변수를 쓸 때와 지역 변수를 쓸 때는 속도의 차이가 많이 난다. 요즘에는 하드웨어들이 향상 되어서 크게 차이는 없다. 
    레지스터형 변수는 컴파일러에 종속적이다. 
    레지스터형 변수는 메모리 생성이 아니므로 &연산자는 불가능하다 즉, 이 변수로 메모리의 주소를 조사할 순 없다. 하지만 레지스터형 포인터 변수가 번지를 기억할 수 있으므로 *연산자를 사용하는 것이 가능하다. 

  • 레지스터형 변수와 지역변수는 근소한 속도 차이외에는 아무 차이가 없으므로 컴파일러가 사용자의 지시를 무시하고 기억 부류를 바꾸어도 별 문제가 없다.


정적함수

  • 함수도 기억 부류를 가진다. 함수는 전역이니 지역이니 하는 개념은 존재 하지 않으며 레지스터형 기억 부류도 당연히 없다.
    C의 함수는 수평 적인 평등 관계며 어떤 함수를 다른 함수의 지역 함수를 허용하지 않으므로 C의 함수들은 원칙적으로 전역이다.

  • 함수에 적용 되는 것은 정적(static) 기억부류 밖에 없다. 정적 함수는 특정 모듈에서만 사용할 수 있으며 외부 정적변수의 특성과 유사. 함수의 정의문에 static이라는 지정자만 붙이면 정적함수가 된다. 

  • 정적 함수와 반대되는 경우도 있는데 이름을 붙일 경우 외부함수나 비정적 함수가 될 것이다. 외부 함수는 별다른 지정 없이 항상 외부로 알려지며 원형 선언만 하면 어떤 모듈에서나 이 함수를 호출 할 수 있다.

  • 정적 함수는 특정 모듈에서만 사용하도록 정의된 것이므로 외부에서 원형을 선언한다 하더라도 함수의 호출이 불가능 하다. 이유는 정적 변수의 경우와 같이 이름 충돌을 방지하기 위해서 이다. 재사용을 위해서 모듈에서 ReadFile이라는 함수를 사용하는데 이름이 너무 일반 적이여서 프로젝트 내에서 충돌할거 같은 경우 static 으로 선언하면 된다. 




  • 위의 경우 모듈을 프로젝트 내에 모두 포함 할 경우 Comp, Decomp 함수를 이중으로 정의 하는 형태가 되어 제대로 컴파일이 되지 않는다. 

  • ZIP과 Network는 개별적으로 원할 때만 포함시킬 수 있고 Network가 ZIP에 종속적이지 않으며 둘 다 포함하더라도 아무문제가 없어야한다. 
    이 경우의 해법이 바로 정적함수 이다.

  • 상용 라이프러리의 경우 주의사항이 늘어나 고객들이 좋아 하지 않고 가격 정책을 결정하는데도 문제가 된다. 만약 Network 가 ZIP 보다 비싼 모듈인데 Network를 사면 ZIP도 끼워서 팔아야 하는 문제가 생긴다. 정적함수는 같은 코드가 중복되는 문제점이 있지만 충돌이 발생하는 것보다 낫기 때문에 제공 되는 것이다.



통용범위

  • 규칙 : 
    변수나 함수, 태그 같은 명칭은 상호 구분되어야 하므로 중복이 불가능.
    그 예외의 사례가 있는데 통용 범위가 다른 명칭끼리는 같은 이름을 가질 수 있다.
    즉, 다른 함수에서 같은 이름의 변수명 즉, 지역변수로 선언하게 되면 크게 문제가 없다.

  • 문제가 되는 경우는 전역변수로 선언한 int i 와 main함수 안에 전역변수 i를 사용하고 func함수에서는 지역변수 int i를 선언 하게 되면 일반적으로 모호함이 발생하지만 컴파일러에서 좁은 범위를 가지는 명칭 즉, 지역변수 i에게 우선권을 주게 된다. 전역 변수 i 는 사용할 수가 없게 된다.
    사용하기 위해선 ::i 라는 형태로 사용하면 전역 변수를 사용 할 수 있다.

  • 블록 범위 :
    지역 변수는 { } 괄호안의 블록에 선언된 블로 내부에서만 통용되고 { } 괄호 안에서만 통용된 범위를 블록 범위라 한다. 일반적으로 { }는 함수의 시작과 끝을 나타내기 떄문에 지역변수의 통용 범위는 함수 내부가 되는 것.

  • 선언과 정의

     기억부류

     전역

     지역

     정적

     레지스터

     지정자

     extern

     auto

     static

     register

     지정 장소

     정적 데이터 영역

     스택

     정적 데이터 영역

     CPU의 레지스터



함수의 설계 원칙

  1. 함수의 이름은 최대한 설명적으로 작성하여야 한다. 
    이름만으로 무엇을 하는지 어떻게 쓰는 것인지도 알 수 있도록 한다.
    기능을 명확히 아는 것 < 동사, 목적어, 약간의 수식어로 구성 >

  2. 두 번 이상 반복된 코드는 반드시 함수로 분리한다.
    똑같은 코드를 중복된 채로 내며려 두면 커진다. 10줄 자리 코드를 10번 반복한다면 나머지 90번의 코드는 불필요하게 된다. 코드의 유지와 확정성이 곤란해진다.
    위와 같은 경우 수정할 것이 있으면 일일히 다 해야 되지만 함수로 해둘 경우 함수의 내부만 수정해 주면 된다. 실수로라도 빼먹게 되면 버그의 온상지가 되어버린다.

  3. 반복되지 않더라도 한단위로 볼 수 있는 작업은 함수로 만든다.
    배열의 초기화나 단순한 메뉴형태를 출력하는 경우도 함수로 만들는 것이 좋다.
    한 함수으 소스가 길어지면 작업 파악에 많은 시간이 소요된다.

  4. 한 함수는 한가지의 기능만 수행해야 한다. 
    위에서 말했듯이 프로그램을 구성하는 부품이며 부품은 전체를 구성하는 원자적인 단위이고 재사용성 향상을 위해서 한가지의 기능만 수행하는 함수를 만들어야 한다.

  5. 입력과 출력이 직관적이고 명확 해야 한다.
    인수는 함수에게 주어지는 작업거리인데 함수가 하는 일에 꼭 필요한 정보만 최소한의 인수로 받아 들여야한다. 

  6. 함수는 자체적으로 에러를 처리해야 한다. 
    함수는 독립된 작업을 하며 재사용가능한 부품이므로 그 자체로 완벽하게 동작할 수 있어야 한다.
    모든 경우의 수를 따져서 에러처리를 해야한다. 이 경우 어떠한 프로젝트에 가져가도 별도의 수정 없이 재사용이 가능한 부품이다. 

위 6가지 원칙이 참고사항일 뿐이지 필수는 아니다. 하지만 참고사항을 유념해두고 연습과 분석이 필요하다.

기억부류는 4가지로 구분한다

지역 변수, 전역 변수, 정적(static) 변수, 레지스터(Register)변수

통용범위와 함수의 6가지 원칙에 대해 알아보았다.

출처 : soen.kr



'언어 > C' 카테고리의 다른 글

배열  (0) 2016.03.25
표준함수  (0) 2016.03.19
함수와 프로시저  (0) 2016.03.18
연산자  (0) 2016.03.14
제어문  (0) 2016.03.13

+ Recent posts