[Warming up C Programming] chapter 3 : 데이터형과 변수

eunee22·2023년 7월 6일
0

Warming-up C Programming

목록 보기
3/10
post-thumbnail

제가 대학교 1학년 때 C언어 수업에서 배운 내용을 교재와 ppt를 중심으로 정리한 내용입니다. (2022.3 ~ 2022.6)
당시에 공부를 위해서 HWP 파일로 정리해 놓은 것을 그대로 올립니다.

대학에 처음 들어와 정리한 내용이라 모든 내용을 담고 싶은 욕심에 정리가 많이 지져분하고 어설픈점 양해 부탁드립니다..!

지역변수와 전역변수에 대한 더 자세한 설명 보러가기

🍑데이터형

종류

1. 기본 데이터형 : c언어 자체에서 제공하는 데이터형.
ex) 문자형, 정수형, 실수형
2. 파생 데이터형 : 배열, 포인터처럼 기본형으로부터 파생된 데이터형
3. 사용자 정의형 : 구조체, 공용체, 열거체처럼 프로그래머에 의해서 만들어진 데이터형.

  • 모든값에는 데이터형 존재.

  • 데이터의 종류를 구분해서 사용할 수 있도록함.

  • 데이터형(데이터종류)에 따라서 데이터를 저장하는 데 메모리가 얼마나 필요한지, 데이터를 어떤 방식으로 표현하고 저장하는지가 결정.

    • 컴파일러가 결정함
  • 데이터형의 이진표현 : 컴퓨터 시스템에서 이진 데이터로 값을 표현하고 저장하는 방식.

    • 컴퓨터 시스템에서는 모든 데이터가 0과 1의 이진 데이터로 저장.
    • 소스코드에서 다른 진수를 사용하더라도 컴파일 결과로 생성되는 기계어 코드에서는 이진 데이터 사용
  • c언어가 제공하는 데이터형의 크기는 플랫폼에 따라 다르다.

  • 데이터형이나 어떤 값(임시저장), 변수의 바이트 크기를 구하기 위해서 size of 연산자를 이용.

    • 실행하는 플랫폼에서 데이터형의 크기가 얼마인지 직접 확인해서 사용하기 위한
    • 플랫폼 : 소프트웨어가 구동될 수 있는 컴퓨터 구조와 운영체제(소프트웨어를 실행하기 위한 하드웨어 및 기타 환경)

🍑1. 정수형

  • signedunsigned를 함께 적어서 부호있는 정수형과 없는 정수형으로 사용가능.

  • short (2byte)
  • int (4bite)
  • long (4bite)
  • long long (8bite)
  • char (1byte)
    • char는 문자를 나타내기 위한 데이터형이지만, 1바이트 크기의 정수형으로 사용가능.(‘’)
    • 저장된 정수값 출력시에도 %d%x를 이용한다.
    • 아스키코드 기준에 맞는 정수 정보로 보관됨.

  • 부호있는 정수형의 경우에 최상위 비트를 부호 비트로 사용.

    • (1 – 음수, 0 – 양수) 2의 보수를 사용하여 음수를 나타낸다.
    • -n을 표현하려면, n을 2의 보수로 나타낸 다음 각비트를 0110으로 반전시키고 그 결과에 1을 더한다.
  • 부호없는 정수형의 경우에는 최상위 비트를 값을 저장하는 용도로 사용.

  • 정수연산 기준은 4byte이기 때문에 4byte보다 작은 값의 경우 4byte 공간에 전달하여 남은 공간은 음수는 1 양수는 0으로 채워지고 연산, 출력을 수행한다.


  • 정수형의 유효범위 : 정수형의 크기에 따라 표현 가능한 정수의 범위가 달라짐
  • 오버플로우 : 정수형 변수에 유효 범위 밖의 값을 저장하면, 유효 범위 내의 값으로 설정되는 것.
    • 유효 범위를 벗어나는 값을 저장하면 정수형의 크기에 맞춰 상위 바이트를 버리고 하위 바이트만 저장(나머지 부분을 자르기)
      → 저장가능 범위를 넘으면 최솟값부터 시작함
    • EX) 128 대입 → -128
    • 항상 유효 범위 내의 값만 저장.

🍑2. 문자형

  • 문자를 이진 데이터로 나타내기 위해서 각 문자에 대응되는 문자 코드를 사용.
    • ASCII 코드, EBCDIC 코드, 한글 완성형 코드 등이 존재.

ASCII 코드

는 33개의 제어 문자들과 95개의 출력 가능한 문자들로 구성.

  • 제어 문자 : 장치를 제어하기 위한 목적의 문자로 출력 불가.
    (아스키 코드의 0~31, 127에 해당)
  • 아스키 코드는 실제로 0~127 사이에 매핑하기에 7bit만 필요하지만, 1byte를 기준으로 메모리를 관리하기에 1byte(8bit) 공간을 사용.

이스케이프 시퀀스

: 출력할 수 없는 제어 문자나 문자열 안에서 특별히 표기해야 하는 문자를 나타내는데 사용. ‘’안에 역슬래시(\)와 정해진 문자로 표현한다.
‘\’ 다음에 아스키 코드값을 8진수로 적어주거나 ‘\x’ 다음에 16진수로 적어주는 것.

  • 제어문자
    ‘\n’ : 줄바꿈
    ‘\0’ : 널 문자
    ‘\t’ : 수평 탭
  • 문자열 안에서 특별하게 표기해야 하는 문자
    ‘\“’ : 큰따옴표
    ‘\\’ : 역슬래시

🍑3. 실수형

  • float (4byte)
  • double (8byte)
  • long double (8byte)

표기법

  • 컴퓨터 시스템에서는 실수를 부동소수점 방식으로 표현.
  • 일반표기법 : %f부동소수점 방식
    • 3.14 → 13.345 –1234.5
    • 실수를 지수부분(실수의 범위 결정)과 가수부분(정밀도 결정)으로 나누어 2진 데이터로 저장.
    • 가수 부분과 지수 부분은 2진수로 표현.
  • 지수표기법 : %e
    • 1.345e+02 → 1.345 10^2 → 134.5
      2.378e+00 → 2.378
      10^0 → 2.378
      1.234e-02 → 1.234 * 10^-2 → 0.01234

  • 실수의 정밀도
    • 부동소수점 방식에서는 주어진 비트로 가수를 정확히 표현할 수 없으면 반올림해서 표현하기에 실수값에 오차가 생길수 있다.
    • 오차를 줄이려면 double 형을 사용하는 것이 좋다.
      1. 단정도 – float형
      2. 배정도 – double형

  • 실수형의 유효범위
    • 실수형의 크기에 따라 표현 가능한 실수의 범위가 달라짐
  • 실수형의 오버플로우
    • 표현 가능 최대값보다 큰값을 저장시에 INF(무한대)로 설정.
  • 실수형의 언더플로우
    • 표현 가능 최소값보다 작은값을 저장시에 가수부분을 줄이고 지수 부분을 늘려서 실수 표현.
    • 그것이 불가능해지면 0으로 설정.

🍑변수

: 값을 변경할 수 있는 데이터

  • 변수를 이용하면 효율성있게 프로그램을 만들 수 있다. (특정값을 처리하는 프로그램이 아닌 어떤 값이 될지 모르는 값을 처리하는 프로그램)

변수의 선언

: 변수를 사용하기 위해(메모리 공간을 확보하기 위해) 컴파일러에게 변수의 데이터형과 변수 이름을 알려주는 것.

  • 컴파일러는 변수의 데이터형에 따라 메모리 공간을 얼마나 사용할지 결정하고, 메모리를 주소 대신 변수 이름으로 접근 가능하게함.

  • 선언시에는 데이터형 다음에 변수 이름을 적어줌

  • 같은 형의 변수를 여러개 선언할 때는 콤마 다음에 변수 이름을 나열

  • 식별자 : 프로그래머가 만들어서 사용하는 이름.

  • 식별자의 규칙

    1. 반드시 영문자, 숫자, 밑줄 기호만을 사용해야함.
    2. 첫 글자는 반드시 영문자 또는 밑줄 기호로 시작해야함.
    3. 밑줄 기호를 제외한 다른 기호는 사용 불가.
    4. 대소문자를 구분해야한다.
    5. c언어의 키워드는 식별자로 사용할 수 없다.
      • 키워드(예약어) : c언어에서 특별한 의미로 사용되도록 약속된 단어.
    6. 단어가 여러개 일때는 밑줄 기호로 단어 사이를 연결하거나 연결되는 단어의 첫글자를 대문자로 지정하여 알아보기 쉽게 만든다.

변수의 초기화

: 변수가 메모리에 할당될 때 값을 지정하는 것.

  • 변수의 초기화는 변수 선언시에 변수 이름 다음에 = 과 초기값을 써줌으로써 해줌.

  • 변수를 초기화 할때는 변수의 데이터형과 같은 형의 값으로 초기화 해주지 않으면 컴파일러는 데이터형에 맞추어서 값을 변환하여 초기화

    • 이때 값이 손실되면 컴파일 경고를 발생시킴.
  • 변수를 초기화 하지 않으면 변수는 쓰레기 값을 가짐.

    • 메모리에 원래 들어 있던 값이 초기값이 되므로 의미도 없고 어떤 값이 들어 있을지 알 수가 없음.
    • 어떤값으로 초기화 시킬지 알 수 없으면 일반적으로 0으로 초기화 시
  • 초기화 되지 않은 변수의 사용은 위험.(컴파일 에러 or 경고)

변수의 사용

  • 대입 : 변수에 값을 저장하는 것.

  • 변수의 값을 읽어오거나 변경하려면 변수의 이름을 이용.

    • 컴파일러는 소스코드에서 변수이름이 사용되면 변수에 할당된 메모리에서 값을 읽어옴.
  • = 왼쪽에 변수이름을 적고, = 오른쪽에 값을 적어주면, =의 우변에 있는 값을 = 의 좌변에 있는 변수에 저장.

    • 우변에 수식이 있으면, 수식의 값을 먼저 계산한 후에 그 결과를 좌변에 있는 변수에 저장.
  • 변수에 값을 저장하면 이전값은 사라지고 마지막에 저장한 값만 남아있게됨.

  • 대입시에는 변수의 데이터형과 같은 형의 값을 대입해야 한다.

    • 다른 형의 값을 대입시 일어나는 일은 변수의 선언시와 동일.

🍑상수

: 값을 변경할 수 없는 데이터. 변수 공간에 할당된 값을 변화하지 못하게 고정하는 의미로 사용.

  • 상수는 임시값 → 값이 메모리에 저장되지 않고, 한 번만 사용된 다음 없어져 버림

리터럴 상수

: 소스코드에서 직접 사용되는 값

  • 문자형 상수

    • 일반문자, 이스케이프 시퀀스
    • 데이터형이 int형임을 주의. ‘’ 안에 문자를 적어주거나 \와 함께 정해진 문자를 적어줌.
  • 정수형 상수

    • 10진수 정수
    • 16진수 정수(0x or 0X)
    • 8진수 정수(앞에0)
    • unsigned형 정수(뒤에 u or U)
    • long형 정수(뒤에 l or L)
    • unsigned long형 정수(뒤에 ul or UL)
  • 실수형 상수

    • 부동소수점 표기 실수
    • 지수 표기 실수
    • float형 실수
    • 나타낼 때 소수점 앞부분을 생략하면 그 부분을 0으로 간주.
    • 디폴트로 double 형 이기에 float형 상수를 나타내려면 fF를 끝에 붙여야 한다.
  • 문자열 상수

    • ”“ 안에 문자들을 적어줌.
    • 문자열의 끝을 나타내는 널문자가 자동저장.
      • ex) “x”‘x’‘\0’ 이라는 두 개의 문자로 구성.

기호 상수

: 이름이 있는 상수

  • 사용시에 프로그램 수정이 더 쉬워짐
    • 상수값 변경시 선언문만 변경하면 됨
  • 프로그램의 가독성이 올라감
  • 프로그램의 이해가 더 쉬워짐

  • 메크로 상수 : define문으로 정의되는 상수

    • ex) #define PI 3.14
    • 여러번 사용되는 상수 값을 지정하면 편리.
    • 다른 식별자와 쉽게 구분이 가능하도록 모두 대문자로 된 이름 주로 사용.
    • 메크로 상수의 값은 변경할 수 없음 → 컴파일 에러 발생
    • 정수, 실수 값 외에 문자나 문자열도 메크로 상수로 정의 가능.

    • 전처리기 : c/c++ 컴파일러에 내장된 프로그램. 소스파일을 컴파일 할수 있도록 변환해서 준비.
      • 그렇기에 전처리기 수행 후 소스파일의 전처리기 문장은 모두 사라짐.
      • 전처리기 문장은 c문장이 아님 → 세미콜론 필요없음.
      • #으로 시작하는 문장은 전처리기 문장.
  • const 변수 : 값을 변경할 수 없는 변수

    • 앞에 const 라는 키워드를 적어줌 으로써 선언
      const 데이터형 변수명 = 초기값;
    • const 변수의 값을 변경하면 컴파일 에러가 발생한다.
    • 선언시 반드시 초기화 해야함.
profile
보안 공부하는 대학교 4학년 / 시리즈에서 더욱 편하게 글을 찾아보실 수 있습니다:)

0개의 댓글