C - 데이터 타입

안녕하세요, 미래의 프로그래머 여러분! C 프로그래밍의 세상으로 흥미로운 여정을 시작해보세요. 오늘 우리는 C의 데이터 타입에 대해 탐구해보겠습니다. 프로그래밍 초보자라도 걱정하지 마세요; 저는 친절한 안내자가 되어, 이 주제를 단계별로 풀어나가겠습니다. 그럼 좋아하는 음료를 한 잔 챙겨, 편안하게 앉아 읽어보세요!

C - Data Types

C에서의 정수 데이터 타입

우리가 모두 익숙한 것으로 시작해보겠습니다 - 정수입니다. C에서는 이를 정수(integers)라고 부르며, 다양한 크기와 종류가 있습니다.

기본 정수 타입

가장 일반적인 정수 타입의 표를 보여드리겠습니다:

데이터 타입 크기 (바이트) 범위
char 1 -128에서 127 또는 0에서 255
short 2 -32,768에서 32,767
int 4 -2,147,483,648에서 2,147,483,647
long 4 또는 8 -2,147,483,648에서 2,147,483,647 또는 -9,223,372,036,854,775,808에서 9,223,372,036,854,775,807

이제 이를 실제로 보겠습니다:

#include <stdio.h>

int main() {
char my_char = 65;
short my_short = 32000;
int my_int = 2000000000;
long my_long = 9000000000L;

printf("char: %c\n", my_char);
printf("short: %d\n", my_short);
printf("int: %d\n", my_int);
printf("long: %ld\n", my_long);

return 0;
}

이 코드를 실행하면 다음과 같은 결과를 볼 수 있습니다:

char: A
short: 32000
int: 2000000000
long: 9000000000

이를 해석해보면:

  • char 값 65는 ASCII 표에서 'A'에 해당합니다. 놀라운 일! char는 숫자도 저장할 수 있습니다!
  • shortint는 중간 크기의 숫자로 기대대로 작동합니다.
  • long의 경우, 끝에 'L'을 추가하여 C에 이는 큰 숫자임을 알립니다.

부호 없는 정수

때로는 양수만 필요할 때가 있습니다. 그때 부호 없는 정수가 유용합니다:

unsigned char my_uchar = 255;
unsigned short my_ushort = 65000;
unsigned int my_uint = 4000000000U;

printf("unsigned char: %u\n", my_uchar);
printf("unsigned short: %u\n", my_ushort);
printf("unsigned int: %u\n", my_uint);

출력:

unsigned char: 255
unsigned short: 65000
unsigned int: 4000000000

unsigned를 사용하면 동일한 메모리 공간에 더 큰 양수를 저장할 수 있습니다. 마법 같은 것처럼 보일 수 있지만, 이는 비트의 지혜로운 사용입니다!

C에서의 부동소수점 데이터 타입

이제 소수점 숫자의 세상으로 이동해보겠습니다. C는 세 가지 부동소수점 타입을 제공합니다:

데이터 타입 크기 (바이트) 정밀도
float 4 6-7 십진 자리
double 8 15-16 십진 자리
long double 16 19-20 십진 자리

이제 이를 실제로 보겠습니다:

#include <stdio.h>

int main() {
float pi_float = 3.14159265358979323846f;
double pi_double = 3.14159265358979323846;
long double pi_long_double = 3.14159265358979323846L;

printf("float: %.7f\n", pi_float);
printf("double: %.16f\n", pi_double);
printf("long double: %.20Lf\n", pi_long_double);

return 0;
}

출력:

float: 3.1415927
double: 3.1415926535897931
long double: 3.14159265358979323846

float는 7 자리 이후에서 정밀도를 잃고, doublelong double는 더 많은 정확성을 유지합니다. 디지털 사진을 확대할 때와 같은 느낌입니다 - 어떤 시점에서는 픽셀을 볼 수 있게 됩니다!

사용자 정의 데이터 타입

C는 우리가 자신의 데이터 타입을 만들도록 허용합니다. 요리사가 자신의 레시피를 만드는 것처럼!

구조체

구조체는 관련된 데이터를 함께 그룹화할 수 있습니다:

#include <stdio.h>
#include <string.h>

struct Student {
char name[50];
int age;
float gpa;
};

int main() {
struct Student alice;
strcpy(alice.name, "Alice");
alice.age = 20;
alice.gpa = 3.8;

printf("Name: %s\n", alice.name);
printf("Age: %d\n", alice.age);
printf("GPA: %.1f\n", alice.gpa);

return 0;
}

출력:

Name: Alice
Age: 20
GPA: 3.8

여기서 우리는 Student 타입을 만들어 이름, 나이, 평점을 함께 저장할 수 있습니다. 학생 정보 양식을 만드는 것과 같은 느낌입니다!

열거형

열거형은 이름이 지정된 상수를 만드는 데 유용합니다:

#include <stdio.h>

enum Days {SUN, MON, TUE, WED, THU, FRI, SAT};

int main() {
enum Days today = WED;
printf("Today is day number %d\n", today);
return 0;
}

출력:

Today is day number 3

열거형은 자동으로 0에서 시작하여 증가하는 정수 값을 할당합니다. 이름을 지정한 숫자처럼입니다!

C에서의 void 데이터 타입

void는 C의 특별한 타입입니다. 그것은 공백의 캔버스처럼 - 데이터의 부재를 나타냅니다. 주로 세 가지 상황에서 사용됩니다:

  1. 함수가 아무것도 반환하지 않음:

    void sayHello() {
    printf("Hello, World!\n");
    }
  2. 함수가 매개변수를 받지 않음:

    int getRandomNumber(void) {
    return 4;  // 공정한 주사위 굴림으로 선택된 숫자. 확실하게 무작위입니다.
    }
  3. 일반 포인터 (포인터 섹션에서 다룰 것)

C에서의 배열 데이터 타입

배열은 같은 타입의 값이 저장되는 비둘기집 같은 것입니다:

#include <stdio.h>

int main() {
int scores[5] = {85, 92, 78, 90, 88};

printf("First score: %d\n", scores[0]);
printf("Last score: %d\n", scores[4]);

float average = 0;
for(int i = 0; i < 5; i++) {
average += scores[i];
}
average /= 5;

printf("Average score: %.2f\n", average);

return 0;
}

출력:

First score: 85
Last score: 88
Average score: 86.60

C에서는 배열 인덱스가 0에서 시작합니다. 유럽의 건물 층수처럼 - 지하 층은 0입니다!

C에서의 포인터 데이터 타입

포인터는 메모리의 위치를 가리키는 표지 같은 것입니다. 그들은 강력하지만, 조심스럽게 다루어야 합니다:

#include <stdio.h>

int main() {
int x = 10;
int *p = &x;

printf("Value of x: %d\n", x);
printf("Address of x: %p\n", (void*)&x);
printf("Value of p: %p\n", (void*)p);
printf("Value pointed by p: %d\n", *p);

*p = 20;
printf("New value of x: %d\n", x);

return 0;
}

출력 (주소는 변합니다):

Value of x: 10
Address of x: 0x7ffd5e8e3964
Value of p: 0x7ffd5e8e3964
Value pointed by p: 10
New value of x: 20

여기서 px의 주소를 저장하는 포인터입니다. *p를 사용하여 해당 주소에 저장된 값을 접근하거나 변경할 수 있습니다. x의 원격 컨트롤러처럼!

그렇게 해서! 우리는 C의 주요 데이터 타입을 다루었습니다. 데이터 타입을 이해하는 것은 메모리를 효율적으로 관리하고 버그를 피하는 데 필수적입니다. 계속 연습하면 곧 이 타입들을 마스터하게 될 것입니다! 행복한 코딩을 기원합니다!

Credits: Image by storyset