공부중
[C] C 기초 본문
실습은 GCC 계열 컴파일러를 사용
1. 식별자와 키워드.
식별자(identifier) : 프로그래머가 코드에서 사용하기 위해 붙이는 이름
키워드 : C언어에서 사용하려고 미리 지정한 단어들 (if, for , int 등)
2. 코드블럭
{}로 구분되므로 들여쓰기 및 띄어쓰기는 영향을 주지 않음. 하지만 가독성을 위해 들여쓰기를 권장.
3. 주석
// 한 줄 주석
/*
여러줄 주석
*/
자료형
1. 자료형
메모리의 값을 사용하기 위해서는 자료형의 정의와 메모리 에 대한 이해가 필요하다.
자료형은 값의 종류, 메모리 저장 공간 크기, 데이터의 표현 범위 결정한다.
정수, 실수, 문자 등의 자료형 뿐만이 아니라 새로운 자료형을 만들어 내는 사용자 정의 자료형(user-defined data type)도 존재한다.
2. 상수의 개념
상수(constant)는 프로그램이 실행되는 동안 그 값이 변경되지 않는 데이터를 의미합니다. 이는 변수와 대비되는 개념이며, 상수는 일반적으로 프로그램 코드 내에서 고정된 값을 나타내는데 사용됩니다. 예를 들어, 원주율 π(3.14159...)나 빛의 속도(299,792,458 m/s) 같은 물리적인 상수 또는 사용자가 코드 내에서 자주 사용할 값이 상수로 정의될 수 있습니다.
2.2 리터럴 상수
리터럴 상수(literal constant)는 프로그램의 소스 코드에 직접 적힌 고정된 값입니다. 이는 코드 내에서 직접적으로 값을 나타내며, 종류에 따라 다음과 같이 구분됩니다:
- 정수 리터럴: 42, 0b101010, 0x2A
- 실수 리터럴: 3.14159, 0.01
- 문자 리터럴: 'A', 'b', '1'
- 문자열 리터럴: "Hello, world!", "123abc"
3. 정수 상수 표현 방법
C 언어에서 정수 상수를 표현하는 방법은 다양하며, 주로 사용되는 네 가지 진법으로 구분됩니다:
- 10진수 (Decimal):
- 가장 흔히 사용되는 숫자 체계로, 일반적인 수학에서 사용하는 숫자와 동일합니다.
- 예: 10, 256, 1024
- 16진수 (Hexadecimal):
- 메모리 주소 표현이나 색상 코드 등에 사용되며, 0x 또는 0X 접두사를 사용합니다.
- 예: 0xFF, 0x1A3B, 0x10
- 8진수 (Octal):
- 파일 시스템의 권한 설정 등에 사용되며, 숫자 앞에 0을 붙여 표현합니다.
- 예: 0755, 012, 001
- 2진수 (Binary):
- 컴퓨터의 비트 레벨 연산을 표현할 때 사용되며, 0b 또는 0B 접두사를 사용합니다.
- 예: 0b1011, 0b11001001
4. 문자 및 문자열 상수 표현방법
4.1 문자 상수 표현방법
문자 상수는 C언어에서 한 개의 문자를 표현하는 방법으로, 작은따옴표(')를 사용하여 문자를 감싸 표현합니다. 이는 프로그램 내에서 문자의 리터럴 값을 나타내며, 문자 상수는 메모리에서 일반적으로 한 바이트를 차지합니다. ASCII 코드에 따라 각 문자는 특정한 정수 값과 매핑됩니다.
- 'a' : 소문자 a
- 'A' : 대문자 A
- '\"' : 큰따옴표 자체를 나타내는 경우, 이스케이프 문자를 사용 (\")
- ',' : 콤마
- ' ' : 공백 문자
4.2 문자열 상수의 표현 방법
문자열 상수는 0개 이상의 문자를 포함하며, 큰따옴표(") 사이에 문자들을 위치시켜 표현합니다. 문자열 상수는 메모리에서 연속된 문자들의 배열로 저장되며, 문자열의 끝에는 자동으로 널 문자(\0)가 추가되어 문자열의 끝을 나타냅니다. 이 널 문자를 포함하여 총 사용되는 메모리의 크기가 결정됩니다.
- "Hello, World!" : 일반적인 문자열
- "12345" : 숫자도 문자열로 표현 가능
- "" : 빈 문자열, 문자는 없지만 널 문자는 포함되어 있음
5. 자료형 구조도
C 언어의 자료형 구조
|
6. void
사용하는 경우 | 설명 | 예제 |
함수의 인지로 사용 | 인자로 전달되는 값이 없음 | int main(void){} |
함수의 반환 자료형으로 사용 | 함수가 값을 반환하지 않음 | void f() {} |
포인터로 사용 | 어떤 자료형의 주소값도 저장 가능 |
7. 스칼라 자료형. (Scalar Types)
스칼라 자료형이란 한 번에 하나의 값만을 가질 수 있는 자료형을 말합니다. 이는 C 언어의 기본 타입 중 하나로 분류되며, 가장 단순한 형태의 데이터를 저장하는 데 사용됩니다. 스칼라 자료형은 다음과 같은 범주에 포함됩니다:
- 정수형 (Integer Types)
- int, short, long, long long 및 각각의 unsigned 버전 등
- 실수형 (Floating-Point Types)
- float, double, long double
- 문자형 (Character Types)
- char, signed char, unsigned char
- 불리언형 (Boolean Type)
- _Bool (C99 표준부터)
스칼라 자료형은 연산, 함수 인자 전달, 반환값 등 다양한 프로그래밍 상황에서 중요한 역할을 합니다. 이 자료형들은 메모리의 단일 위치에 저장되며, 각 자료형은 특정 크기와 범위의 값을 표현할 수 있습니다.
8. 복합 자료형 (Aggregate Types)
복합 자료형은 여러 값을 하나의 자료형에 저장할 수 있게 해주는 자료형입니다. C 언어에서는 다음과 같은 복합 자료형을 사용합니다:
- 배열 (Arrays)
- 동일한 타입의 여러 데이터를 순차적으로 저장합니다. 예: int numbers[10];
- 구조체 (Structures)
- 서로 다른 타입의 데이터를 하나의 단위로 묶어 관리합니다. 예: struct {int age; char *name;};
- 공용체 (Unions)
- 서로 다른 데이터 타입을 메모리의 같은 위치에 저장하여 한 번에 하나의 데이터만 사용합니다. 예: union {int id; float salary;};
이러한 복합 자료형은 데이터를 구조화하고 복잡한 데이터 구조를 관리할 수 있게 해줍니다. 예를 들어, 배열은 데이터 분석이나 수학 연산에서, 구조체는 데이터베이스 레코드나 객체 지향 프로그래밍에서, 공용체는 메모리 절약을 목적으로 다양한 형태의 데이터를 동일한 메모리 공간에서 사용할 때 유용합니다.
9. 자료형 크기
C 언어에서 자료형의 메모리 크기는 플랫폼과 컴파일러에 따라 달라질 수 있습니다. 하지만 일반적인 32비트 또는 64비트 시스템에서의 대략적인 메모리 크기를 아래와 같이 표로 정리할 수 있습니다:
자료형메모리 크기 (32비트 시스템)메모리 크기 (64비트 시스템)
char | 1 바이트 | 1 바이트 |
unsigned char | 1 바이트 | 1 바이트 |
signed char | 1 바이트 | 1 바이트 |
int | 4 바이트 | 4 바이트 |
unsigned int | 4 바이트 | 4 바이트 |
short | 2 바이트 | 2 바이트 |
unsigned short | 2 바이트 | 2 바이트 |
long | 4 바이트 | 8 바이트 |
unsigned long | 4 바이트 | 8 바이트 |
long long | 8 바이트 | 8 바이트 |
unsigned long long | 8 바이트 | 8 바이트 |
float | 4 바이트 | 4 바이트 |
double | 8 바이트 | 8 바이트 |
long double | 12 바이트 (컴파일러에 따라 다름) | 16 바이트 (컴파일러에 따라 다름) |
_Bool | 1 바이트 | 1 바이트 |
포인터 (Pointer) | 4 바이트 | 8 바이트 |
- 위 표는 일반적인 경우를 기준으로 합니다. 실제 메모리 크기는 사용하는 컴파일러와 플랫폼에 따라 달라질 수 있습니다.
자료형의 메모리크기는 `sizeof`를 사용할 수 있다.
#include <stdio.h>
int main() {
printf("Size of char: %zu bytes\n", sizeof(char));
printf("Size of unsigned char: %zu bytes\n", sizeof(unsigned char));
printf("Size of signed char: %zu bytes\n", sizeof(signed char));
printf("Size of int: %zu bytes\n", sizeof(int));
printf("Size of unsigned int: %zu bytes\n", sizeof(unsigned int));
printf("Size of short: %zu bytes\n", sizeof(short));
printf("Size of unsigned short: %zu bytes\n", sizeof(unsigned short));
printf("Size of long: %zu bytes\n", sizeof(long));
printf("Size of unsigned long: %zu bytes\n", sizeof(unsigned long));
printf("Size of long long: %zu bytes\n", sizeof(long long));
printf("Size of unsigned long long: %zu bytes\n", sizeof(unsigned long long));
printf("Size of float: %zu bytes\n", sizeof(float));
printf("Size of double: %zu bytes\n", sizeof(double));
printf("Size of long double: %zu bytes\n", sizeof(long double));
printf("Size of _Bool: %zu bytes\n", sizeof(_Bool));
// 포인터 크기 출력
int *p;
printf("Size of pointer: %zu bytes\n", sizeof(p));
return 0;
}
10. 정수 자료형을 명시하기 위해 상수 뒤에 붙이는 접미사
C언어에서 정수 상수를 표현할 때 사용하는 접미사(suffix)는 정수의 타입을 명확히 하기 위해 사용됩니다. 접미사는 해당 상수가 어떤 정수 타입인지(예: long, unsigned, long long) 명시하는 데 사용됩니다. 아래는 주요 정수 자료형의 접미사와 그 사용 예시를 나타내는 표입니다:
자료형접미사예시
long | L 또는 l | 100L, 1234567890l |
unsigned | U 또는 u | 100U, 250u |
long long | LL 또는 ll | 123456789012LL, 9876543210ll |
unsigned long | UL 또는 ul | 100UL, 4294967295ul |
unsigned long long | ULL 또는 ull | 123456789012345ULL, 18446744073709551615ull |
#include <stdio.h>
int main() {
// 정수 리터럴 선언
long a = 100L;
unsigned int b = 250u;
long long c = 123456789012LL;
unsigned long d = 4294967295UL;
unsigned long long e = 18446744073709551615ULL;
// 크기와 값 출력
printf("long: %ld, size: %zu bytes\n", a, sizeof(a));
printf("unsigned int: %u, size: %zu bytes\n", b, sizeof(b));
printf("long long: %lld, size: %zu bytes\n", c, sizeof(c));
printf("unsigned long: %lu, size: %zu bytes\n", d, sizeof(d));
printf("unsigned long long: %llu, size: %zu bytes\n", e, sizeof(e));
return 0;
}
11. size_t 및 ptrdiff_t 자료형
size_t 자료형
- size_t는 sizeof 연산자의 결과 타입으로, 메모리의 크기를 나타내는 데 사용됩니다. 이는 주로 배열의 크기, 문자열의 길이 등을 저장하는 데 사용되며, 부호 없는 정수형입니다.
ptrdiff_t 자료형
- ptrdiff_t는 두 포인터 간의 차이를 나타내는 타입으로, 포인터 연산 결과를 저장하는 데 사용됩니다. 이는 일반적으로 부호 있는 정수형입니다.
#include <stdio.h>
#include <stddef.h>
int main() {
int numbers[] = {10, 20, 30, 40, 50};
size_t size = sizeof(numbers) / sizeof(numbers[0]);
printf("Array contains %zu elements.\n", size);
int *start = &numbers[0]; // 배열의 시작 포인터
int *end = &numbers[4]; // 배열의 끝 S포인터
ptrdiff_t diff = end - start;
printf("Difference between pointers: %td elements.\n", diff);
return 0;
}
12.
'프로그래밍 > C언어' 카테고리의 다른 글
[C] 하드웨어, 운영체제, 프로그래밍 언어 (0) | 2024.08.16 |
---|---|
[C언어] 포인터 (0) | 2023.05.13 |