표준함수

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

    분류

    함수

    입출력 함수

    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


함수와 프로시저

  • 함수 ( Function )
  • 사전적 의미 : 기능, 행사, 함수, 의식
    기능 : 정해진 일(능력)을 수행하는 것, 작용하는 것
    특정 계산을 수행하며 리턴 값이 존재하고 반드시 수식 내에서만 사용가능 하고 |
    함수 단독으로 문장을 구성할 수 없다.

  • 프로시저 ( Procedure )
  • 사전적 의미 : 절차, 과정, 순서, 방법
    절차 : 일을 하는데 거쳐야 하는 일정한 순서와 방법
    방법 : 목적을 이루기 위한 수단이나 방식
    특정 작업을 수행하며 리턴값이 없다. 단독으로 문장의 구성이 가능하다 (C의 void 함수가 해당)

  • 함수란?
  • 목적에 의해서 수행 요구
    목적에 대한 결과가 존재하는 것
    입력 값을 정확히 해야 정해진 결과를 도출하는 것

  • 기본형식 : 
  • type name(parameter list)
    {
        함수의 본체
    }
    name : 함수의 이름 이 이름을 통해 함수를 호출. 함수의 이름도 명칭을 만드는 규책대로 기억하기 쉽고 의미를 잘 표현할 수 있는 것이 좋다.
    parameter list : 함수의 인자 값 
    type : 반환값 : 함수가 리턴하는 값읠 데이터 형. 함수의 작업결과
    본체 : {} 실제 함수의 코드. 함수의 고유 기능을 수행!!! 




함수의 선언과 정의

  • 선언(declaration) : 널리 알리는 것
    main 함수 위에 어떠한 함수를 미리 사용하겠다고 알린다.

  • 정의(definition) : 명백히 밝혀서 구체화
    main 함수 아래에 기능을 제대로 수행할 수 있는 기능을 수행

  • 예시

    진한 녹색 : 실인수
    갈색 : 형식인수 (가인수)


함수의 호출 방식

  • 값의 의한 호출 ( Call by Value )
    함수 호출 시에 해당 함수에 인자 값들이 존재하면 실인수의 값을 형식인수(가인수)에 복사하여 넘겨주게 된다.
  • 함수에 포함된 형식인수의 값이 변화하여도 실인수에는 아무런 영향을 미치지 않는다.

  • 주소에 의한 호출 ( Call By Reference )
    함수 호출 시에 해당 함수에 인자 값들이 존재하면 실인수가 가지고 있는 주소(포인터) 를 형식인수(가인수) 또한 같이 가리키게 된다. 
    실인수가 가지고 있는 주소(지점,포인터)라 한다. 형식인수가 같은 주소를 가리키고 있기 때문에 함수 안에 형식인수에 변화를 주게 되면 실인수에도 영향을 끼치게 된다.





함수와 프로시저가 존재한다.

함수와 프로시저의 개념과 각각의 명칭에 대해 정확히 알기

프로시저는 함수의 바디 부분에 해당하는 부분의 순서도이다.

출처 : soen.kr



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

표준함수  (0) 2016.03.19
기억부류  (0) 2016.03.19
연산자  (0) 2016.03.14
제어문  (0) 2016.03.13
getch / getche / getchar / putchar / puts  (0) 2016.03.11


연산자의 종류

  • 데이터 : 불규치학게 널려 있는 여러가지 형태의 수치나 문자열. 사실적인 정보.
    정보 : 데이터를 가공하여 사용할 수 있도록 정리된 유용한 것

     기능별 종류 

     연산자

     산술 연산자

     + - * / %

     부호 연산자

     + -

     대입 연산자

     = 복합 대입 연산자

     관계 연산자

     == != <= < >= > 

     증감 연산자 ++ -- 
     포인터 연산자 * & [] 
     구조체 연산자 . -> 
     논리 연산자 || && ! 
     비트 연산자 | & ~ >> <<

     삼항 조건 연산자

     : ?

     쉼표 연산자

     ,

     sizeof 연산자

     sizeof

     캐스트 연산자

     (type)type()

     괄호 연산자

     ()

     C++ 연산자

     new delete :: .* ->*



산술 연산자

  • 산술 연산자
        - 더하고 곱하고 빼고 나누는 가장 기본적이고 또한 가장 많이 사용 되는 연산자

        - 일상해서 주로 사용하는 연산자
        - +, - 기호와 평상시에는 X를 쓰지만 알파벳과 비슷해 *를 사용
        - ¸ 기호를 사용하지만 없어서 / 를 이용 
        - /의 경우 피연산자의 파입에 따라 다르다
        - 피연산자가 모두 정수형이면 결과도 정수형
        - 피연산자 중 실수형이 있으면 결과도 실수형이다.

  • 대입연산자
        - 변수에 어떤 값을 집어 넣는 동작이며 대입 연산자는 변수의 값을 변경할 때 사용
          (예시 : i=1 / i 라는 값에 1을 대입한다 라는 뜻)
        - 좌변에는 항상 변수만 올 수 있다.
          (실제적인 메모리를 점유하고 있고 값을 바꿀 수 있는 대상)
          1=a+2; / a+b = 4 와 같은 형태는 불가능.
        - 연산자의 리턴값
        


a=5; b=5; c=5; 를 줄이면


a=b=c=5; 와 같은 형태로 줄일 수 있다.

  • 복합 대입 연산자 
        - 대입연산자와 다른 연산자가 결합된 연산자
         a = a+3; => a+=3;

  • 증감 연산자
        - 피연산자를 1씩 증가 시키거나 감소 시킨다
        - 루프의 제어 변수처럼 순서대로 어떤 작업을 할 때는 변수값을 하나씩 증감시키는 경우가
           많아 별도의 연산자 장치가 마련 (++ : 증가, --  : 감소)
        - 전위형(Prefix) : 증감연산자가 피연산자 앞에 위치 ( ++a, --a )
        - 후위형(Postfix) : 증감연산자가 피연산자 뒤에 위치 ( a++, a-- )
        - 다른 언어에는 없는 C 언어의 아주 독특한 연산자이며 사용해 보면 아주 편리
       


논리 연산자

  • 관계 연산자
        - 피연산자를 두 개 취하는 이항 연산자이며 좌변과 우변을 비교하여 같은지, 다른지, 다르면
          어느 쪽이 더 큰지 조사


 연산자 

 조건

 ==

 좌변과 우변이 같다.

 !=

 좌변과 우변이 다르다.

 >

 좌변과 우변보다 크다.

 <

 좌변과 우변보다 작다.

 >=

 좌변과 우변보다 크거나 같다.

 <=

 좌변과 우변보다 작거나 같다.


  • 논리 연산자
        - 주로 관계 연산자와 함께 사용되며 두 개 이상의 조건식을 결합하여 하나의 진리 값을 만든다
        - ! 연산자는 조건식 하나를 피연산자로 취하는 단항연산자로서 조건식을 반대로 바꾼다
          결과 : 거짓 => 참 / 참 => 거짓

 연산자 

 조건

 !

 좌변과 우변이 같다.

 &&

 좌변과 우변이 다르다.

 ||

 좌변과 우변보다 작거나 같다.


- && 연산자와 || 연산자는 두 개의 논리식을 피연산자로 가지는 이항 연산자
  두 논리식의 값을 정해진 규칙에 따라 결합하여 하나의 진리 값(아래 참고할 진리표)


 좌변 논리식 

 우변 논리식

 && 연산자

 || 연산자

 1

 1

 0

 0




  • 비트 연산자
        - 논리 연산자와 비슷하지만 비트를 연산 대상으로 한다는 점이 다르다.
        - 비트란 기억장치의 최소 단위로서 1 또는 0을 기억하면 8개의 비트가 모여야 1바이트

 연산자 

 설명

 ~

 비트를 반전 시킨다. 

 & 대응되는 비트가 모두 1일 때 1이다. 
 | 대응되는 비트가 모두 0일 때 0이다.

 ^

 두 개의 비트가 달라야 1이다. 

 <<

 지정한 수 만큼 왼쪽으로 비트들을 이동시킨다. 

 >>

 지정한 수 만큼 오른쪽으로 비트들을 이동시킨다. 


 b1

 b2

 b1 & b2

 b1 | b2

 b1 ^ b2

 ~b1

 0

 1

 0  0 

 0

 1

 0

 1

 0  1  0  1 

 1

 0 

 0

 1

0

 0

 1

 1 

 1  1 

0

 0


  • 쉬프트 연산자
        - 비트들을 지정한 수 만큼 좌우로 이동시킨다.
        - >> 연산자는 오른쪽으로 이동시키며 << 왼쪽으로 비트들을 이동시킨다.
       


<우측이동 쉬프트>                               <좌측이동 쉬프트>

  • 쉬프트 연산과 곱셉
        - 쉬프트를 왼쪽으로 한칸 해보면 입력한 수의 정확하게 2배 되는 값이
          출력 5를 입력하면 10, 100을 입력하면 200이 출력
          a << b == 1 * 2^b
            

  • 회전 연산
        - 쉬프트 연산과 유사한 비트 조작 명령
          쉬프트는 비트를 선형으로 이동시키는데 비해 회전 연산은 원형으로 이동시킨다.
          비트 이동에 의해 밀려나는 비트는 버려지지 않고 반대쪽으로 다시 이동.
          <rotl, rotr 함수 사용>



기타 연산자

  • 삼항 조건 연산자 : (조건식)? 값1:값2
    다른언어에는 없는 C언어의 톡특한 연산자
    조건식의 값이 참이면 값1 거짓이면 값를 리턴
    if문을 이용해서도 변환이 가능하다.

  • 쉼표연산자 : , 사용, 
    피연산자로 양쪽에 두 개의 표현식을 취해 좌변->우변 순서로 평가하고 우변의 연산 결과를 리턴
    두 개의 표현식을 하나로 합칠 수 있다.

  • sizeof 연산자
    sizeof(타입 Or qustn)
    피연산자로 int, double같은 타입이나 변수를 이용하거나 상수를 사용할 수도 있다.

  • 캐스트 연산자
    (타입)변수 => C언어타입
    타입(변수) => C++ 타입
    수식 내에서 변수의 타입을 강제로 다른 타입으로 변경


연산 규칙

  • 연산 순위

    순위

    연산자

    결합순서

    1

    ( ) [ ] -> .

    왼쪽 우선

    2

    ! ~ ++ -- + -(부호) *(포인터) & sizeof 캐스트

    오른쪽 우선

    3

    *(곱셈) / %

    왼쪽 우선

    4

    + -(덧셈, 뺄셈)

    왼쪽 우선

    5

    << >>

    왼쪽 우선

    6

    < <= > >=

    왼쪽 우선

    7

    == !=

    왼쪽 우선

    8

    &

    왼쪽 우선

    9

    ^

    왼쪽 우선

    10

    |

    왼쪽 우선

    11

    &&

    왼쪽 우선

    12

    ||

    왼쪽 우선

    13

    ? :

    오른쪽 우선

    14

    = 복합대입

    오른쪽 우선

    15

    ,

    왼쪽 우선


  • 결합 순서
        - 수식 내에 같은 종류의 연산자가 있을 때 어떤 방향의 연산을 먼저 수행할 것인가를 지정
        - 다른 종류의 연산자에 대한 실행 순서인 반면 결합순서는 같은 연산자 또는 같은 순위
            내의 다른 연산자의 실행순서 지정
    (double)(unsigned)i; 의 경우 unsigned => double

  • 산술 변화
        - 데이터 타입이 조금 다른 변수 끼리라도 자동으로 변호나 가능한 연산을 허용



연산자는 산술, 논리, 기타 등으로 구성된다

연산 규칙에는 순위와 결합순서 산술변화 등으로 구성된다.                                                                     

출처 : Soen(soen.kr)



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

기억부류  (0) 2016.03.19
함수와 프로시저  (0) 2016.03.18
제어문  (0) 2016.03.13
getch / getche / getchar / putchar / puts  (0) 2016.03.11
printf 서식문자  (0) 2016.03.10


조건문(if문)

  • 주어진 조건에 따라 명령의 실행 여부를 결정하는 문장. 프로그램이란 항상 동일한 결과만 출력하는 것이 아니라 다양한 상황을 판단하여 다르게 동작하기도 한다. 

  • if (조건) 명령;
    괄호안에 조건을 쓰고 이 조건이 만족할 떄 실행할 명령을 괄호 뒤에 작성.

 연산자 

 조건

 ==

 좌변과 우변이 같다.

 !=

 좌변과 우변이 다르다. 

 >

 좌변이 우변보다 크다.

 <

 좌변이 우변보다 작다.

 >=

 좌변이 우변보다 크거나 같다.

 <=

 좌변이 우변보다 작거나 같다.

  • 예시 ( 제어문 순서 )

  • if(조건1) 명령1; else if (조건2) 명령2; else 명령3;




반복문 (for문)

  • 비슷한 명령들을 여러번 실해앟는 제어 구조
    컴퓨터가 처리하는 데이터가 원래 반복적인 성격을 가지고 있기 때문에 많이 사용 된다.

  • for(초기식;조건식;증감식) 명령
  • 다중 반복문 (for문의 반복)


반복문(while문)

  • for문과 유사한 반복문이되 성격이 다르다.
    기본 형식 : while(조건) 명령;
    if문의 경우 한번의 조건만 판단하여 명령의 실행여부를 결정하지만
    while문은 조건이 만족하는 동안 명령을 실행한다.

  • do 명령; while(조건)
    do 다음의 명령을 while의 조건이 만족하는 동안 반복적으로 실행

  • for문 while문 do~while 문 비교


switch문

  • 다중선택문 하나의 변수 값을 평가하여 각 값에 대해 개별적인 처리 지정.
    switch (변수)
    {
        case 1:명령1;break;
        case 2:명령2;break;
        ....
        case n:명령n;break;
        default:명령;break.
    }

  • 동작 원리


그 외

  • goto 지정한 곳으로 무조건 점프 하는 제어문
    제어로 움직일 곳을 here: 이런 형태로 레이블이라는 것으로 표식을 단다.
    블록의 끝을 제외한 모든 곳에서 이동이 가능 하다. (단, 같은 함수 내에서만 가능)



  • break : 반복 문이나 switch문 내에서 루프를 강제로 벗어날 때 사용.
    for문 혹은 while문 내에서 break가 사용되면 조건식의 진위여부에 상관 없이 루프를 탈출한다.

  • continue : 루프의 나머지 부분을 무시하고 조건 점건부로 점프하여 루프의 다음 값을 실행


반복문과 선택 다중선택 문이 존재한다.

for문 while문 do~while문은 반복문에 해당하고
if문과 if~else문 if~else if~else 문 그리고 switch문이 존재한다.

반복문 또한 if문의 반복과 goto 함수(괄호의 처음으로 가는 함수)가 동작하도록 
내부구성이 되어있다.
그 외에 goto,break,continue 등 반복문과 if문, switch문에서 사용되는 제어문이
존재한다.

출처 : soen(soen.kr)

연습과제

0314_if_exam.c



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

함수와 프로시저  (0) 2016.03.18
연산자  (0) 2016.03.14
getch / getche / getchar / putchar / puts  (0) 2016.03.11
printf 서식문자  (0) 2016.03.10
변수와 상수  (0) 2016.03.08


getch

  • 하나의 문자만 입력 받는다. scanf는 문자와 숫자 입력 후에 Enter 키를 입력해야하지만 getch 는 누르는 하나의 문자만 조사하므로 Enter를 누르지 않아도 된다. 
    하지만 입력 즉시 검사 하기 때문에 키보드를 누르게 되면 입력을 취소 할 수 없다.

    즉, 입력 즉시 검사를 하기 때문에 버퍼에 담아둘 필요가 없고 바로 결과 값이 아래 예시의 변수select에 바로 들어간다.

  • <예시>
    printf("게임을 계속 하시겠습니까?(Y/N");
    int select = getch();
    위와 같이 사용하면 입력된 값이 있으면 그 해당 하는 키 값(ASCII 코드)을 리턴한다.
    char select = getch();
    형태로 사용할 경우에는 해당 문자가 리턴된다.

  • getch(); 만 사용할 경우에는 아무키가 눌릴 때 까지 입력 대기 상태가 되므로 
    게임에서 Press Any Key 와 같은 형태로 사용이 가능하다.

  • 종료 인식 시에는 '\r' 로 인식한다.


getche 

  • getch와 크게 다르지는 않다. 하지만 getche의 경우 getch + echo 의 합성된 형태로 입력과 동시에 입력된 값을 출력해 준다. 

  • <예시>
    char ch = getche();
    printf("%c",ch);
    위와 같은 경우에 'A'를 입력할 경우 바로 'AA' 두개가 찍히게 된다.

  • 종료 인식 시에는 '\r' 로 인식한다. 또한 위의 getch와 getche의 경우에는 conino.h 를 꼭 include 시켜야 한다. console and port Input / Output 의 약자이며 윈도우즈에서만 쓸 수 있는 비표준 함수들이 들어 있습니다. 


getchar

  • getchar() 한글자를 입력받은 함수이이지만, 입력버퍼를 사용하므로, Enter가 입력될 때까지 입력을 계속 받아 버퍼에 담아두고, 엔터가 들어오면 입력을 종료하고 버퍼 중에서 가장 첫번째 글자를 리턴한다. 

  • <예시>
    char ch = getchar();
    printf("%c\n",ch);
    입력을 TestA 할 경우 출력을 하면 T 하나만 출력되게 된다.

  • 종료 인식 시에는 '\n'로 인식한다. 윈도우즈에서 쓸 수 있는 표준 입출력 함수에 포함된다.


putchar

  • 표준 문자 출력 함수로 원형은 아래와 같다.
    int putchar ( int character );
    인자는 표준 출력에 쓸 문자. 이 때 문자는 int 형태로 형변환되어 전달.
    오류가 없으면 표준 출력에 씌여진 문자가 반환, 오류가 발생 시 EOF 가 반환되고
    오류 표시자가 설정된다.

  • <예시>
    char ch = 'A';
    putchar(ch);
    위의 소스에서 보듯 출력을 하게 되면 'A'라는 값만 출력된다.


puts

  • 표준 출력에 문자열을 사용한다. 함수의 원형은
    int puts ( const char * str );
    자동으로 '\n'도 추가로 쓴다. 즉, 문자열에 \n이 마지막에 없더라도 추가가 된다.
    인자 str은 표준 출력에 쓰여질 문자열
    성공적으로 쓰이면 음이아닌 값이 리턴된다. 오류가 발생하였다면 EOF를 리턴

  • <예시>
    char str[] = "Welcome to Hell!!";
    puts(str);
    위 소스를 컴파일 후 실행하게 되면 
    Welcome to Hell!! 이 출력된 후 개행("\n")된다.

결론

비교

getchar()

 getche()

getch() 

버퍼 사용

O

X

X

화면 표시

O

O

X

종료 인식

\n

\r

\r


puts 는 문자열 putch 는 문자만 출력하게 된다.

출처 : C언어파트(http://kcoder.tistory.com/ and http://itguru.tistory.com/)


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

연산자  (0) 2016.03.14
제어문  (0) 2016.03.13
printf 서식문자  (0) 2016.03.10
변수와 상수  (0) 2016.03.08
주석  (0) 2016.03.08


서식문자

자료형

출력형태

%hd

short, short int

10진 정수 출력(2바이트)

%d or %i

int

10진 정수로 출력(4바이트)

%ld

long int, long

10진 정수로 출력(8바이트)

%o

int

 8진 정수로 출력

%x

int

16진수 정수로 출력
(대문자 X를 쓰면 A~F까지의 숫자도
대문자 출력) 

%u

unsigned int 

부호없는 10진 정수로 출력 

%c

 char

1개의 문자

%s

 char *

문자열

%f

float

고정 소수점 형식의 실수 출력 

%e or %E

 

부동 소수점 형식의 실수 출력 

 %g or %G


 

%p

 void *

 포인터의 주소 출력

%n

 int *

출력된 문자 개수를 포인터 변수에 대입

%ld

long int

long형 10진 정수 출력 

%lf

double(long float)

long형 고정 소수점 형식의 실수 출력 


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

연산자  (0) 2016.03.14
제어문  (0) 2016.03.13
getch / getche / getchar / putchar / puts  (0) 2016.03.11
변수와 상수  (0) 2016.03.08
주석  (0) 2016.03.08



변수의 필요성

  • 변수의 필요성은 크게 2가지
    데이터의 보존과 관리
    데이터를 보존하고 필요시에 참조하고 관리하기 위해 변수를 사용

  • 데이터 처리를 위해 주기억장치나 보조기억장치에 저장
    데이터를 저장하기 위해서 메모리 공간을 할당하고 그 공간에 데이터를 보존
    보존된 데이터를 가공(읽고/쓰기)하기 위해 공간을 할당하고 관리하기 위해 이름을 부여

  • 프로그램을 할 때 각각의 데이터들은 고유의 주소를 가지고 있다.
    모든 메모리는 16진수의 숫자로 표시 (0xff00efa3)
    표기된 공간에 데이터를 저장
    예시 : 집주소와 집에 사는 사람을 주소와 데이터에 비유

  • 모든 메모리를 0xff00efa3에 3이라는 값이 살고 있어 0xe0e0d0e0에는 10이라는 값이 살고 있다는 형태로 기억하며 프로그램을 만들기 어렵습니다. 주소를 전부 외우기 어렵기 때문입니다.

  • 그렇기 때문에 0xff00efa3 라는 메모리 주소를 A, 0xe0e0d0e0 이라는 메모리 주소를 B라는 이름을 부여하여 컴퓨터와 프로그래밍 언어가 상호간에 약속을 하고 A에 3, B에 10을 대입하면 컴퓨터가 A,B의 이름이 부여된 공간의 주소로 가서 그곳에 3과 10이라는 값을 넣게 됩니다.

  • 데이터를 보존하고 필요시에 참조하고 관리하기 위해 변수를 사용
    변수를 사용하는 목적은 데이터의 보존과 관리(읽기/쓰기)


변수 (Variable)

  • 변수의 사전적 의미 : 어떠한 관계나 범위 안에서 여러가지의 값으로 변할 수 있는 수
    변수의 프로그래밍적 의미 : 데이터를 저장할 수 있는 메모리 공간
    프로그램이 실행 중에 변하는 값을 처리(읽기/쓰기) 할 수 있는 데이터

  • 변수의 고려사항
    1. 생명주기 : 변수의 생성 소멸시기를 판단
                (생명주기에 따라 전역변수, 지역변수, 정적변수로 구분)

    2. 참조가능 범위 : 변수의 데이터를 언제 참조해야 할지의 결정
                     어디서 참조하고 어디서 참조 안해도 되는지 여부 
                     (생명주기와 밀접한 관계가 있으므로 생명주기에 따라 범위도 결정)

    3.자료형(데이터유형) : 어떠한 형태로 변수를 컴퓨터에 선언할지 여부
                         (정수, 실수, 문자 등 어떤것을 저장하느냐에 따라 판단)

    4.데이터의 크기 : 메모리를 얼마의 크기로 만들지 판단
     (메모리 공간)    단순히 숫자정수라도 데이터 범위에 따라 2byte, 4byte로 선언할 지 판단
                    ( 2바이트는 0~ 655535 음수를 사용할 경우 -32768 ~ 32767 )

    5.저장되는 값의 유형 : 숫자나 문자 같은 값을 저장할지 주소 값 자체를 저장할지 여부 판단

    6.초기화 여부 : 변수를 선언시 기본적으로 공간(주소)만 할당해주기 때문에 내부에는
                  쓰레기값(쓸 수 없는 값)이 남아 있기 때문에 청소를 해줄지 말지의 여부 판단

[그림 1]


[그림 2]
  • [그림 1] 에서 A라는 변수의 이름이 만들어 질 때 [그림 2]에서 빨간선으로 보이는 메모리에 경계영역을 설정 이후에 경계영역은 자료형의 타입에 따라 크기가 결정
    그 후에 경계영역은 사용자가 지정한 이름을 A라고 운영체제에서 지정 (우리는 사용만 하게 된다)

  • 할당된 공간에는 사용할 수 없는 값인 쓰레기 값이 존재
    이유는 메모리가 해제될 때 (변수 소멸 시) 경계영역만 없애기 때문에 이전에 사용한 데이터는 그대로 남아있고 어떠한 값이 얼마에 크기로 들어 있는지 할 수 없기 때문에 쓰레기 값이라 부르는 것

  • 변수 선언 형태

    #include <stdio.h>
    void main(void)
    {
        int    nNum;
    }


상수 (Constant)

  • 상수의 사전적 의미 : 변수의 상대적 의미로 어떠한 상황에도 변화지 않는 수
    상수의 프로그래밍적 의미 : 사용자가 한 번 정해지면 값을 변경할 수 없는 변수 또는 값
    프로그램 실행 중에는 변경할 수 없는 데이터!!!!!!!!!!

  • 리터럴(Literal) 상수
    변수의 이름이 없고 그 값 자체가 상수인 것
    메모리공간 어딘가에 살당은 되어지고 읽기는 가능하지만 변경은 불가
    -  정수형 상수
        1. 10진수 : -1, 2, 3, 0 등으로 표현되는 일반적인 수
        2. 8 진수 : 앞에 숫자 0을 붙여서 표현 8진수 10의 경우 010으로 표현
        3. 16진수 : 앞에 숫자 0과 알파벳 x(Hex의 x) or X 를 붙여 표현
                16진수 A7은 0xA7 혹은 0XA7으로 표현(주로 주소표현에 사용)
        4. 2 진수 : 일반적으로 8bit로 표현 < 0110 0001 과 같이 표현 >
    -  문자형 상수
        - 문자형 상수는 작은 다옴표 ' ' 로 표현.
        - 1개의 문자를 표한하기 위해 사용되며 '1', 'a', 'c', '8' 과 같이 1byte로 표현
          (문자집합에 따라 유니코드에서는 2바이트로 표현)
        - 문자도 상수도 내부저긍로는 숫자 ASCII(아스키 코드표)상에 정해져 있는 값
        문자들의 값이 정해져 있어 문자 '0' 은 내부적으로 48이라는 값, 문자 'A'의 경우 41의 값 
                                        [아스키코드표]

    - 실수형 상수
    IEEE 754표준에 따른 부동 소수점 방식
    실수형 상수는 소수점 가지는 상수 < 1.2, 3.0f, 4.323e, 3.33213e-2 >

    - 문자열 상수
    문자열 상수는 " " 큰따옴표로 표시되며, 문자들의 집합이라는 의미에서 문자열이라 칭한다
    "고길동", "이름", "a" 이런식으로 큰따옴표 사이에 여러개의 문자 사용
    문자형 상수 'a'와 문자열 상수 "a" 다르며 'a'은 문자 a, "a" 는 문자열 a라 부릅니다

  • 심볼릭(Symbolic) 상수
    지정된 특정 변수의 데이터를 변경하지 못하도록 상수화(Constant)하여 사용하거나 상수로 정의된 값을 이름으로 지정해서 상수를 상징적으로 사용하는 상수들

    1. 리터럴 상수와의 차이점
        - 리터럴 상수는 변수의 이름이 없고 값 자체가 상수화
        - 심볼릭 상수는 변수를 상수화시켜서 사용하던가 특정 이름을 지정


    2. 심볼릭 상수의 종류
        - const (변수의 상수화)
            선언하는 변수의 앞에 const 키워드를 붙여 상수화
            변수의 값을 바꿀 수 없기 때문에 반드시 선언과 동시에 초기화를 진행해서 시킵니다.
          변수는 선언되어지면서 쓰레기 값이 들어가 있기 때문에 쓰레기 상수는 문법상 에러처리

        - define (정의 상수화)
            전처리 명령 중 하나인 #define 명령으로 특정 이름을 지정해서 상수값으로 처리
            <예시 : #define MAX 10 / MAX란 이름을 모두 10으로 상수 처리>


결론

변수는 데이터를 보존하거나 관리의 주목적
상수는 정해진 값을 사용하기만 하고 변경은 하지 않는게 주목적
변경되지 않아야할 모든 데이터는 상수화 시켜서 사용하는 것이 바람직
수시로 변경되는 데이터는 변수로 선언하는 것이 바람직

출처 : http://blog.naver.com/jerokill/20198649799


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

연산자  (0) 2016.03.14
제어문  (0) 2016.03.13
getch / getche / getchar / putchar / puts  (0) 2016.03.11
printf 서식문자  (0) 2016.03.10
주석  (0) 2016.03.08



주석

  • 사전적 의미 : 낱말이나 문장의 뜻을 쉽게 풀이
    간단히 말해 코멘트 혹은 설명
  • 흔히 말하는 좋은 프로그램의 조건인 유연성/가독성/일관성 등을 예를 드는데
    보기 쉽다는 말은 "가독성" 부분에 해당하는 중욯한 조건
  • 내가 짠 소스에 달아 놓은 설명이 아니라 내가 앞으로 짤 소스에 다는 이정표
    즉, 프로그램을 짜기전에 설계를 해두고 설계대로 할 수 있도록 해주는 이정표
  • 주석에 작성된 코드는 컴파일 시 컴파일러가 무시하고 빌딩을 진행
  • 주의사항 : 남발 시에 가독성이 떨어지는 요소가 될 수 있다


종류

  • 한줄 주석 : //
    말 그대로 한줄만 주석으로 처리하는 것
    // 이런식으로 사용
    // 두줄 처리시 두개를 사용
  • // 두줄만 쓰고 필요한 내용을 적는 것 
    => 일반적으로 초록색으로 처리
    ///        // 이 것이 2개 이상이면 상관 없다.
    //////////// 
    /////////////////////////////////////////
    //< 
    //<(*#@&^$(*&#
    // 무조건 시작만 //으로 한다면 한줄 주석 예시


  • 다줄 주석 : /* */
    /* : 다줄 주석의 시작
    */ : 다줄 주석의 끝
    /* 
        다줄 주석
        한번에 여러개 처리가능
        // 중간에 한줄주석 가능
    */
  • 다줄 주석 안에서 다줄 주석 사용시 에러
    /* 내용/내용
     /* 다줄주석 또 사용시 마지막 */ 
    인식하지 못해 에러 발생
    */


주석의 활용

  • 주석의 활용 방법 4가지
    함수를 제작 시
    변수를 선언 시
    제작자의 의도를 알려줄 때
    프로그램의 사용법을 알려줄 때
  • 프로그램을 만들 때 보통은 어떤 식으로 진행할지 순서를 정하고 처리하는 것
    그래서 설계를 하는 이유이기도 합니다. 하지만, 프로그램을 작성하면서 지속적으로 노트를 보고 만들진 않습니다.
  • 위와 같은 경우에 주석을 활용하게 됩니다. 
    • 예제
      /* 이 프로그램은 정수 한개를 입력 받아 그 정수만큼 이름을 출력하는 프로그램 */
      #include <stdio.h>

      void main(void)
      {
          //< 입력 받을 정수 변수 선언
          //< 반복초기 변수 선언
          //< 정수입력 안내문
          //< 정수입력
          //< 반복문을 입력받은 정수 까지 반복
          //< 이름을 출력 

      위와 같이 1차 구성 후 아래의 프로그램을 작성하게 됩니다.
      #include <stdio.h>

      void main(void)
      {
          //< 입력 받을 정수 변수 선언
          int input;
          //< 반복초기 변수 선언
          int i;
          //< 정수입력 안내문
          printf("정수입력:");
          //< 정수입력
          scanf("%d",&input);
          //< 반복문을 입력받은 정수 까지 반복
          for(i=0; i<input; i++)
          {
              //< 이름을 출력 
              printf("홍길동!@#@\n");
          }
      }

결론 

가독성과 일관성이 좋은 코드를 위해 주석을 사용합니다.
미리 이런 습관을 가지는 것이 좋습니다.

출처 : http://blog.naver.com/jerokill/20198515232


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

연산자  (0) 2016.03.14
제어문  (0) 2016.03.13
getch / getche / getchar / putchar / puts  (0) 2016.03.11
printf 서식문자  (0) 2016.03.10
변수와 상수  (0) 2016.03.08

+ Recent posts