변수(Variable)
변수는 데이터를 저장하는 메모리 공간에 이름을 부여한 것입니다.
변수는 프로그램 실행 중에 값을 저장하거나 변경할 수 있습니다.
#include <stdio.h>
int main() {
int a = 10; // 정수형 변수 a를 선언하고 10으로 초기화
float b = 3.14; // 실수형 변수 b를 선언하고 3.14로 초기화
char c = 'A'; // 문자형 변수 c를 선언하고 'A'로 초기화
double d = 3.14159; // 실수형 변수 d를 선언하고 3.14159로 초기화
// 변수 출력
printf("a = %d\n", a);
printf("b = %.2f\n", b); // 소수점 2자리까지 출력
printf("c = %c\n", c);
printf("d = %.5f\n", d);
return 0;
}
이렇게 변수를 선언할 수 있다.
사실 이것과 함께 배워야 할 것은 자료형이며 코드에서
int
float
char
double
이 있다.
변수란 나는 변할 수 있는 수 라고 생각한다.
말그대로 뭐 값이 변할 수 있다. 라고 이해했다.
그럼 값을 변할 수 없는 수도 있지 않겠는가?
그게 상수다.
이건 사실 GPT가 설명해주는 것을 보는 게 더 나을것이다.
너무많고 나도 모르는것들도 많다.
따라서 GPT가 써준 것만 적겠다.
자료형(Data Type)
자료형은 변수에 저장할 수 있는 데이터의 종류와 그 데이터가 차지하는 메모리 크기를 정의합니다.
C 언어에서는 여러 가지 기본 자료형을 제공하며, 각 자료형은 데이터의 크기와 범위가 다릅니다.
int: 정수형
정수 값을 저장하는 자료형입니다.
크기: 보통 4바이트.
범위: -2,147,483,648 ~ 2,147,483,647 (시스템에 따라 다를 수 있음).
예: int a = 10;
float: 부동소수점 실수형
소수점이 포함된 실수 값을 저장하는 자료형입니다.
크기: 보통 4바이트.
예: float b = 3.14;
double: 더블 부동소수점 실수형
float보다 더 정밀한 실수 값을 저장하는 자료형입니다.
크기: 보통 8바이트.
예: double c = 3.14159265359;
char: 문자형
한 문자를 저장하는 자료형입니다.
크기: 보통 1바이트.
예: char ch = 'A';
short: 짧은 정수형
int보다 작은 범위를 가진 정수형 자료형입니다.
크기: 보통 2바이트.
예: short s = 100;
long: 긴 정수형
int보다 더 큰 범위를 가진 정수형 자료형입니다.
크기: 보통 4바이트 또는 8바이트.
예: long l = 100000L;
unsigned: 부호 없는 자료형
음수 값을 저장할 수 없는 자료형입니다. 오직 양수나 0만 저장됩니다.
예: unsigned int u = 10;
long long: 매우 큰 정수형 (크기: 보통 8바이트)
unsigned short: 부호 없는 짧은 정수형 (크기: 보통 2바이트)
unsigned long: 부호 없는 긴 정수형 (크기: 보통 4바이트)
unsigned long long: 부호 없는 매우 큰 정수형 (크기: 보통 8바이트)
long double: 고정밀 실수형 (크기: 보통 8바이트 또는 16바이트)
void: 반환 값이 없는 타입 (크기: 정의되지 않음)
bool: 불리언 타입 (크기: 보통 1바이트, C99부터 사용 가능)
가 있다.
상수(Constant)
상수는 값을 변경할 수 없는 변수입니다. C에서는 const 키워드를 사용하여 상수를 선언할 수 있습니다.
const 키워드 사용 예시:
#include <stdio.h>
int main() {
const int MAX_VALUE = 100; // MAX_VALUE는 상수로 선언
// MAX_VALUE = 200; // 오류: 상수의 값을 변경할 수 없습니다.
printf("MAX_VALUE: %d\n", MAX_VALUE);
return 0;
}
#define 사용
#define은 매크로 상수를 정의하는데 사용됩니다. 이 방법은 컴파일 시점에 상수를 미리 정의하여 사용합니다.
#define 예시:
#include <stdio.h>
#define MAX_VALUE 100 // MAX_VALUE를 100으로 정의
int main() {
printf("MAX_VALUE: %d\n", MAX_VALUE);
return 0;
}
#define과 const 차이점
#define은 컴파일 시에 매크로로 대체되므로 타입이 없습니다.
const는 변수처럼 메모리에 할당되고 타입이 있습니다.
#define은 상수뿐만 아니라 매크로 함수를 정의할 때도 사용됩니다.
사실 의미는 GPT가 더 쉽고 간략할 것이다.
상수는 어디다 쓰는가? 에 대한 생각이 있을 수 있다.
나는 제일 간단한 예시로 보면 파이(π)
를 생각하면 될 것 같다.
GPT 에서 설명한 const 으로 PI를 정의해 보자
#include <stdio.h>
const double PI = 3.14159; // const를 사용하여 파이 값을 상수로 정의
int main() {
printf("파이의 값은: %.5f\n", PI); // PI를 사용하여 파이 값 출력
return 0;
}
왜 const로 정의하느냐 라는 의문이 생길 수 있다.
일반적으로 const 가 더 안전하고 유지보수가 용이하다는 장점
#define 은 성능에 민감한 상황에서 메모리 절약이 중요할 때 #define은 메모리를 할당하지 않으므로, 메모리 사용을 최소화할 수 있는 장점
때문에 주로 const 를 쓴다고 한다.
define으로 해도 된다. 자기선택이다.
매크로 함수(Macro Function)는 #define을 사용하여 정의되는 함수처럼 동작하는 매크로입니다. 매크로 함수는 컴파일 시점에 코드로 치환되어 실행됩니다. 즉, 매크로 함수는 프로그램이 실행되기 전에 미리 정의된 코드로 바뀌어 매크로가 호출되는 위치에 코드가 삽입됩니다.
매크로 함수의 특징
컴파일 시점에 치환: 매크로 함수는 실제로 함수 호출이 아니라, 컴파일러가 해당 매크로를 코드로 치환합니다.
매개변수 사용: 매크로 함수는 매개변수를 받을 수 있으며, 이를 사용하여 다양한 값을 계산할 수 있습니다.
단순한 처리: 매크로 함수는 주로 간단한 계산이나 반복적인 코드를 줄이기 위해 사용됩니다.
디버깅 어려움: 매크로는 실제 함수처럼 실행되지 않기 때문에 디버깅이 어렵고, 변수 이름 충돌 같은 문제를 일으킬 수 있습니다.
매크로 함수 정의 방법:
매크로 함수는 #define을 사용하여 정의합니다. 매크로는 함수처럼 보이지만, 실제로는 매크로의 이름과 매개변수로 치환됩니다.
예시 1: 간단한 매크로 함수
#include <stdio.h>
#define MAX(x, y) ((x) > (y) ? (x) : (y)) // 두 값 중 큰 값을 반환하는 매크로 함수
int main() {
int a = 10, b = 20;
printf("큰 값: %d\n", MAX(a, b)); // MAX(a, b)가 ((a) > (b) ? (a) : (b))로 치환되어 계산됩니다.
return 0;
}
매크로 함수와 함수의 차이
실행 시간: 함수는 호출될 때 실행되지만, 매크로 함수는 컴파일 시점에 코드로 변환됩니다.
성능: 매크로는 함수 호출이 없으므로 성능상 이점이 있을 수 있지만, 코드가 중복되어 커질 수 있습니다.
디버깅: 매크로는 실제 코드가 삽입되기 때문에 디버깅할 때 함수와 다르게 호출 스택을 볼 수 없습니다.
결론:
매크로 함수는 코드를 간결하게 만들고 실행 성능을 개선하는 데 유용할 수 있지만, 디버깅이나 유지보수 측면에서는 불편할 수 있습니다. 매크로 함수는 간단한 계산을 하거나 반복적인 코드를 작성할 때 유용하게 사용됩니다.
아 맞다 나는 gpt로 공부를 한다.
강의를 다 보기엔 또 시간도 너무 많이 걸리고, 보다보면 궁금한 것을 질문하기엔 시간도 걸리고, 또 부끄럽기도하고 등등 이유가 있기 때문이다.
그럼 쌩판 모르는 사람은 질문을 어떻게하냐?
를 참고할수 있는 사이트를 추천해 주겠다.
로드맵
단점은 다 영어다.
그리고 나야 뭐 gpt 한테
힝 C 커리큘럼 짜줘~
커리큘럼에서 말한거 설명해줘~
라고 해서 그대로 하고있지만,
추천 사이트에서 c 를 찾으려면
컴퓨터 사이언스에서 c를 배우니 컴퓨터 사이언스에 들어기서 c를 찾으면 된다.