거북이와 개구리의 끄적끄적

1일차_C언어(개요,자료형) 본문

공부/팁스

1일차_C언어(개요,자료형)

거북이가개굴개굴 2018. 6. 26. 22:00


이 글은 Tips 1일차 강좌를 듣고 작성했습니다.

틀린내용, 보충할내용, 궁금한내용 있으시면 댓글 달아주세요

C언어 개요 & 자료형

1. 시작하기 앞서

프로그래밍 언어에 따른 차이는 있지만, C언어는 컴퓨터 하드웨어적인 이해가 어느정도 필요합니다.

그에 따라 컴퓨터에 대한 이해도를 높이기 위해 포인터,자료형,변수에 대해서 얘기해보겠습니다.

먼저, 우리가 작성한 코드는 메모리에 저장됩니다. 그렇다면 이 메모리는 어떻게 사용하는걸까요?

기본적으로 메모리는 OS에 의해 1바이트 단위로 관리되며, 이 메모리를 사용하기 위해서는 '메모리 시작주소', '메모리의 크기', '메모리에 저장되어 있는 값' 3가지 요소를 알아야합니다. 그래야 이후에 메모리에 접근하여 값을 읽거나 값을 수정하는 등의 작업이 가능합니다.

이런식으로 메모리를 지정하는 방식을 '포인터'라고 하며 '간접주소지정방식'이라고도 합니다.

그렇다면 프로그래머가 한개의 프로그램에서 사용했던 모든 메모리에 시작주소,크기,값을 기억해야할까요?

컴퓨터 옆에 노트를 갖다두고 메모리 사용할 때 마다 적어두고 사용할 수 있지만 이런 방법은 비효율적입니다.

이런 문제를 해결하기 위해 나온 개념이 자료형변수를 이용해 컴파일러에게 시작주소와 크기와 값을 알려주는 방식입니다.

'변수이름'으로 '메모리의 시작주소'를 알려주고, '자료형'을 명시함으로써 '메모리의 크기'를 알려주는 방법입니다.

선업할 때 변수에 대입할 ''을 명시한다면 그 값은 '메모리에 저장되어있는 값'이 될 것입니다.


그럼 실제로 간단한 예시를 들어보겠습니다.



위의 예시에서 test라는 변수는 메모리의 시작주소는 401번지이며, 크기는 자료형이 int형이므로 4바이트, 메모리에 저장되어있는 값은 3'이라는 의미입니다.


이렇게 포인터,자료형,변수에 대한 얘기를 마무리하고 C언어에 대해 알아보겠습니다.

2. C언어 개요

  1. 프로그램
    간단하게 프로그램이 무엇이고, 어떻게 만들어지는지 알아보겠습니다.
    프로그램은 바이너리 파일이므로 개발자가 개발하기에 어려움이 있어 나온게 프로그래밍 언어입니다.
    프로그래밍 언어는 프로그램으로 전환되기 위해 통역기가 필요하며 이 번역기를 컴파일러라고 합니다.
    컴파일러는 프로그래밍 언어를 기계어로 번역해줍니다.
  2. C언어란?
    하드웨어의 독립적인 OS를 개발하기 위한 목적으로 만들어진 언어입니다.
    OS처럼 거대한 프로그램을 개발해야 하므로 체계적으로 구조화 된 특징이 있습니다..
    또한 확장성이 좋고 표현법이 다양합니다.
  3. C언어의 문장 서술 형식
    보통 프로그래밍 언어에는 문장분리자와 문장종결자가 있으며, C언어에서 문장분리자는 ;,{} 입니다.
    C언어듸 서술형식에는 단일서술문, 복합 서술문, 주석문, 예약어 & 키워드 4가지가 있습니다.
    단일서술문은 논리적 최소단위이며, 문장분리자에 의해 구분됩니다.
    ex) a = b + 10; // 한줄로 이루어진 1개의 단일서술문
    ex) a = b
                 + 10; // 두줄로 이루어진 1개의 단일서술문
    ex) a = b + 10; a = b - 10; // 한줄로 이루어진 2개의 단일서술문
    복합서술문은 단인서술문 여러개가 하나로 묶인 형태이며, 중괄호로 표현되며 이것 역시 문장분리자이므로 ;을 사용할 필요가 없습니다.
    ex) {
                a = b;
                b = 10;
                a = b;
            }
    주석문은 메모를 남기기 위한 서술형식이며, 컴파일러가 번역할 때 주석문은 제외됩니다. 단, 중첩의 형태로는 사용이 불가능합니다.
    ex) 한줄주석 : // 주석내용
    ex) 두줄이상주석 : /*
                                            주석내용
                                                             */
    예약어 & 키워드에서 예약어는 컴파일러가 나중에 사용될 때를 대비해 예약해 둔 단어이며, 키워드는 문법에 필요한 단어입니다. C언어는 예약어와 키워드가 같으므로 크게 구분하지 않으셔도 됩니다. 단, 예약어는 변수명으로 사용 불가합니다.
  4. C 프로그램의 실행파일
    c언어 소스파일의 확장자는 .c / c++ 소스파일의 확장자는 .cpp / 자바 소스파일의 확장자는 .java
    앞으로 포스팅을 진행하며 [*]로 표기되어 있는 내용은 프로그래머들 사이의 암묵적인 규약이므로 잘 지켜주시길 바랍니다.
    [*]
     c언어의 소스파일의 확장자는 보통 .c로 합니다.



    C언어에서의 실행파일은 위의 그림처럼 컴파일,링크,빌드 혹은 make의 과정으로 나눌 수 있습니다.
     1.컴파일
        소스파일(.c)을 목적파일(.obj)로 번역하는 과정으로 이 과정을 담당하는 프로그램을 '컴파일러'라고 합니다.
     2.링크
        목적파일(.obj)을 실행파일(.exe)로 번역하는 과정으로 이 과정을 담당하는 프로그램을 '링커'라고 합니다.
     3.빌드 혹은 make
        컴파일과 링크를 합친 과정으로 즉, 컴파일 후 링크를 의미합니다.
        그런데 소스파일에서 바로 실행파일로 번역하는게 불가능할까요? 가능합니다.
        소스파일에서 실행파일로 번역하는게 가능하다면 이 방법이 더 효율적인것 같은데 굳이 왜 소스파일에서 목적파일로 한번 바꾸고
        목적파일에서 실행파일로 또 한번 바꿔주는것일까요? 이에 대한 해답은 아래에 있습니다.
     4.목적파일의 필요성
        소스파일에서 실행파일로 바로 번역한다고 가정해보겠습니다.
        100만줄짜리 소스파일에서 1줄만 수정한 후 실행파일로 다시 번역한다고 해보겠습니다.
        1줄이 수정됐으므로 100만줄을 다시 번역해야합니다. 이는 굉장히 비효율적입니다.
        그렇다면 소스파일을 100등분 해보겠습니다. 각 파일은 1만줄씩 있을겁니다.
        1줄이 수정됐다면 그 1줄에 해당되는 1만줄짜리 파일만 번역하면 됩니다. 이 방법이 더욱 효율적이기 떄문에 이 방법을 사용합니다.
        그렇지만 한가지 문제점이 생겼습니다. 소스파일을 여러개로 분할하게 되면 실행파일로 바로 번역이 불가능합니다.
        따라서 중간단계를 한번 거쳐야 하는데 이 중간단계가 바로 목적파일입니다.

    지금까지 C언어란 무엇이고 C언어를 이용해 어떤식으로 프로그래밍 하게되는지 대략적인 과정을 알아봤습니다.
    이제부터는 C언어를 사용하기 위한 문법 중 자료형에 대해 알아보겠습니다.

3. 자료형

이제 메모리에 값을 저장하여 사용할 때 데이터가 저장되는 단위와 형태에 대해 알아보겠습니다.

    1. 데이터의 저장 단위
      비트는 두가지 중 한가지를 저장하는 단위.
      바이트는 아래와 같이 8개의 비트가 모인 단위.


      바이트에서 비트의 순서를 화살표 방향으로 읽을 때, 최하위비트(LSB)는 제일 오른쪽을, 최상위비트(MSB)는 제일 왼쪽을 말합니다.
      또한 KB를 Byte로 표현할 때는 컴퓨터는 기본적으로 2진단위의 배수를 사용하므로 1000에 가까운 2진인 숫자인 1024를 곱해주면 됩니다.
      마찬가지로 KB로 MB를 표현하면 1MB = 2^10 * 1KB가 됩니다.

    2. 부호 비트
      양수와 음수를 구분하기 위한 비트입니다.
      1비트로 부호를 표현하기위해 음수,0,양수가 아닌 0을 양수로 취급하므로 음수,양수로 나뉩니다.
      부호가 있을 때, MSB가 1이면 음수, 0이면 양수를 의미한다.

    3. 아스키코드
      컴퓨터는 내부에서 연산을 할 때는 괜찮지만 문자를 출력하고 싶을 땐 숫자밖에 모르므로 출력이 불가능합니다.
      이 때, 출력하고 싶은 문자에 숫자를 대응시켜놓은게 아스키코드입니다.
      다 외울 필요는 없지만 'Null'=0, '0'=48, 'A'=65, 'a'=97 이렇게 4가지는 알아두면 유용합니다.
      알파벳 대소문자 변환은 10진수로 32만큼 차이나므로 아래처럼 비트연산으로 5씩 해주면 됩니다.
      'a' << 5 의 결과는 'A'와 동일합니다. 반대의 경우도 마찬가지입니다.
      [*] 또한 char에 'a'를 저장하고 싶을 때 char c = 'a', char c = 97 둘 다 가능하지만 char c = 'a'를 쓰도록 합니다.

    4. 자료형
      C언어에서는 자주쓰는 자료형(1,2,4바이트)만 built-in으로 두고 그 외에는 전부 개인이 정의해서 쓰도록 만들어졌습니다.
      built-in 자료형에는 정수형과 실수형으로 나뉘며 각각의 자료형은 부호가 없는 unsigned와 부호가 있는 signed로 나뉩니다.
      1. 정수형
         괄호()는 변수 선언시 생략 가능합니다. 단, 최소 하나의 예약어는 명시해줘야 합니다.
         char : 1 Byte(256)
             Byte대신 char로 이름지어진 이유는 문자를 저장하기 최적의 크기라는 걸 알려주려는 의도가 있습니다.
             하지만 숫자도 저장이 가능합니다.
             unsigned char score = 99; // 시험의 성적을 나타내며 99점을 의미합니다.
             (signed) char spend_money = -37 // 이번달에 소비한 돈입니다. 단위는 만원입니다.
         short int : 2 Byte(65536, 6만5천)
             unsigned short (int) baby_weight = 5723 // 신생아의 몸무게입니다. 단위는 g입니다.
             (signed) short (int) time = -301 // 기상알람시간-기상시간 입니다. 단위는 sec입니다.
         long int : 4 Byte(4294967296, 42억9천만)
             연산속도면에서는 가장 빠릅니다.
             unsigned (long) (int) marathon_distance =  43207680 //  마라톤의 거리를 mm단위로 나타냈습니다.
             (signed) (long) (int) half_marathon_distance = 21603840 // 하프마라톤의 거리를 mm단위로 나타냈습니다.
         각 자료형은 저장가능한 범위를 의미하지 char라고 해서 0~255의 값만 저장 가능한것을 의미하는것은 아닙니다.
         500~755의 값 역시 char에 저장 가능하며, char에 저장할 때 -500, char에서 꺼낼 때 +500 하면 가능합다.
      2. 실수형
         실수형은 정수형보다 2,30배 느립니다.
         또한 정수형으로도 실수형 연산이 가능합니다.
         그럼에도 불구하고 실수형을 쓰는 이유는 정확도 때문입니다.
         float : 4 Byte
             부호에 1비트, 지수부에 8비트, 가수부에 23비트가 사용됩니다.
             다음에 소개될 double보다 속도,정확도 면에서 성능이 떨어지므로 쓰지 않는것이 좋습니다.
         double : 8 Byte
             부호에 1비트, 지수부에 11비트, 가수부에 52비트가 사용됩니다.
             float형보다 훨씬 정확하며 속도도 더 빠릅니다.
           실수형 자료형을 쓰게 된다면 double을 사용하는것을 적극 권장합니다.

이것으로 자료형 소개까지 마치겠습니다.

읽어주셔서 감사합니다.