절차지향 프로그래밍

-       큰 문제를 작은 문제 단위로 쪼개어 순차적으로 진행되는 형태

 

객체지향 프로그래밍

-       기능 단위로 구분하여 각 기능들을 조립하여 하나의 프로그래밍을 만드는 형태

 

등장배경

하드웨어가 빨라지고 대용량화 되는 시기에 소프트웨어가 하드웨어의 성장을 따라가기 힘든 상황이 발생하였고 그 상황이 바로 소프트웨어의 위기이다

그에 따라 소프트웨어의 대응책으로 여러 가지 개발방법이 생겨 났고 그 중에 가장 탁월한 기법인 객체지향적 프로그래밍(Object Oriented Programming)방식이다

 

객체지향적 프로그래밍(Object Oriented Programming) 특징

캡슐화 ( Encapsulation )

-       데이터와 기능을 하나의 단위로 묶는 과정

Why?

-       독립적이며 프로그램의 부품으로 활용

정보 은폐 ( Information Hiding )

-       외부에서 사용하는 기능만 제공하고 나머지는 숨기는 것

Why?

-       객체의 손상을 방지하기 위해서

추상화 ( Abstraction )

-       캡슐화와 정보 은폐를 통해 외부의 사용자에게 제공하는 인터페이스를 설계하는 과정

Why?

-       객체의 효율적이고 안전한 사용을 위해서

 

상속 ( Inheritance )

-       추상화를 통해 만들어진 기본 클래스 ( Based Class )를 기반으로 모든 속성이나 기능을 물려 받아 새로운 클래스를 만드는 것. ( 파생 클래스 : Derived Class )

Why?

-       필요한 기능을 추가 / 변경 / 제거 하여 새로운 클래스를 만들 수 있기 때문에

 

다형성 ( Polymorphism )

-       똑같은 호출이라도 상황에 따라 같거나 다른 동작을 수행 하는 것.

Why?

-       코드의 일관성

 

접근지시자 ( Access Specifier )

-       클래스 멤버들의 허용 범위를 지정하는 것

-        

클래스의 기본 접근권한은 private

 

클래스 내부

상속 클래스

외부 클래스

public

가능

가능

가능

protected

가능

가능

불가능

private

가능

불가능

불가능


 상수 포인터 int * const p



int * const p

포인터 자체가 상수화 된다.

주소는 변경이 불가능하고, 가리키는 곳의 값은 역참조로 변경이 가능

 



 상수 지시 포인터 const int *p



포인터가 지시하는 곳의 값을 상수화 시킨다

주소는 변경이 가능하지만, 가리키는 곳의 값은 역참조로 변경이 안된다.

char *name = "홍길동"

*name='a'; 오류

 



 상수 지시 상수 포인터 const int * const p



포인터 변수와 가리키는 곳은 상수화

주소와 가리키는 곳 모두 변경이 불가능

 



 포인터 상수 ( 배열포인터 )  int arr[5]



배열 포인터라고도 부르며 상수 포인터와 비슷한 의미

배열명만 포인터 상수라 부른다

 일반 포인터의 경우 4바이트에 메모리를 가지지만

배열의 경우 메모리를 가지고 있지 않고,

찾아가기 위해 존재하는 상징적인 포인터

arr = &num <= 에러존재



 배열명의 의미



포인터 상수이기 때문에 l-value에 위치 불가능

일반 포인터와 다르게 메모리 공간을 따로 미할당

배열의 첫번째 요소의 주소를 상직적으로 표현

l-value에 위치하지만 않으면 일반포인터의 모든 연산 수행 가능

배열포인터라 불림

배열로 선언된 지역의 메모리 공간을 대표하는 상징 (모배열)

 



 포인터 배열과 배열 포인터



포인터 배열
각각의 요소가 포인터로 이루어진 배열

int *arr[5]

배열 포인터

int형 타입이 5개로 이루어진 배열을 지시하는 포인터

int (*arr)[5]

 



 문자열



문자열? NULL(숫자 0, '\0') 으로 끝나는 char 타입의 데이터 집합

문자배열 : char name[5]={'a','b','c','d','e'}

| 'a' | 'b' | 'c' | 'd' | 'e' | 

문자열 : char name[5]="abcde"

| 'a' | 'b' | 'c' | 'd' | 'e' | '\0' |

위 같은 경우 문자열은 끝에 NULL('\0') 문자가 삽입

 



 문자열 상수와 문자열



문자열 상수인 char *name = "abcd" 인 경우

name이라는 이름을 가진 하나의 포인터가 "abcd"라는 문자열 상수를 가리키게 된다

따라서 상수를 참조하게 되므로 문자열 수정이 불가능

문자열인 char name[5]="abcd"인 경우

메모리를 직접 할당한 문자열. 즉, 배열참조형식 이므로 문자열수정이 가능 

 



 문자열 함수



strlen : NULL을 제외한 길이를 구하는 함수 

원형 : size_t strlen( const char *str )

 - str에서 NULL을 제외한 길이를 구하는 함수 


strcpy : 문자열 복사 함수 

원형 : char *strcpy( char* dest , const char *src )

 - dest에 src를 복사하는 함수


strcat : 문자열 결합 함수

원형 : char *strcat( char* dest , const char *src )

 - dest와 src를 결합하는 함수


strcmp 

원형 : int strcmp( const char *dest, const char *src )

 - dest와 src를 비교


이외에 여러가지지가 있으나 위에 4가지가 많이 쓰인다. 

 



 포인터 배열과 배열 포인터의 차이를 알고 포인터를 상수화하는 방법을 알아보았다

 포인터 배열 말 그대로 포인터로 이루어진 배열이고 배열 포인터는 배열을 가리키는 포인터

 상수 지시 포인터와 상수 포인터를 정확히 알고 쓰자!! 

출처 : soen.kr / 학원



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

배열  (0) 2016.03.25
표준함수  (0) 2016.03.19
기억부류  (0) 2016.03.19
함수와 프로시저  (0) 2016.03.18
연산자  (0) 2016.03.14

 배열의 정의



배열은 동일한 타입을 가지는 변수들의 유한 집합
- 배열의 기본형식
- type 배열명[크기][크기]....;
- 배열명은 배열의 이름이고 [] 괄호 사이에 있는 값은 몇 개의 단위가 묶여서 구성하는지 지정하며 자연수로된 상수만 적어야 한다.

 



 배열의 특징


  1. 배열의 요소의 번호인 첨자는 항상 0부터 시작한다(Zero Base)
    - 컴퓨터의 첫번째 시작은 항상 0이다.
    - int a[5]; 라고 선언된 배열의 시작은 0~4 ( n-1 )의 번호이다.

  2. 배열의 총 메모리 양은 배열의 크기에 배열의 요소의 크기를 곱해서 구할 수 있다
    - sizeof(타입) * 정수(크기, 갯수)
        예시> int a[5]; => sizeof(int) * 5 => 4byte * 5 => 20byte
    - 배열의 크기 = sizeof(배열) / sizeof(배열[0])
        예시> sizeof(int a[5])/sizeof(a[0]) => 20byte / 4byte => 5개

  3. 배열을 선언 시 크기값은 반드시 상수 이어야 한다.
    - 배열의 생성 시는 상수를 입력해 주어야 하지만,
      생성 이후에는 i라는 int형 변수값을 첨자로 사용할 수 있다.

  4. 배열의 범위를 점검하지 않는다.
    - int ar[5]; 로 정해져 있는 경우 int a[8]; 이면 컴파일은 되지만 정상적인 실행은 되질 않는다.
        그렇기 때문에 보통은 반복문을 이용해서 배열의 범위만큼만 루프를 돌도록 해주면 배열의 범위를 벗어나지 않는다.
    - for (i=0;i<5;i++)
      {
        if( i>=0 && i< 5)
       {
            x += a[i];
       }
    }
     


 다차원 배열



2차원 배열은 [] 첨자 두 개를 사용하는 배열이고 차원이 늘어날 수록 [] 첨자 연산자가 늘어날 수록 차원이 높아진다.


int apple[3][6]; 
정수형 변수 6개가 3개의 묶음으로 생성 된다. 생성되는 배열 요소는 6 * 3 = 18개를 apple 이라는 배열명으로 선언한 것.

Apple[0][0]

Apple[0][1]

Apple[0][2]

Apple[0][3]

Apple[0][4]

Apple[1][0]

Apple[1][1]

Apple[1][2]

Apple[1][3]

Apple[1][4]

Apple[2][0]

Apple[2][1]

Apple[2][2]

Apple[2][3]

Apple[2][4]


이 배열이 메모리상에 생성된 모양을 그려보면 위와 같다. 하지만 메모리는 선형적인 구조이기 때문에 이해를 돕기위해 위와 같이 그려서 관리할 뿐 실제로는 일직선으로 연결 되어 있다. 


배열명은 단독으로 사용되는 배열의 시작번지값을 가지는 포인터 상수이다.

즉, 배열명만 쓰면 배열의 시작번지를 가리키는 포인터 값이 된다.

 



 배열 초기화



배열은 여러 변수들의 집합이며 정수형 변수나 실수형 변수와 자격은 동일하며 변수에 적용되는 규칙이 배열에서 똑같이 적용된다.
배열의 부류 지정자도 일반 변수와 동일하며 효과 또한 동일하다. 

int apple[5]; 와 같이 초기화를 하지 않을 경우 쓰레기 값이 들어가게 된다. 


type 배열명[크기]={초기화값들};


int apple[5] = {4,8,3,69,-7};

위와 같이 선언과 동시에 초기화를 메모리를 할당 받음과 동시에 초기화 값들로 메모리를 채운다.

초기식 int number[1000] = {1,2,3,0,0,............... }

즉 비어 있는 초기화의 경우 995개가 다 0으로 채워진다


배열 크기와 초기값이

결과

꼭 맞으면

만사형통 / int a[2][2]={1,2,3,4};

초기값이 모자라면

나머지는 0
int a[2][3]={{1,3},{4,5,}};

초기값이 남으면

에러로 처리
int a[2][3]={{1,2,3},{4,5,}};

배열크기를 생략하면

개수만큼 자동으로 크기 설정
int a[][2]={{1,2},{3,4},{5,6}};



 



 배열의 활용



불규칙한 정보를 담아 그걸 표현하는 형태로 활용이 가능하고 난수로 생성한 좌표를 배열에 저장해 놓고 필요할 떄 사용할 수 도 있다.
작업 결과를 저장하는 데에도 사용하게 된다. 

 


 


 배열은 동일한 타입의 유한한 집합

 다차원 배열을 사용할 수 있으며 int a[2][3]의 경우 정수용 변수 3개의 묶음이 2개가 있는 것이라고 볼 수 있다.

 

출처 : soen.kr



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

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


표준함수

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

    분류

    함수

    입출력 함수

    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

+ Recent posts