본문 바로가기
IT 정보

C언어 기본개념 정리 - 2. 타입

by 버텨라나무야 2023. 6. 21.

다양한 프로그래밍 언어에 대한 기본개념을 잘 다듬어 놓기 위해 작성하였습니다.

기본개념 중심으로 요약 정리 자료이기 때문에 미흡한 점이 많겠으나 조금이나마 도움이 되었으면 좋겠습니다.

(TCP SCHOOL 학습사이트를 토대로 거의 그대로 정리한 글입니다.)

 

[목차]
 1. C언어 시작 
 2. 타입
 3. 연산자
 4. 제어문
 5. 함수
 6. 배열
 7. 포인터
 8. 포인터와 배열
 9. 메모리의 관리
 10. 문자와 문자열
 11. 구조체
 12. 입력과 출력
 13. 선행처리
 14. 컴파일
 15. C언어 참조

 

2. 타입


  7) 변수


     - 변수(variable) : 데이터(data)를 저장하기 위해 프로그램에 의해 이름을 할당받은 메모리 공간을 의미
                          즉, 변수란 데이터(data)를 저장할 수 있는 메모리 공간을 의미하며, 이렇게 저장된 값은 변경될 수 있음

     - 숫자 표현에 관련된 변수 : 정수형 변수, 실수형 변수
        - 정수형 변수 : char형, int형, long형 변수
        - 실수형 변수 : float형, double형 변수

     - 포인터 변수 : 데이터가 저장된 메모리의 주소를 저장하고 처리하는 변수
     - 사용자 정의 구조체 변수 : 관련된 정보를 한 번에 묶어서 처리하는 변수

     - 변수의 이름 생성 규칙
     - 비트(bit)와 바이트(byte)
        // 컴퓨터는 모든 데이터를 2진수로 표현하고 처리함
        - 비트(bit) : 컴퓨터가 데이터를 처리하기 위해 사용하는 데이터의 최소 단위로, 2진수의 값(0과 1)을 단 하나만 저장할 수 있음
        - 바이트(byte) : 비트가 8개 모여서 구성되며, 한 문자를 표현할 수 있는 최소 단위

     - 변수와 메모리 구조
        - 변수는 기본적으로 메모리의 주소를 기억하는 역할을 함
        - 변수를 참조할 때는 메모리의 주소를 참조하는 것이 아닌, 해당 주소에 저장된 데이터를 참조하게 됨
        - 따라서 변수는 데이터가 저장된 메모리의 주소뿐만 아니라, 저장된 데이터의 길이와 형태에 관한 정보도 같이 기억해야 함

     - 변수의 선언
        - C언어에서는 변수를 사용하기 전에 반드시 먼저 해당 변수를 저장하기 위한 메모리 공간을 할당받아야 함
        - 이렇게 해당 변수만을 위한 메모리 공간을 할당받는 행위를 변수의 선언이라고 부름
        - 만약 선언되지 않은 변수를 사용하려고 하면, C 컴파일러는 오류를 발생시킴

        - C언어에서 변수를 선언하는 방법 (2가지)
           ① 변수의 선언만 하는 방법
             - 먼저 변수를 선언하여 메모리 공간만을 할당받고, 나중에 변수를 초기화하는 방법
             - C언어에서는 초기화되지 않은 변수는 절대로 사용해서는 안됩
             - C 컴파일러는 오류를 발생시키지는 않겠지만, 프로그램은 사용자가 의도하지 않은 결과를 출력할 것임

           ② 변수의 선언과 동시에 초기화하는 방법
             - 변수의 초기화 : 해당 변수를 사용할 수 있도록 초기값을 설정하는 행위
             - 초기화되지 않은 변수에는 아무런 의미 없는 값인 쓰레기 값만 들어있음

 


  8) 상수


    - (변수와 마찬가지로) 데이터를 저장할 수 있는 메모리 공간을 의미
    - 변수와 다른 점은 프로그램이 실행되는 동안 상수에 저장된 데이터는 변경할 수 없다는 점에 있음
    - 상수는 표현 방식에 따라 ① 리터럴 상수 ② 심볼릭 상수 로 나눌 수 있음

       ① 리터럴 상수 (literal constant)
            - (변수와는 달리) 데이터가 저장된 메모리 공간을 가리키는 이름을 가지고 있지 않음
            - C언어에서는 적절한 메모리 공간을 할당받기 위하여, 기본적으로 변수든 상수든 타입을 가지게 되는데 
            - 리터럴 상수는 타입에 따라 정수형 리터럴 상수, 실수형 리터럴 상수, 문자형 리터럴 상수 등으로 구분

       ② 심볼릭 상수 (symbolic constant)
            - (변수와 마찬가지로) 이름을 가지고 있는 상수
            - 반드시 선언과 동시에 초기화되어야 함
            - const 키워드를 사용하거나, 매크로를 이용하여 선언할 수 있음

              (예시)
                const int MAX = 10; // const 키워드를 이용한 심볼릭 상수
                #define MAX 10;     // #define 선행처리 지시자를 이용한 매크로 심볼릭 상수

 


  9) 기본 타입


    - C언어는 여러 형태의 타입을 미리 작성하여 제공하고 있는데, 이것을 '기본 타입'이라고 함
    - 기본 타입은 크게 정수형, 실수형, 문자형 타입

    - 정수형 타입
       - 정수형 데이터의 타입을 결정할 때에는 반드시 자신이 사용하고자 하는 데이터의 최대 크기를 고려해야 함
       - 해당 타입이 표현할 수 있는 범위를 벗어난 데이터를 저장하면, 오버플로우(overflow)가 발생해 전혀 다른 값이 저장될 수 있기 때문
        * 오버플로우 : 해당 타입이 표현할 수 있는 최대 범위보다 큰 수를 저장할 때 발생하는 현상을 가리킴
        * 언더플로우 : 해당 타입이 표현할 수 있는 최소 범위보다 작은 수를 저장할 때 발생하는 현상을 가리킴
       (예시)

int num = 2147483647;   // int형 타입이 저장할 수 있는 최댓값인 2^31 - 1
printf("변수 num에 저장된 값은 %d입니다.\n", num);    // 2147483648

num = 2147483648;      // int형 타입이 저장할 수 없는 숫자인 231
printf("변수 num에 저장된 값은 %d입니다.\n", num);    // -2147483648


    - 실수형 타입
       - C언어에서 실수란 소수부나 지수가 있는 수를 가리키며, 정수보다 훨씬 더 넓은 표현 범위를 가짐
       - 하지만 컴퓨터에서 실수를 표현하는 방식은 반드시 오차가 발생하는 기술적 한계를 지님
       - 실수형 데이터의 타입을 결정할 때는 표현 범위 이외에도 유효 자릿수를 반드시 고려해야 함
           float      // 소수 부분 6자리까지 오차없이 표현할 수 있음
           double   // 소수 부분 15자리까지 오차없이 표현할 수 있음
       - 실수를 표현할 때 float형을 많이 사용했지만, 하드웨어의 발달로 인한 메모리 공간의 증가로 현재에는 double형을 가장 많이 사용

 


  10) 타입 변환 (type conversion)


    - C언어에서 다른 타입끼리의 연산은 우선 피연산자들을 모두 같은 타입으로 만든 후에 수행되는데
    - 이처럼 하나의 타입을 다른 타입으로 바꾸는 행위를 '타입 변환'이라고 함
    - 타입 변환은 크게 다음과 같이 두 가지 방식으로 나눌 수 있음 (묵시적, 명시적)

       ① 묵시적 타입 변환 (=자동 타입 변환)
         - 대입 연산이나 산술 연산에서 C 컴파일러가 자동으로 실행해주는 타입 변환
         - 컴파일러가 자동으로 수행하는 타입 변환은 언제나 데이터의 손실이 최소화되는 방향으로 이루어짐
         - 따라서 C 컴파일러는 다음과 같은 순서대로 자동 타입 변환을 수행하게 됩니다.
            char 형 → short 형 → int 형 → long 형 → float 형 → double 형 → long double 형

      ② 명시적 타입 변환 (=강제 타입 변환)
         - 사용자가 타입 캐스트 연산자를 사용하여 강제적으로 수행하는 타입 변환
         - 변환하고자 하는 데이터의 앞에 괄호(())를 추가하고, 그 안에 변환할 타입을 적으면 됨
         - C언어에서는 이 괄호(())를 '타입 캐스트(type cast) 연산자'라고 함

         - int형 데이터끼리의 산술 연산에 대한 결과값은 언제나 int형 데이터로 나옴 (결과값 타입은 피연산자 타입과 언제나 일치하기 때문)
         - 따라서 두 번째 연산에서처럼 하나의 피연산자를 명시적으로 double형으로 지정해야만 정확한 결과값을 얻을 수 있습니다.
         (예시)

int num01 = 1;
int num02 = 4;  

double result01 = num01 / num02;
double result02 = (double)num01 / num02;  

printf("result01에 저장된 값은 %f입니다.\n", result01);     // 0.000000
printf("result02에 저장된 값은 %f입니다.\n", result02);     // 0.250000

 

 

<C언어 기초가이드>

'IT 정보' 카테고리의 다른 글

C언어 기본개념 정리 - 4. 제어문  (0) 2023.06.23
C언어 기본개념 정리 - 3. 연산자  (0) 2023.06.23
C언어 기본개념 정리 - 1. 시작  (0) 2023.06.21