π’ chap1. νμ μμ
β λ©λͺ¨λ¦¬
CμΈμ΄μμ λ©λͺ¨λ¦¬λ μμ ν μλμΌλ‘ κ΄λ¦¬
- λ©λͺ¨λ¦¬ μμμ ν λΉνκ±°λ, ν΄μ νκΈ°
π€ νλ‘μΈμ€ λ©λͺ¨λ¦¬ λ μ΄μμ
μ€ννμΌμ μ΄ λλ§λ€ μ΄μ체μ λ μ νλ‘μΈμ€ λ§λ¦
- νλ‘μΈμ€ : μ€νμ€μΈ νλ‘κ·Έλ¨ (λ©λͺ¨λ¦¬μ λ‘λ©)
κ³ μ μ νλ‘μΈμ€ μλ³μ (PID) κ°μ§
SIGTERM : μ’ λ£ μ νΈ (νλ‘μΈμ€ μ²μ)
SIGINT : μΈν°λ½νΈ μ νΈ (Ctrl + C λλ¬ ν¬κ·ΈλΌμ΄λ μ λ°© νλ‘μΈμ€λ‘ μ λ¬)
SIGKILL : ν¬ μ νΈ (νλ‘μΈμ€ μ²μνμ§ μκ³ κ°μ μ’ λ£)
νλ‘μΈμ€λ₯Ό μμ±ν λ μ΄μ체μ λ νλ‘μΈμ€λ₯Ό μν λ©λͺ¨λ¦¬λ₯Ό κ°μ₯ λ¨Όμ ν λΉν λ€μ, 미리 μ μλ λ©λͺ¨λ¦¬ λ μ΄μμμ μ μ
- νλ‘μΈμ€μ λ©λͺ¨λ¦¬ λ μ΄μμμ μ¬λ¬ λΆλΆ (μΈκ·Έλ¨ΌνΈ)μΌλ‘ λΆν λ¨
- μ΄κΈ°νλμ§ μμ λ°μ΄ν° μΈκ·Έλ¨ΌνΈ (BSS)
- λ°μ΄ν° μΈκ·Έλ¨ΌνΈ
- ν μ€νΈ μΈκ·Έλ¨ΌνΈ
- μ€ν μΈκ·Έλ¨ΌνΈ
- ν μΈκ·Έλ¨ΌνΈ
- μ μ λ©λͺ¨λ¦¬ λ μ΄μμ
- μ€ν μ€μΈ νλ‘μΈμ€μ λ©λͺ¨λ¦¬ λ μ΄μμμμ λͺλͺ μΈκ·Έλ¨ΌνΈλ ν λκ° λλ μ€ν κ°λ₯ν λͺ©μ νμΌμμ μ§μ λ§λ¦
- μμ€ μ½λλ₯Ό μ»΄νμΌ ν λ μ»΄νμΌλ¬κ° μ€ν κ°λ₯ν λͺ©μ νμΌμ 미리 μμ±
- λμ λ©λͺ¨λ¦¬ λ μ΄μμ
- νλ‘μΈμ€κ° λ‘λ©λ λ νλ‘κ·Έλ¨μ΄ μ€νλλ λμ λμ μΌλ‘ μμ±
- νλ‘κ·Έλ¨μ λͺ
λ Ήμ΄μ λ°λΌ μμ±
- λ³μμ λ°°μ΄μ λ©λͺ¨λ¦¬κ° ν λΉ, νλ‘κ·Έλ¨μ λ‘μ§μ λ°λΌ λ³μμ λ°°μ΄ μμ
- νλ‘μΈμ€μ λ©λͺ¨λ¦¬ λ μ΄μμμ μ¬λ¬ λΆλΆ (μΈκ·Έλ¨ΌνΈ)μΌλ‘ λΆν λ¨
π€ μ€νκ³Ό ν
- μ€ν
- ν¨μ νΈμΆ
- μμ μ νλ‘μΈμ€λ§μ΄ μ½κ³ μμ ν κΆνμ κ°λ μ μ© λ©λͺ¨λ¦¬
- λλ²κ±° : λλ²κ·Έ νλ €λ λ€λ₯Έ νλ‘μΈμ€μ λΆμ¬μ μ¬μ©νλ νλ‘κ·Έλ¨
- μ μ© λ©λͺ¨λ¦¬ λΈλ‘ μ½κ³ μμ κ°λ₯
- νλ‘κ·Έλ¨ λͺ λ Ήμ΄ μ€ν μμ μ μ΄ κ°λ₯
- λλ²κ±° : λλ²κ·Έ νλ €λ λ€λ₯Έ νλ‘μΈμ€μ λΆμ¬μ μ¬μ©νλ νλ‘κ·Έλ¨
- μ€νμ κ°μ₯ μμ ν λΉλ λ²νΌμ νμΈλμ§ μμ κ°μ μμ±νλ μΌμ μ·¨μ½μ μ γ
κ°μ£Ό
- λ²νΌ μ€λ²νλ‘ β μ΅μ€νλ‘μ
- κ° μ€ν λ³μλ κ³ μ μ μ€μ½ν κ°κ³ , μ€μ½νλ λ³μμ μλͺ
κ²°μ
- μ€ν λ³μ μ μΈν λλ§λ€ μ€ν μΈκ·Έλ¨ΌνΈμ κ°μ₯ μλΆλΆμ ν λΉ
1
2
3
4
5
6
7
8
π‘ **μ€ν μΈκ·Έλ¨ΌνΈ**
β
μ€ν λ©λͺ¨λ¦¬λ ν¬κΈ°κ° μ νμ (ν° κ°μ²΄ μ μ₯νλλ° μ’μ μ₯μ X)
β
μ€ν μΈκ·Έλ¨ΌνΈμ μ£Όμλ μμμ§
β
μλμΌλ‘ λ©λͺ¨λ¦¬ κ΄λ¦¬ (ν λΉ λ° ν΄μ λͺ¨λ ν΄λΉ)
β
λͺ¨λ μ€ν λ³μλ μ€μ½νλ₯Ό κ°μ§λ©° μ€μ½νλ λ³μμ μλͺ
μ κ²°μ
β
ν¬μΈν°λ κ³μ μ€μ½ν λ΄μ μ‘΄μ¬νλ μ€ν λ³μλ§μ κ°λ¦¬μΌμΌ ν¨
β
μ€ν λ³μμ λ©λͺ¨λ¦¬ ν΄μ λ μλμΌλ‘ μνλ¨
β
νμ¬ μ€μ½νμ μ‘΄μ¬νλ λ³μμ λν ν¬μΈν°λ λ€λ₯Έ ν¨μμ μΈμλ‘ μ λ¬λ μ μμ
- ν
- μλμΌλ‘ ν λΉλλ λ©λͺ¨λ¦¬ λΈλ‘μ κ°μ§ μμ
- malloc, calloc, realloc κ°μ ν¨μλ‘ ν λ©λͺ¨λ¦¬ λΈλ‘ μ»κΈ°
- malloc : λ©λͺ¨λ¦¬ ν λΉ
- calloc : μ²μ λ° ν λΉ
- realloc : μ΄μ μ λΈλ‘μ μλ λ°μ΄ν° λ³κ²½νμ§ μμΌλ©° μ΄λ―Έ ν λΉλ λΈλ‘μ μλ‘μ΄ λΈλ‘μΌλ‘ νμ₯ν¨
- free : λ©λͺ¨λ¦¬ λΈλ‘μ ν΄μ ν¨
- valgrind : μ€ν μ€μΈ νλ‘μΈμ€μμ λ©λͺ¨λ¦¬ λ¬Έμ λ₯Ό κ°μν μ μ΄μ΄ μ μ©ν νλ‘κ·Έλ¨
- malloc, calloc, realloc κ°μ ν¨μλ‘ ν λ©λͺ¨λ¦¬ λΈλ‘ μ»κΈ°
- νμ λ©λͺ¨λ¦¬ ν¬κΈ°κ° ν¬λ€
- ν° κ°μ²΄ μ μ₯ν μ μμ
- ν λ©λͺ¨λ¦¬ λ΄ μμ λ©λͺ¨λ¦¬μ ν λΉκ³Ό ν΄μ λ κ°λ°μκ° κ΄λ¦¬ν¨
- κ°λ°μκ° λ©λͺ¨λ¦¬λ₯Ό ν λΉνκ³ , ν΄μ νλ μΌμ μ μΌν κ°μ²΄λΌλ μλ―Έ
- ν λΈλ‘μ λΉμ°λ μΌμ κ°λΉμ§ 컬λ ν°κ° μννμ§λ§ C κΈ°λ°μμλ μμ
- μ€ν¨νλ©΄ λ©λͺ¨λ¦¬ λμ λ°μ
- νμ ν λΉλ λ³μλ μ€μ½νλ₯Ό μ ν κ°μ§ μμ
- ν λ©λͺ¨λ¦¬ λΈλ‘μ μ£Όμλ₯Ό μ§μ νλ €λ©΄ ν¬μΈν°λ§ μ¬μ©ν μ μμ
- ν μΈκ·Έλ¨ΌνΈλ μμ μ νλ‘μΈμ€μ μ μ©μ΄λ―λ‘ κ²μ¬νλ €λ©΄ λλ²κ±°λ₯Ό μ¬μ©ν΄μΌν¨
- μλμΌλ‘ ν λΉλλ λ©λͺ¨λ¦¬ λΈλ‘μ κ°μ§ μμ
1
2
3
4
5
6
7
π‘ **ν λ©λͺ¨λ¦¬**
β
ν λ©λͺ¨λ¦¬ ν λΉμ μΉλ¬μΌ ν λλ¦μ λΉμ©μ΄ μμ
β
ν 곡κ°μ ν λΉλ λͺ¨λ λ©λͺ¨λ¦¬ λΈλ‘μ λ μ΄μ νμνμ§ μμ λλ νλ‘κ·Έλ¨ μ’
λ£ μ§μ μ ν΄μ λμ΄μΌ ν¨
β
ν λ©λͺ¨λ¦¬ λΈλ‘μ μ€μ½νλ₯Ό κ°μ§ μμΌλ―λ‘, λ°λμ λ©λͺ¨λ¦¬ κ΄λ¦¬ν μ μμ΄μΌ ν¨
β
κ°κ°μ ν λ©λͺ¨λ¦¬ λΈλ‘μ λν λ©λͺ¨λ¦¬ κ΄λ¦¬ μ λ΅μ κ³ μν΄μΌ ν¨
β
μ νν μ λ΅κ³Ό μ λ΅μ κ΄ν κ°μ μ λΈλ‘μ μ κ·Όν λλ§λ€ μ½λμ κΈ°λ‘λμ΄μΌ ν¨
β
RAII κ°μ²΄λ₯Ό μ¬μ©ν΄ ν λ©λͺ¨λ¦¬ λΈλ‘κ³Ό κ°μ 리μμ€ κ΄λ¦¬ κ°λ₯
β κ°μ²΄μ§ν₯
π OOPμ μΊ‘μν
- κ°λ : νμ€ μΈκ³μ κ°μ²΄μ κ΄ν μΈμμΌλ‘ νμ±
- OOP
- νλ‘κ·Έλ¨μ΄ μ€νλ λ μμ ν λμ μΈ κ°μ²΄ λͺ¨λΈλ‘ μ΄μ΄μ§ μΌλ ¨μ λͺ λ Ήμ΄ λ§λ λ€
- OOD (κ°μ μ§ν₯ μ€κ³)
- κ°μ²΄
- λ κ° μ΄μμ μμ± λλ μμ±μ μ§ν©μ κ°μ§ μ μμ
- μν
- μμ±μ ν λΉλ κ°μ μ΄κ΄ν΄ κ°μ²΄μ μν
- λ¨μν κ°μ²΄μ μ°κ²°λ νΉμ μμ±μ μνλ κ°μ λͺ©λ‘μΌλ‘ μ΄ν΄λ¨
π λλ©μΈ
- μννΈμ¨μ΄ κΈ°λ₯μ 곡κ°ν κ²½κ³λ₯Ό μ μν¨
- 미리 μ μλ ꡬ체μ μΈ μ©μ΄μ§μ μ¬μ©ν΄ μ무λ₯Ό μνν¨
π κ°μ²΄μ μμ± κ³ν λ°©λ²
- λΉ κ°μ²΄λ₯Ό μμ±νκ±°λ μΌλ°μ μΌλ‘ μ΅μνμ μμ±μ μ§ν©μ κ°λ κ°μ²΄λ₯Ό μμ±νλ κ²
- μ½λκ° μ€νλλ λμ λ λ§μ μμ±μ΄ κ²°μ λκ³ μΆκ°λ¨
- κ°κ°μ κ°μ²΄λ λ³λμ κ°μ²΄λ‘ μ·¨κΈλ¨
- μμ±μ΄ 미리 μ ν΄μ Έ μμ΄μ μ€ν λμ€μ λ³κ²½λμ§ μλ κ°μ²΄λ₯Ό μμ±νλ κ²
- λ°νμ λμ μ΄λ ν μμ±λ μΆκ°λμ§ λͺ»ν΄ κ°μ²΄λ ꡬ쑰λ₯Ό μ μ§ν¨
- μμ±κ°λ§ λ³κ²½ν μ μμΌλ©°, κ°μ²΅ κ°λ³μ μΌ λλ§ κ°λ₯
- λͺ¨λ μμ±μ μΆμ νλ 미리 μ€κ³λ κ°μ²΄ ν νλ¦Ώ λλ ν΄λμ€ μμ±ν΄μΌ ν¨
- λ§μ νλ‘κ·Έλλ° μΈμ΄μμ μ΄λ¬ν κ°μ²΄ ν νλ¦Ώμ ν΄λμ€λΌ ν¨
- μ°Έμ‘°
- κ°μ²΄μ κ°μ΄ λ©λͺ¨λ¦¬μ ν λΉλ μ€μ μμΉλ₯Ό μ°Έμ‘°νλλ° μ¬μ©ν¨
- κ°μ²΄μ μΈμ€ν΄μ€λ κ°μ κ²
π μΊ‘μν
- κ°μ²΄λ₯Ό λνλ΄λ μΊ‘μμ μλ‘ μ°κ΄λ κ²μ μ§μ΄λ£λλ€
- κ°μ²΄μμ μ΄λ€ μμ±μ΄λ κΈ°λ₯μ΄ νμνλ€κ³ λλ μκ° λ§μμμμ μΊ‘μν νλ κ²
- κ°μ²΄λ μμ±μ μ§ν©, κΈ°λ₯μ μ§ν©μΌλ‘ λ§λ€μ΄μ§
- μμ±κ³Ό κΈ°λ₯ λλ€ κ°μ²΄ μΊ‘μλ‘ μΊ‘μν λμ΄μΌ ν¨
- μμ± μΊ‘μν
- λͺ μμ μΊ‘μνλ₯Ό μ 곡ν¨
- κ°λ°μμ νλ‘κ·Έλλ° μΈμ΄ λλ€ μΊ‘μν, μΊ‘μμ μ‘΄μ¬λ₯Ό μλ€λ κ²
- νμ μΊ‘μν
- λ©μλλ κ°μ²΄ λ΄μ μ μ₯λλ λ‘μ§, κΈ°λ₯, νμμ λνλ
- μμ±μ κ°μ μ λ¬ν¨
- μ묡μ μΊ‘μνλ λͺ μμ μΈ νμ μΊ‘μνλ₯Ό μ 곡νμ§ μμ
- νμ ν¨μλ μΈμ μ€ νλλ‘ λ°λμ ꡬ쑰체 ν¬μΈν°λ₯Ό λ°μμΌ ν¨
- κ°μ²΄μ λμΌν ν΄λμ€μ μλ‘ μ°κ΄λμ΄μμμ λνλ΄λ €λ©΄ μ μ ν μ΄λ¦μ΄ μμ΄μΌ ν¨
π μ 보 μλ
- μΈλΆ μΈκ³μ 보μ΄μ§ μμμΌ νλ μ΄λ ν μμ±μ΄λ νμλ₯Ό 보νΈνλ μν
- μΈλΆ μΈκ³ : κ°μ²΄μ νμμ μνμ§ μλ λͺ¨λ μ½λ
- λΉκ³΅κ° νμ ν¨μλ __μ λμ΄ λΆμΈλ€
β 1.1 μ μ²λ¦¬κΈ° μ§μμ
μ μ²λ¦¬ : preprocssing
μν: μΌλ ¨μ μ§μμλ₯Ό μ¬μ©ν΄ ν΅μ νκ³ μν₯μ μ€
C μ§μμ: ν€λμ μμ€ νμΌμμ #μΌλ‘ μμνλ μ½λ(맀ν¬λ‘, μ‘°κ±΄λΆ μ»΄νμΌ)
1.1.1 맀ν¬λ‘
π 맀ν¬λ‘μ νμ©
- μμ μ μνκΈ°
- C ν¨μλ₯Ό μμ±νμ§ μκ³ ν¨μλ‘ μ¬μ©νκΈ°
- 루ν νκΈ°
- ν€λ κ°λ
- μ½λ μμ±
- μ‘°κ±΄λΆ μ»΄νμΌ
π 맀ν¬λ‘ μ μνκΈ°
#define μ§μμλ₯Ό μ΄μ©ν΄ μ μ: κ° λ§€ν¬λ‘λ μ΄λ¦κ³Ό νλΌλ―Έν°, κ°μ κ°μ§
#undef μ§μμλ‘ μ μλ₯Ό μ κ±°
μμ 1-1
1 2 3 4 5 6 7 8
#define ABC 5 int main(int argc, char** argv) { int x = 2; int y = ABC; int z = x + y; return 0; }
ABCλ λ³μκ° μλ 맀ν¬λ‘, μλλ 맀ν¬λ‘ νμ₯ ν μ½λ
1 2 3 4 5 6
int main(int argc, char** argv) { int x = 2; int y = 5; int z = x + y; return 0; }
μμ 1-2
1 2 3 4 5 6 7 8
#define ADD(a, b) a + b int main(int argc, char** argv) { int x = 2; int y = 3; int z = ADD(x, y); return 0; }
ADDλ ν¨μκ° μλ μ μ¬ ν¨μ 맀ν¬λ‘, μλλ μ μ²λ¦¬ ν μ½λ
1 2 3 4 5 6
int main(int argc, char** argv) { int x = 2; int y = 3; int z = x + y; return 0; }
맀ν¬λ‘λ μ»΄νμΌ λ¨κ³ μ΄μ μλ§ μ‘΄μ¬, μ΄λ‘ μ μΌλ‘λ μ»΄νμΌλ¬κ° 맀ν¬λ‘μ κ΄ν΄ λͺ¨λ₯Έλ€λ λ»
but ,νλμ C μ»΄νμΌλ¬λ μ μ²λ¦¬ λ¨κ³λ₯Ό μκ³ μμ
π κ°λ³ μΈμ 맀ν¬λ‘
μμ 1-5
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include <stdio.h> #include <stdlib.h> #include <string.h> #define VERSION "2.3.4" #define LOG_ERROR(format, ...) \ fprintf(stderr, format, __VA_ARGS__) int main(int argc, char** argv) { if (argc < 3) { LOG_ERROR("Invalid number of arguments for version %s\n.", VERSION); exit(1); } if (strcmp(argv[1], "-n") != 0) { LOG_ERROR("%s is a wrong param at index %d for version %s.", argv[1], 1, VERSION); exit(1); } // ... return 0; }
VA_ARGS μλ³μ: μμ§ λ§€κ°λ³μλ‘ ν λΉλμ§ μμ λλ¨Έμ§ μ λ ₯ μΈμλ‘ λͺ¨λ κ΅μ²΄ fprintf ν¨μλ νμΌ μμ μ stderrλ₯Ό μμ±, μλλ μ΅μ’ μΆλ ₯ μ½λ
1 2 3 4 5 6 7 8 9 10 11 12 13
int main(int argc, char** argv) { if (argc < 3) { fprintf(stderr, "Invalid number of arguments for version %s\n.", "2.3.4"); exit(1); } if (strcmp(argv[1], "-n") != 0) { fprintf(stderr, "%s is a wrong param at index %d for version %s.", argv[1], 1, "2.3.4"); exit(1); } // ... return 0; }
μμ 1-6
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#include <stdio.h> #define LOOP_3(X, ...) \ printf("%s\n", #X); #define LOOP_2(X, ...) \ printf("%s\n", #X); \ LOOP_3(__VA_ARGS__) #define LOOP_1(X, ...) \ printf("%s\n", #X); \ LOOP_2(__VA_ARGS__) #define LOOP(...) \ LOOP_1(__VA_ARGS__) int main(int argc, char** argv) { LOOP(copy paste cut) LOOP(copy, paste, cut) LOOP(copy, paste, cut, select) return 0; }
C++ Boost νλ μμν¬μ foreach μ°Έκ³ νκΈ°, μλλ μ΅μ’ μ½λ
1 2 3 4 5 6 7 8 9
int main(int argc, char** argv) { printf("%s\n", "copy paste cut"); printf("%s\n", ""); printf("%s\n", ""); printf("%s\n", "copy"); printf("%s\n", "paste"); printf("%s\n", "cut"); printf("%s\n", "copy"); printf("%s\n", "paste"); printf("%s\n", "cut"); return 0; }
루ν νκΈ°: λͺ λ Ήμ΄λ₯Ό 루νμ λ£μ§ μκ³ νλνλ λλ κ² μ 맀ν¬λ‘λ 리μ€νΈ μμλ₯Ό μΈ κ°κΉμ§λ§ μ²λ¦¬
π 맀ν¬λ‘μ μ₯μ κ³Ό λ¨μ
맀ν¬λ‘λ μ»΄νμΌ ν ν μ€μ κΈ΄ μ½λλ‘ κ΅μ²΄λμ΄ λͺ¨λμ±x
C ν¨μλ‘ μ¬μ©ν μ μλ€λ©΄ 맀ν¬λ‘ λμ C ν¨μλ‘ μμ±
μννΈμ¨μ΄ μ€κ³μ λλ²κΉ λ¬Έμ
루ν νκΈ°μ μ±λ₯ μ΅μ ν
DSL μ μ
1.1.2 μ‘°κ±΄λΆ μ»΄νμΌ
μ‘°κ±΄λΆ μ»΄νμΌ μ§μμ λͺ©λ‘
- #ifdef
- #ifndef
- #else
- #elif
- #endif
β 1.2 ν¬μΈν° λ³μ
1.2.1 λ¬Έλ²
ν¬μΈν°: λ©λͺ¨λ¦¬ μ£Όμλ₯Ό μ μ₯νλ λ¨μν λ³μ
- μμ 1-9
1 2 3 4 5 6 7
int main(int argc, char** argv) { int var = 100; int* ptr = 0; ptr = &var; *ptr = 200; return 0; }
λ ν¬μΈν° μ μΈ, μ°Έμ‘° μ°μ°μ&, μμ°Έμ‘° μ°μ°μ* NULL 맀ν¬λ‘ μ¬μ©: λ³μμ ν¬μΈν°λ₯Ό λ μ½κ² ꡬλΆ
1.2.2 ν¬μΈν° λ³μμ μ°μ μ°μ°
μ°μ μ°μ° κ°κ²©: ν¬μΈν°κ° 1μ© μ¦κ°ν λ μμ§μ΄λ λ°μ΄νΈμ μ«μ, C μλ£νμ μν΄ κ²°μ λ¨
μμ 1-10
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
#include <stdio.h> int main(int argc, char** argv) { int var = 1; int* int_ptr = NULL; // ν¬μΈν°λ₯Ό λλ‘ λ§λ€κΈ° int_ptr = &var; char* char_ptr = NULL; char_ptr = (char*)&var; printf("Before arithmetic: int_ptr: %u, char_ptr: %u\n", (unsigned int)int_ptr, (unsigned int)char_ptr); int_ptr++; // μΌλ°μ μΌλ‘ μ°μ μ°μ° κ°κ²©μ 4λ°μ΄νΈ char_ptr++; // 1λ°μ΄νΈμ μ°μ μ°μ° κ°κ²© printf("After arithmetic: int_ptr: %u, char_ptr: %u\n", (unsigned int)int_ptr, (unsigned int)char_ptr); return 0; }
μ€ν κ²°κ³Ό μ μ ν¬μΈν°μ μ°μ° κ°κ²©μ 4λ°μ΄νΈ, λ¬Έμμ΄ ν¬μΈν°λ 1λ°μ΄νΈ
1.2.3 μ λ€λ¦ ν¬μΈν°
μ λ€λ¦ ν¬μΈν°: void* μλ£νμ ν¬μΈν°, μμ°Έμ‘° λΆκ°λ₯
μμ 1-13
1 2 3 4 5 6 7 8 9 10 11
#include <stdio.h> int main(int argc, char** argv) { int var = 9; int* ptr = &var; void* gptr = ptr; printf("%d\n", *gptr); return 0; }
μ λ€λ¦ ν¬μΈν°λ₯Ό μμ°Έμ‘°νλ©΄ μ»΄νμΌ μ€λ₯κ° μμ±λ¨
1.2.4 ν¬μΈν°μ ν¬κΈ°
μν€ν μ²μ λ°λΌ ν¬μΈν°μ ν¬κΈ°κ° λ€λ¦
λμ μν€ν μ²μμ sizeof ν¨μ μ¬μ©
1.2.5 νμ ν¬μΈν°
μΆ©λ λλ μΈκ·Έλ©ν μ΄μ μ€λ₯ λ°μ
μμ 1-15
1 2 3 4 5 6 7 8 9 10 11 12 13
#include <stdio.h> int* create_an_integer(int default_value) { int var = default_value; return &var; } int main() { int* ptr = NULL; ptr = create_an_integer(10); printf("%d\n", *ptr); return 0; }
μΈκ·Έλ©ν μ΄μ μ€λ₯ μν©, ptr ν¬μΈν°κ° ν λΉμ΄ ν΄μ λ varμ λ©λͺ¨λ¦¬ μμμ κ°λ¦¬ν΄(νμ ν¬μΈν°)
β 1.3 ν¨μ
βοΈ ν¨μμ ꡬ쑰
ν¨μ: μ΄λ¦κ³Ό μ λ ₯ 맀κ°λ³μμ λͺ©λ‘, μΆλ ₯ κ²°κ³Όμ λͺ©λ‘μ κ°μ§ λ Όλ¦¬ μμ
C μΈμ΄μμ ν¨μλ λ¨ νλμ κ°λ§μ λ°ν
λΈλ‘νΉ ν¨μ: νΈμΆλ ν¨μκ° μ’ λ£λμ΄μΌλ§ λ°νκ°μ νΈμΆμ ν¨μκ° λ°μ μ μμ
λ ΌλΈλ‘νΉ ν¨μ: μ½λ°± λ©μ»€λμ¦, λΉλκΈ° ν¨μ, μ¬κ±΄ κΈ°λ° νλ‘κ·Έλλ°(EDP)
βοΈ μ€κ³μ μ€μμ±
λ‘μ§μ μμ± ν λ€μν κ³³μμ μ¬λ¬ λ² μ¬μ© κ°λ₯
μΆμν: κΈ°μ‘΄μ λ€λ₯Έ λ‘μ§μΌλ‘λΆν° μΌλΆλ₯Ό μ¨κΉ
βοΈ μ€ν κ΄λ¦¬
μ€ν μΈκ·Έλ¨ΌνΈ β λͺ¨λ μ§μ λ³μ, λ°°μ΄, κ΅¬μ‘°μ²΄κ° ν λΉλλ κΈ°λ³Έ λ©λͺ¨λ¦¬μ μμΉ.
μ€ν νλ μ β μ€ν μΈκ·Έλ¨ΌνΈμ κ°μ₯ μμ λμ΄κ³ , ν¨μ λ‘μ§μ΄ μ€νλ©λλ€. νΈμΆμ΄ λλλ©΄ μ€ν νλ μμ μ κ±°λλ©° μ§μ νΈμΆ ν¨μλ‘ κ³μ μ΄μ΄μ§λλ€.
μ€ν νλ μ μμ
1 2 3 4 5 6 7 8 9 10 11 12 13 14
int main() { func1(); } void func1() { func2(); } void func2() { }
μ€ν μ€λ²νλ‘ β μ€νμμλ λ©λͺ¨λ¦¬κ° νμ μ μ λλ€. νμ§λ§ ν¨μ νΈμΆμ λ무 λ§μ΄ μ€νν΄ μ€ν νλ μμ λͺ¨λ μ€ν μΈκ·Έλ¨ΌνΈλ₯Ό λ€ μ¨λ²λ¦° κ²½μ°μ λ°μν©λλ€.
βοΈ κ°μ μν μ λ¬ vs μ°Έμ‘°μ μν μ λ¬
Cμλ μ°Έμ‘°κ° μμ΄, μ°Έμ‘°μ μν μ λ¬μ μ‘΄μ¬νμ§ μμ΅λλ€.
μ€λ‘μ§ κ°μ μν μ λ¬λ§ μ‘΄μ¬ν©λλ€.
κ°μ μν μ λ¬ ν¨μ νΈμΆμ μ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include <stdio.h> void swap(int, int); int main(void) { int a = 5, b = 3; printf("before) a = %d, b = %d\n", a, b); swap(a, b); printf("after) a= %d , b = %d\n", a, b); return 0; } void swap(int num1, int num2) { int temp = num1; num1 = num2; num2 = temp; printf("swap) a = %d , b = %d\n", num1, num2); } /****************************************************** before) a = 5, b = 3 swap) a = 3 , b = 5 after) a= 5 , b = 3 *******************************************************/
ν¬μΈν°λ₯Ό λ³μλ‘ μ λ¬νλ κ²μ΄ ν¬μΈν°μ μν μ λ¬μ λλ€.
ν¬μΈν°μ μν ν¨μ νΈμΆμ μ
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
#include <stdio.h> void func(int* a) { int b = 9; *a = 5; //ν¬μΈν° μμ°Έμ‘° a = &b; } int main(void) { int x = 3; int* xptr = &x; printf("the value before the call = %d \n", x); printf("pointer value before the call = %p\n", xptr); func(xptr); printf("the value after the call = %d \n", x); printf("pointer value after the call=%p \n", xptr); return 0; } /****************************************************** the value before the call = 3 pointer value before the call = 0000007032AFF624 the value after the call = 5 pointer value after the call=0000007032AFF624 *******************************************************/
μμ κ²°κ³Όλ₯Ό 보면 ν¬μΈν°μ κ°μ ν¨μ νΈμΆ μ΄νμλ λ³νμ§ μμ΅λλ€. μ΄λ ν¬μΈν°κ° κ°μ μν μ λ¬ μΈμλ‘ μ λ¬λμμμ μλ―Έν©λλ€. ν¬μΈν°λ₯Ό μμ°Έμ‘°νλ©΄ νΈμΆνλ μͺ½μ ν¨μμ λ³μλ₯Ό μμ ν μ μλλ‘ ν©λλ€.
β 1.4 ν¨μ ν¬μΈν°
βοΈ ν¨μ ν¬μΈν°
β ν¨μμ μ£Όμλ₯Ό μ μ₯νλ©° ν¨μλ₯Ό κ°μ μ μΌλ‘ νΈμΆν μ μλλ‘ κ΅¬νν©λλ€.
β μ΄λ‘μΈν΄ κ°κ°μ κΈ°λ₯λ€μ νμΌλ³λ‘ λλμ΄ λλ μμ μΈ λͺ¨λνκ° κ°λ₯ν΄ μ‘μ΅λλ€.
1
2
3
4
ν¨μ ν¬μΈν° λ³μ μ μΈ = int (*fptr) (int);
int - ν΄λΉ ν¨μμ λ°νν
(*fptr) - ν¬μΈν° λ³μ
(int) - ν΄λΉν¨μμ 맀κ°λ³μμ νν
λ€λ₯Έ ν¨μ μ¬λ¬ κ°λ₯Ό νΈμΆνλ νλμ ν¨μ ν¬μΈν°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <stdio.h> int sum(int a, int b) // νμ λ³μΉμΌλ‘ ν΄λλ νΈμ΄ μ’μ΅λλ€. { return a + b; } int subtract(int a, int b) { return a - b; } int main() { int(*func_ptr)(int, int); func_ptr = NULL; // ν¨μ ν¬μΈν°λ NULLλ‘ μ΄κΈ°νλ₯Ό ν΄μ£Όμ΄μΌν©λλ€. func_ptr = ∑ int result = func_ptr(5, 4); printf("Sum = %d\n", result); func_ptr = &subtract; result = func_ptr(5, 4); printf("subtract = %d\n", result); return 0; } Sum = 9 subtract = 1
μ¬λ¬κ°μ λ€λ₯Έ ν¨μλ₯Ό νΈμΆνλ νλμ ν¨μ ν¬μΈν°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
#include <stdio.h> typedef int bool_t; typedef bool_t(*less_than_func_t)(int, int); bool_t less_than(int a, int b) { return a < b ? 1 : 0; } bool_t less_than_modular(int a, int b) { return (a % 5) < (b % 5) ? 1 : 0; } int main(void) { less_than_func_t func_ptr = NULL; func_ptr = &less_than; bool_t result = func_ptr(3, 7); printf("%d\n", result); func_ptr = &less_than_modular; result = func_ptr(3, 7); printf("%d\n", result); return 0; } 1 0
β 1.5 ꡬ쑰체
βοΈ μ ꡬ쑰체μΈκ°?
β μμ μλ£ν (PDT) = μλ£κ΅¬μ‘°λ₯Ό μ€κ³ν μ μκ³ , μκ³ λ¦¬μ¦μ μμ± ν μ μμ΅λλ€.
ex) int, double
β μ¬μ©μ μ μ μλ£ν (UDT) = μ§μ μ μν μλ£νμ΄ νμνκ³ , νλ‘κ·Έλλ° μΈμ΄μ μλ£νμΌλ‘λ μΆ©λΆνμ§ μμ λ μ¬μ©ν©λλ€. struct ν€μλλ₯Ό μ¬μ©ν©λλ€.
ex) ꡬ쑰체
(ꡬ쑰체λ νλ μ΄μμ λ³μλ₯Ό νλλ‘ λ¬Άμ μ μλ λ³΅ν© μλ£νμ΄λ―λ‘ κΈ°λ³Έ μλ£ν λ³μλ₯Ό λ¬Άμ΄μ μλ‘μ΄ μλ£νμ λ§λ κ²μ΄κΈ° λλ¬Έμ μ¬μ©μ μ μ μλ£νμΌλ‘ ꡬλΆλ©λλ€.)
β λ€μν ννμ λ°μ΄ν°λ₯Ό μ²λ¦¬ν λ μ μ©ν©λλ€.
βοΈ μ μ¬μ©μ μ μ μλ£νμΈκ°?
κ°μ λμμ μλ‘ μ°κ΄λ μμ±μ κ·Έλ£ΉμΌλ‘ λ¬Άλκ²μ΄ κ°λ μ±μ΄ μ’μ΅λλ€. λ κ³ μμ€μ λ‘μ§, μΈκ° μμ€μ λ‘μ§κ³Ό μΆ©λΆν λΉμ·νκ² λ¬Έμ λ₯Ό λΆμνλ €λ©΄ μλ‘μ΄ μλ£νμ΄ νμν©λλ€.
ex) λΉμ¦λμ€ λ‘μ§ -μν(κ³ κ°, μκ³ , λ, νκΈ, μ§λΆ) κ°λ μ λ§μ£Όνκ³ , μν λ‘μ§μ κ°λ°νκΈ° μν΄μλ κ°λ°μμ λΉμ¦λμ€ λΆμκ°λ νλ ₯νλ©° κ·μΉ, λ‘μ§, μ©μ΄μ§λ±μ 곡μ ν΄μΌν©λλ€.
βοΈ κ΅¬μ‘°μ²΄μ μν
ꡬ쑰체λ νλμ ν΅ν©λ νμ μλ κ΄λ ¨λ κ°μ κ°μν ν©λλ€.
ex) color_t (red, green,blue)
1
2
3
4
5
struct color_t {
int red;
int green;
int blue;
};
β μλ‘μ΄ μλ£ν μλμ μλ‘ κ΄λ ¨μ΄ μλ νλλ₯Ό κ·Έλ£ΉμΌλ‘ λ¬Άλ μΊ‘μν ν©λλ€. κ·Έλ¦¬κ³ λμ νμν λ³μλ₯Ό μ μν λ μ΄ μλ‘μ΄ μλ£νμ μ¬μ©ν©λλ€.
βοΈ λ©λͺ¨λ¦¬ λ μ΄μμ
λ©λͺ¨λ¦¬ λ μ΄μμμ΄ νμν μ΄μ β κ°μ λ©λͺ¨λ¦¬μ μ μ₯λκ³ , cpuλ μ΄ κ°μ μΆ©λΆν λΉ λ₯΄κ² μ½κ³ μΈ μ μμ΄μΌ ν©λλ€.
ꡬ쑰체 λ³μμ ν λΉλ λ°μ΄νΈ μ μΆλ ₯νκΈ°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
#include <stdio.h> struct sample_t { char first; char second; char third; short fourth; }; void print_size(struct sample_t* var) { printf("Size: %lu bytes\n", sizeof(*var)); } void print_bytes(struct sample_t* var) { unsigned char* ptr = (unsigned char*)var; for (int i = 0; i < sizeof(*var); i++, ptr++) { printf("%d ", (unsigned int)*ptr); } printf("\n"); } int main(int argc, char** argv) { struct sample_t var; var.first = 'A'; var.second = 'B'; var.third = 'C'; var.fourth = 765; print_size(&var); print_bytes(&var); return 0; } Size: 6 bytes 65 66 67 0 253 2
sizeof(sample_t)λ 6λ°μ΄νΈλ₯Ό λ°νν©λλ€.
- charν 3κ° shortν 1κ° μ΄ 5λ°μ΄νΈ μ λλ€. μ΄λ λ©λͺ¨λ¦¬ μ λ ¬μ μν΄ λ°μ΄νΈ 67λ€μ 0μ΄ λ³΄μ΄κ² ν©λλ€. 0λ°μ΄νΈλ νμ¬ μλ(cpuκ° λ©λͺ¨λ¦¬μ μ κ·Όν λ μ½λ νΉμ λ°μ΄νΈμ μ)λ₯Ό μμ±νκΈ° μν΄ μΆκ°λλ©°, λ€ λ²μ§Έ νλκ° λ€μ μλμμ μμν μ μλλ‘ ν©λλ€.
μ΄λ λ©λͺ¨λ¦¬ μ λ ¬μ΄λ μμνλ λ°μ΄νΈκ° μλμ μμμ μ μμ λ, μ΄ λ³μλ λ©λͺ¨λ¦¬μ μ λ ¬ λμλ€κ³ ν©λλ€. ex) charνμΈ first, second, thirdλ κ°κ° 1λ°μ΄νΈμ΄λ©° μ΄λ€μ ꡬ쑰체 λ μ΄μμμ 첫λ²μ§Έ μλμ νμ¬ λ©λλ€. μ΄ν fouth λ 2λ°μ΄νΈ μ λλ€. λ§μΌ λ©λͺ¨λ¦¬ μ λ ¬μ΄ λμ§ μλλ€λ©΄ 첫λ²μ§Έ λ°μ΄νΈλ 첫λ²μ§Έ μλμ λ§μ§λ§ λ°μ΄νΈκ° λκ² λ©λλ€.
1
μ΄λ₯Ό λ°©μ§νκΈ° μν΄ μ²«λ²μ§Έ μλλ 0λ°μ΄νΈ νλκ° ν¨νΉ(λ©λͺ¨λ¦¬ κ°μ μ λ ¬)λμ΄ μλ€κ³ ν μ μμ΅λλ€.
- λ©λͺ¨λ¦¬ μ λ ¬μ κΈ°λ³Έμ μΌλ‘ νμ±νκ° λμ΄ μμ΅λλ€.
βοΈ μ€μ²© ꡬ쑰체
λ³΅ν© μλ£ν = μ¬μ©μ μ μ μλ£νμ΄κ³ , λͺ κ°μ ꡬ쑰체λ₯Ό μ€μ²©ν κ²°κ³Όμ λλ€.
λͺκ°μ§ μ€μ²© ꡬ쑰체
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
#include <stdio.h> typedef struct { int x; //4byte int y; //4byte }point_t; //8byte typedef struct { point_t center; //8byte int radius; //4byte }circle_t; //12byte typedef struct { point_t start; //8byte point_t end; //8byte }line_t; //16byte
3κ°μ κ΅¬μ‘°μ²΄μΈ point_tμ circle_t, line_tκ° μ‘΄μ¬ν©λλ€. point_t ꡬ쑰체λ μ€μ§ μμμλ£νμΌλ‘λ§ κ΅¬μ±λ λ¨μν μ¬μ©μ μ μ μλ£νμ΄μ§λ§ λ€λ₯Έ ꡬ쑰체λ€μ point_t μλ£νμ λ³μλ₯Ό ν¬ν¨ν λ³΅ν© μ¬μ©μ μ μ μλ£νμ λλ€.
βοΈ κ΅¬μ‘°μ²΄ ν¬μΈν°
β μ¬μ©μ μ μ μλ£νμ ν¬μΈν°λ μμ μλ£νμ ν¬μΈν°μ λμΌν©λλ€.
β ꡬ쑰체 λ³μ ν¬μΈν°κ° ꡬ쑰체 λ³μμ 첫 λ²μ§Έ νλμ μ£Όμλ₯Ό κ°λ₯΄ν΅λλ€.
λ©λͺ¨λ¦¬μμ λμΌν λ°μ΄νΈ μ£Όμλ₯Ό κ°λ¦¬ν€λ μΈ κ°μ§ μλ£νμΌλ‘λΆν° μ»λ 3κ°μ ν¬μΈν°
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
#include <stdio.h> typedef struct { int x; int y; }point_t; typedef struct { point_t center; int raduus; }circle_t; int main(void) { circle_t c; circle_t* p1 = &c; point_t* p2 = (point_t*)&c; int* p3 = (int*)&c; printf("p1 = %p\n", (void*)p1); printf("p2 = %p\n", (void*)p2); printf("p3 = %p\n", (void*)p3); return 0; } p1 = 00000039EEB9F738 p2 = 00000039EEB9F738 p3 = 00000039EEB9F738
point_tμ circle_t μλ£νμ ν¬μΈν°λ ꡬ쑰체μ λ³μμ 첫λ²μ§Έ νλμΈ xμ μ£Όμλ₯Ό κ°λ¦¬μΌ°μ΅λλ€. typedefλ₯Ό μ¬μ©νλ©΄ ꡬ쑰체μ μ λ³μΉ νμ μ μ μΈ ν μ μμ΅λλ€. μ΄λ μΆνμ struct ν€μλλ₯Ό μ¬μ©νμ§ μκ³ λ³μλ₯Ό μ¬μ©ν μ μμ΅λλ€.