Microsoft Tech Camp Creative Programming C, C++


  울산 창조경제혁신센터와 한국마이크로소프트가 주최하는 Microsoft Tech Camp에 참여하게 되었습니다.

  12월 5일부터 4주간 진행되는 이번 행사는 매주 토, 일요일 10시부터 17시까지 풀타임으로 달리는 교육프로그램으로, C언어와 C++을 활용해 Win32 프로그래밍과 MFC 프로그래밍, 스타트업 바이블, UI 이해와 이미지 처리, 네트워크 프로그래밍 까지 C와 C++에 대한 모든 것을 배울 수 있는 프로그램입니다.


  이 프로그램에서 수고해주실 강사님은 Microsoft MVP(Most Valuable Professional)이신 김성엽 님이십니다.

현재 Tipssoft 대표 이시며 C++ 계의 권위자이십니다. 이런 전문가님께 해당 언어에 대해 자세히 배울 수 있게 되어 영광입니다.


  모든 내용을 서술하기 보다는 중요한 내용을 중심으로 다시 정리하는데 주력할 예정입니다.


Day 1 C Programming Language <Hello, World!>


  C언어는 1972년 벨 연구소의 데니스 리치가 만든 프로그래밍 언어입니다. 켄 톰슨이 유닉스에서 사용할 B라는 언어를 개선하여 만들었습니다. 켄 톰슨 옹은 나중에 롭 파이크, 로버트 그리즈머 선생과 함께 구글 캠퍼스에서 도원결의.. 를 통해 Go 라는 언어를 창조하게 됩니다. C는 150여개의 함수를 지원하는 작은 언어이지만 그 활용성과 세세한 트릭들을 익혀야 완벽한 코딩노예에 입문할 수 있기에 쉽지만 쉽지않은 언어입니다.

  시스템 프로그래밍을 위해 태어난 언어인 만큼 어셈블리어 만큼 기계적인 접근이 가능한 언어로 이를 잘 이용하면 굉장한 퍼포먼스를 이끌어 내고, 안정적인 운영이 가능해집니다. 컴파일 언어는 소스파일을 기계어로 번역하여 수행하기 때문에 수행속도가 빨라지는 것입니다. 그런만큼 C언어 뿐아니라 컴퓨터 시스템 전체에 대한 이해를 가지고 있어야 하기 때문에 프로그래밍을 처음 배우는 사용자가 접근할 수 있는 물리적인 벽(예를 들면 포인터?)이 존재하는 셈입니다. 저도 마이크로 프로세서를 수강하면서 8086을 뜯어 본 뒤에 포인터에 대한 물리적인 이해를 할 수 있었던 것을 생각해보면 저런 특징들이 C 언어의 양날의 검으로 느껴지기도 합니다.


  두 가지 중 한 가지 값을 저장할 수 있는 단위를 Bit라고 하며, 흔히 0과 1로 기억하시겠지만 사실 1은 one 그 자체가 아니라 FALSE TRUE의 개념으로 생각하셔야 합니다. 컴퓨터는 0이 아닌 모든 값은 참으로 인식하게 됩니다. 그리고, 위의 Bit가 8개가 모이면 Byte라고 합니다.

  프로그램은 자료구조(Data Structure)와 알고리즘(Algorithm)의 집합체 입니다. 자료(Data)는 단순한 자료 덩어리들로 사용자의 명령에 따라 입력한 자료가 프로그램을 거쳐 적절한 산출물을 제공하는 것이 프로그램의 정의라고 할 수 있습니다.

  그럼 이런 프로그램을 만들기 위한 프로그래밍 언어는 어떤 요소들을 갖추어야 할까요?


1. 시작과 끝이 있음

2. 사용자 입력이 가능해야 함

3. 입력된 정보를 저장할 수 있어야 함

4. 사용자에게 정보를 보여줄 수 있어야 함

5. 연산할 수 있어야 함

6. 조건에 따른 처리가 가능해야 함

6. 반복적으로 수행할 수 있어야 함


  자료형(Data type)은 여러 종류의 데이터를 식별하는 분류입니다. 0~9(정수형), 0.16237(실수형), 문자(문자형), 문자열(C는 배열로...), TRUE or FALSE(불린) 의 다양한 데이터 종류들을 컴퓨터와 프로그래머가 확인할 수 있도록 알려주는 것입니다.

  C언어는 정적 타입 언어로 자료형이 고정되어 있는 언어입니다. 캐스팅이라는 악마의 손(MVP님의 용어)을 빌릴 순 있으나 자주하면 어디서 손을 대야 할지 모를 정도로 산으로 가버리니 최대한 자제하도록 합니다.


(괄호)는 생략 가능함을 알려드립니다.

1. char(문자형) - 문자저장을 위해 가장 효율적인 자료형. 작은 정수까지 표현 가능함.( ASCII Code Table 참조)

    1byte

   (Signed) char : -128 ~ 127

   unsigned char : 0 ~ 255


2. int(정수형) - 가지런히 정리되어 있는 수라는 의미의 정수는 분수가 1인 유리수입니다. 프로그래밍 언어에서 사용환경(프로세서 비트수)에 따라 다릅니다.

    2byte

  short int

    (signed) short (int) -32,768 ~ 32,767

    unsigned short (int) 0 ~ 65,535


    4byte

  long int

    (signed) long (int) -2,147,483,648 ~ 2,147,483,647

    unsigned long (int) 0 ~ 4,294,967,295

ex)

#include <stdio.h>
#include <limits.h>

int main() {
    printf(" char의 저장소 크기 : %d \n", sizeof(char));
    printf(" int의 저장소 크기 : %d \n", sizeof(int));
    printf(" short int의 저장소 크기 : %d \n", sizeof(short));
    printf(" long int의 저장소 크기 : %d \n", sizeof(long));

    return 0;
}


float... 를 하기 전에 알아두셔야 할 사실이 있습니다. 컴퓨터는 실수 표현을 못하는 바보입니다. 위에서 본 0과 1로 모든 것을 처리하는 컴퓨터는 정수가 아닌 수를 해석적으로 저장하거나 근사치를 저장하는 방식으로 실수를 저장하고 표현합니다. 따라서 어떤 프로그래밍 언어들은 0.1*10 계산을 시켰을 때 1.0을 얻을 수 있지만, 0.1을 열번 더하는 방식에서 1.0이 아니라 0.999999 혹은 0.00001 등 실제보다 작거나 큰 값을 보여줍니다. 

  실수를 표현하는 방식은 고정소수점 방식과 부동소수점 방식이 있습니다.

  고정소수점 방식은 말 그대로 소수점을 고정해놓고 그 앞자리에는 실수의 정수부분을 뒷자리에는 실수의 소수부분을 나타냅니다. 8비트의 실수를 나타내는 컴퓨터에 '8비트 중 앞의 4비트는 정수, 뒤의 4비트는 소수'라고 약속을 한다면 b1100.0101 을 '1100 0101'로 저장하여 표현합니다. 구현하기는 편하지만 표현할 수 있는 수의 범위는 매우 작아 잘 쓰이지 않습니다.


  부동소수점방식은 주어진 실수를 x*2^y 로 표현한 뒤 x,y값을 저장하는 방식입니다. 이 방식은 넓은 범위의 숫자를 표현하면서도 어지간한 정밀성을 보장합니다. 하지만 계산이 복잡해지고 연산시간도 늘어나는 단점이 있습니다.


float - 4byte 실수로 double 보다 적은 표현범위를 가지고 있습니다.

double (float) - 8byte 실수로 보다 넓은 표현범위를 가지고 있으며, 연산 속도 또한 float보다 빠릅니다.


자료형의 앞에 (_:언더바)가 붙은 경우 다음과 같은 의미를 가지고 있습니다.

_ : 표준에서 벗어남을 의미

__ : 호환 불가능한 커스텀 자료형


실수는 연산속도가 느려 가능한 피하는 것이 좋으며 다음과 같은 방법을 사용할 수 있습니다.

0.156 -> *1000 -> 156 --> 연산 --> 출력시 /1000


#include <stdio.h>
#include <float.h>

int main() {

   printf("float 저장소 크기 : %d \n", sizeof(float));
   printf("float 최소 양수: %E\n", FLT_MIN );
   printf("float 최대 양수: %E\n", FLT_MAX );
   printf("정확한 10진의 숫자: %d\n", FLT_DIG );

   printf("double 저장소 크기: %d \n", sizeof(double));
   printf("double 최소 양수: %E\n", DBL_MIN );
   printf("double 최대 양수: %E\n", DBL_MAX );
   printf("정확한 10진의 숫자: %d\n", DBL_DIG );
   
   return 0;
}


+ Recent posts