Week04 기간 2024.10.04 FRI - 10.10 THU
조원 ㅎㅅ ㄱㅅ
C언어 시작
WEEK04: C Pointer(&, * 연산자), 동적 메모리 할당, Linked List, Stack, Queue, Binary Tree, Binary Search Tree, 동적 프로그래밍, 그리디 알고리즘
WEEK05: 메모리 누수, 균형 이진 탐색 트리(AVL Tree, Red-Black Tree)
WEEK06: 시스템 콜, 데이터 세그먼트, 메모리 단편화, sbrk/mmap
WEEK07: BSD소켓, IP, TCP, HTTP, file descriptor, DNS
0. C언어 개발 환경 구성
1) 서버 설정 + SSH 접속
2) 서버에 파일 올리기 + 편집기 사용
3) 컴파일러/ 디버거 사용
1. 진행할 내용
기본 자료 구조 C언어로 구현하기
https://github.com/krafton-jungle/Data-Structures
2. 공부 키워드
No. | 키워드 | 정리 내용 |
1 | 포인터 | ㅎㅅ |
2 | 가상화 | ㅎㅅ |
3 | GCC | https://helloahram.tistory.com/73 |
4 | 포인터의 연산 | ㅎㅅ |
5 | 동적 메모리 할당 | ㄱㅅ |
6 | malloc, calloc, relloc | ㄱㅅ |
7 | B Tree | https://helloahram.tistory.com/74 |
8 | 위상정렬 | ㅎㅂ |
9 | Trie (Optional) | |
10 | KMP 알고리즘 (Optional) | |
11 | 보이어-무어 알고리즘 (Optional) |
3. 책 읽기
1) 1장 - 컴퓨터 시스템으로의 여행
1장 정리 https://helloahram.tistory.com/29
2) 3장 - 프로그램의 기계 수준 표현 (특히 3.4, 3.7, 3.8)
3.1 - 3.5 정리 https://helloahram.tistory.com/66
3.6 - 3.11 정리 https://helloahram.tistory.com/66
C언어 설명
C언어 퀴즈 (C언어 공부 후 풀어보세요) 영어이긴 하지만 대부분 C code여서 쉽게 이해할 수 있습니다.
- C Programming - Online Quiz (Tutorial Points)
- C Input and Output (Geeks for Geeks)
- C Functions (Geeks for Geeks)
- C Data Types (Geeks for Geeks)
- C Pointer Basics (Geeks for Geeks)
- C Dynamic Memory Allocation (Geeks for Geeks)
Q. 왜 C 언어로 교육과정을 진행하나요?
C 언어가 인간이 이해할 수 있으면서도 기계에 가장 가깝고, 그래서 성능 타협을 별로 안한, 즉 컴퓨터의 성능을 최대한 끌어낼 수 있는 언어이기 때문입니다.
C 언어를 제대로 쓰려면 CPU, memory, I/O로 구성된 컴퓨터 구조, 즉 폰노이만 구조를 이해해야 합니다. C 언어로 복잡한 data structure를 구현해 봄으로써 컴퓨터의 동작 구조를 익히고 나아가서 보다 뛰어난 성능의 코드를 만들 수 있는 가능성을 엿볼 수 있는 경험을 제공하기 위함입니다.
Q. C언어가 F1 레이스 카라면 왜 많은 회사에서 C로만 개발하지 않나요?
개발 생산성 때문입니다. F1 레이스 카를 대량 생산하지도, 일반인이 공공도로에서 탈 수 없는 이유와 같습니다.
좋은 성능만큼 개발 및 유지 보수에 비용이 들기 때문에, 처음 개발할 때는 성능을 포기하고 고급언어로 대충 개발합니다. 그러나, 서비스가 커짐에 따라 대체로 다음과 같은 최적화 과정을 거칩니다.
- 일단 기계 대수를 늘려서 현재 서비스 수요를 감당
- 성능에 영향을 주는 주요 부분들, 즉 매우 많이 실행되거나 고성능이 요구되는 부분을 분리
- 해당 부분의 계산 복잡도가 충분히 낮지 않으면 알고리즘적 최적화 수행 혹은 문제 단순화
- 그래도 문제가 해결되지 않으면 C/C++ 언어로 개발해서 해당 부분의 성능 향상 및 경쟁력 강화
이런 과정을 거치면 전체적인 성능향상을 이루면서도 개발 비용이 많이 드는 C/C++로 개발하는 부분은 최소화 할 수 있습니다.
잘 살펴보면, 정말 많이 사용되는 program이나 library는 C/C++로 개발되어 있습니다. 당장 여러분이 사용했던 Python interpreter도 code의 대부분은 C로 짜여져 있습니다. 그래서, cpython이라고 부릅니다. (pypy compiler는 Python으로 짜여졌습니다.) 기본 암호 library인 OpenSSL 역시 전부 C로 짜여져 있습니다. Linux operating system 역시 C 언어로 짜여져 있습니다. (사실 C언어가 Unix 개발하기 위해 만든 언어이기도 하고...)
gcc로 컴파일하기
코드를 컴퓨터가 알아들을수 있도록, 기계어로 변환해야 합니다. 이 과정을 컴파일이라고 합니다.

다음과 명령어로 컴파일을 수행합니다.
$ gcc -g -o <실행파일명> <소스파일명> ...
$ gcc -g -o hello hello.c
- 자주 사용되는 컴파일 옵션
- -g → gdb 디버깅 정보포함
- -I → include 경로
- -Wall → all warning enable
- -O → optimization for code ( = -O1)
- 참고
gdb를 이용한 디버깅
컴퓨터가 변환된 프로그램(기계어)를 수행 발생하는 에러를 잡는 과정을 디버깅이라고 합니다. gdb는 디버깅을 도와주는 도구입니다. gdb는 프로그램이 매단계마다 어떤 순서로 진행되는지와 해당 단계에서의 상태를 관찰할 수 있습니다.
- 컴파일: 디버깅을 위한 컴파일
$ gcc -g -o <실행파일명> <소스파일명> ...
$ gcc -g -o hello hello.c
- hello.c 파일
#include <stdio.h>
int mytest(int a, int b)
{
int result = a + b;
return result;
}
int main()
{
int c;
c = mytest(10, 20);
printf("c = %d\\n", c);
}
- 디버거실행: 프로그램 디버깅 환경인 gdb(디버거)를 실행합니다.
$ gdb <디버깅할 실행프로그램>
// gdb에 정상적으로 접속되었다면, 다음과 같이 표시됩니다.
... 중략
(gdb)
- 코드보기: 디버깅중인 코드를 봅니다.
(gdb) l(list)
(gdb) list 10
(gdb) list [함수명]
(gdb) list - // 이전 10라인을 출력한다.
(gdb) list [파일명]:[함수명]
(gdb) list [파일명]:10
- breakpoint 지정: 실행 중단점을 설정합니다.
(gdb) b(break) [함수명] // 함수명으로 중단점 지정
(gdb) break 10 // 라인번호로 중단점 지정
(gdb) break [파일명]:[함수명] // 파일:함수명으로 중단점 지정
(gdb) break [파일명]:10 // 파일:라인번호로 중단점 지정
- 시작: 디버깅시작 - breakpoint가 있었다면, breakpoint에서 실행 중지됨
(gdb) run
(gdb) r
- 다음 실행하기
(gdb) next
(gdb) n
- 5번라인 중지 → next → 5번라인실행 → 6번라인 중지
- 상태값 출력: 현재 중지상태에서의 변수값 보기
(gdb) print <변수명>
- 중단점 리스트 보기: 현재의 모든 중단점 리스트를 보여줍니다.
(gdb) break 5
(gdb) break 12
(gdb) info break // 설정된 중단점 보기

- 디버거종료: gdb를 종료합니다.
(gdb) q
(gdb) quit
gdb tui를 이용한 디버깅
tui는 gdb를 좀더 보기 편하게 도와주는 명령어입니다. 코드리스트와 중단점을 같이 보여줍니다.
- gdb tui 실행
$ gdb hello --tui
// 또는 gdb 실행후
(gdb) layout src

- 중단점 설정 + 실행
// 하단 커맨드창에 다음을 입력
(gdb) break 5
(gdb) run
- 상단 소스에서 5번라인에서 실행중지 상태로 보여집니다.
- 다음 실행하기
// 하단 커맨드창에 다음을 입력
(gdb) n // 또는 next
- 상태값 출력: 현재 중지상태에서의 변수값 보기
(gdb) print <변수명>
- 중단점 리스트 보기: 현재의 모든 중단점 리스트를 보여줍니다.
- 디버거종료: gdb를 종료합니다.
(gdb) q
(gdb) quit
gdb 사용법 참고
- hw breakpoint 개수 초과
// gdb 실행후, sw breackpoint, sw watchpoint 설정
(gdb) set breakpoint auto-hw off
(gdb) set can-use-hw-watchpoints 0
- 자주 사용되는 설명은 .gdbinit 파일에 설정해서 사용
- 커맨드 참고
'크래프톤정글 > 정글생활' 카테고리의 다른 글
[정글] 정글 C언어 주차 퀴즈 (0) | 2024.10.08 |
---|---|
[정글] Week03 회고 (9) | 2024.10.05 |
[정글] 정글 알고리즘 주차 퀴즈 (0) | 2024.10.02 |
[정글] Week03 진행 내용 (1) | 2024.09.29 |
[정글] Week02 회고 (8) | 2024.09.28 |