CS 기초/C언어

[CS50] 자료형, 형식 지정자, 연산자

담크 2021. 8. 1. 17:46

C는 정수형이나 문자열 이외에도 다양한 데이터 타입이 정의되어 있는데 어떠한 타입이 있는지, 또 그것을 다양한 연산자를 통해 조건문이나 반복문으로 설정해 값을 계산하는 방법을 공부해보도록 하겠습니다.

 

먼저 데이터 타입으로 정의되어 있는 것

- int : 특정 크기 또는 특정 비트까지의 정수  (예) 1, 5, 40, -4, 0

- long : 더 큰 크기의 정수

- float : 부동소수점을 갖는 실수  (예) 3.14, 0.0, -29.34

- double : 부동소수점을 포함한 더 큰 실수

- char : 문자 하나  (예) 'a', 'B', '?'

- string : 문자열

- bool : 불리언  (예) true, false, 1, 0, yes, no

 

그렇다면 왜 다양한 데이터 타입이 필요할까요?

기본적으로 int의 경우 약 40억 정도까지 셀 수 있기 때문에 만약 페이스북, 구글 같이 큰 회사의 데이터가 40억이 넘어버리면 셀 수없다. 그래서 이때는 long을 사용해야 합니다.

 

형식지정자 마찬가지로 지금까지는 string을 출력하기 때문에 %s만 사용했지만 사실 데이터 타입마다 사용되는 형식 지정자가 존재합니다.

- %c : char

- %f : float, double

- %i : int

- %li : long

- %s : string

 

그 외 기타연산자주석의 표기는 아래와 같습니다.

- + : 더하기

-  - : 빼기

- * : 곱하기

- / : 나누기

- % : 나머지

- && : 그리고

- || : 또는

- // : 주석

 

** 주석

//이 부분은 주석입니다.

주석은 코드 실행에 영향을 주지 않는 부분을 이야기합니다. 보통 이 코드가 무엇을 의미하는가를 설명할 때 적어둡니다. 개발을 하다 보면 내 코드를 남이보는 경우도 있을 수 있고 남의 코드를 내가 보는경우도 있을 수 있는데 코드는 정답이 따로 정해져 있지 않아 사람마다 차이가 있기 때문에 처음 보는 코드들은 설명이 필요한 경우가 많습니다. 이때 주석을 달아 이 코드가 어떠한 역할을 하는지 적어주는 것이 필요합니다.

 

 

그렇다면 이제 이걸 이용해서 문자열 대신 정수를 받아서 사용하는 프로그램을 작성해보겠습니다.

#include<cs50.h>
#include<stdio.h>

int main(void){
    int age = get_int("당신의 나이는 몇살입니까?\n");
    int days = age * 365;
    printf("당신은 태어난지 %i일 되었습니다.\n", days);
}

get_int라는 정수를 받아오는 함수를 cs50 라이브러리에서 사용합니다.

입력하는 사용자의 나이는 age로 복사되어 저장됩니다.

입력받는 값이 나이(즉 정수) 이므로 그 변수의 종류는 int가 됩니다.

나이를 일 수로 환산하는 식 역시 정수에 365를 곱한 값이므로 정수입니다.

따라서 %i로 days의 인자를 받아 출력해줍니다.

그럼 이 코드를 조금 간단하게 작성해본다면 어떻게 될까요?

# include <cs50.h>
# include <stdio.h>

int main(void)
{
    printf("당신은 태어난지 %i일 되었습니다.\n", get_int("당신의 나이는 몇살입니까?\n") * 365);
}

이렇게 3줄짜리 코드를 한 줄로 줄였는데 어떤가요? 

보기에 따라 간단해 보일 수도 있지만 이 코드는 좌우로 너무 길어서 보통은 가독성이 떨어진다고 말합니다.

디자인적인 측면에서는 시선이 왼쪽에서 오른쪽으로 가는 것보다 위에서 아래로 가는 것이 좋습니다.

물론 코드를 짜는데 정답은 없지만 누구에게나 읽기 편하고 이해하기 쉬운 코드가 선호되는 것은 어디에서나 동일합니다.

 

이번엔 실수를 사용해보겠습니다.

# include <cs50.h>
# include <stdio.h>

int main(void)
{
    float cir = get_float("반지름의 길이는?\n");
    printf("원의 넓이는 %f\n", cir * cir *3.14);
}

실행 결과를 보면

결과값으로 28.260000이 나오는데 뒤로 필요 없는 소수점이 많아 보기에 별로 안 좋아 보이죠

그럼 이것을 소수점 2번째 자리까지 나오게 하려면 어떻게 해야 할까요?

 printf("원의 넓이는 %.2f\n", cir * cir *3.14);

이렇게 %f앞에 '.원하는 자리수'를 넣어주면 됩니다. 그럼 결과가

이렇게 두 번째 자리까지 잘 나오게 됩니다.

 

 

** 참고자료 #include<cs50.h>에 대해

저는 현재 C를 처음 배워 보기 때문에 #include<cs50.h>가 원래 사용되는 라이브러리인지 궁금했는데요

#include<cs50.h>는 CS수업을 위해 만들어진 라이브러리입니다. 이 라이브러리 안에 여러가지 함수(get_int, get_double, ... 등)를 만들어 놨다고 합니다. 그렇기 때문에 sandbox.cs50.io가 아닌 VsCode 같은 곳에서는 CS50라이브러리 사용이 불가능합니다.

C에는 #include<stdio.h>, <math.h> 등 표준 라이브러리들도 많으니 자신이 코딩하는데 필요한 함수는 직접 공부하다 보면 배울 수 있을 겁니다.

 


출처

본 내용은 CS50의 2019년 강의를 듣고 작성했습니다. (개념이 어느 정도 정리되면 최신강의도 다시 듣고 수정할 내용 있으면 수정하겠습니다.)

 

강의 자료는 EdX에서 무료로 사용할 수 있고 boostcourse에서 한글 강의로도 들을 수 있습니다.

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

[CS50] 하드웨어의 한계  (0) 2021.08.03
[CS50] 사용자 정의 함수, 중첩 루프  (0) 2021.08.02
[CS50] 조건문과 루프  (0) 2021.07.30
[CS50] 문자열  (0) 2021.07.29
[CS50] C 기초  (0) 2021.07.28