일요일이어서 한 시간 더 자는 사치 좀 부려 봄..
8:45 입실
RB Tree 삭제 코드로 구현하고 완벽하게 이해한다!!
메모리 크기를 표현할 때 사용되는 자료형
과제에서 정의한 구조체인 줄 알았는데 C 표준 데이터 타입이었음.
양의 정수를 나타내며, 크기를 바이트 단위로 나타낼 때 사용
예를 들어 배열 크기, 메모리 블록 크기, 문자열 길이 등
int쓰지 size_t를 왜 쓰나?
int는 부호 있는 정수 타입이다. 그래서 음수를 포함하는데 그럼 메모리 주소 전체를 표현 못한다.
또한, 음수 값으로 주소를 접근하면 오버 플로우, 언더 플로우가 발생할 수 있다.
size_t는 시스템 비트에 맞추어 전체 메모리 주소를 표현할 수 있다.(양의 정수만 표현하므로)
64비트 머신 기준 size_t는 64비트 크기를 가진다.
당연한 게 주소 값을 다 표현하려면 해당 시스템의 비트 만큼의 크기를 가져야 한다.
size_t는 사용하면 변수가 객체 크기, 배열 길이, 메모리 블록을 나타낼 것이 명시적으로 나타난다.
malloc()은 size_t 타입의 크기를 인자로 받고,
strlne()은 size_t 타입을 반환한다.
C에서 int, float, char 같은 거 말고도 size_t 같이 특수한 타입들도 많다!
(ptrdiff_t, inptr_t, int8_t, FILE, time_t)
결론: 객체 크기, 메모리 관련 연산은 int대신 size_t를 사용하는 게 적절하다.
typedef로 기존 데이터 타입에 별칭을 부여한 것!
typedef int key_t;
에서 컴파일러는 key_t를 int로 해석한다.
그냥 int쓰지 왜 별칭 붙이나?
1. 가독성이 높아짐
2. 코드 내 특정 타입 의미 명확히 하기 위함
3. 유지보수성 좋아짐 -> 추후 key_t의 변수를 int에서 long으로 바꿀 때 typedef가 아니라면 모든 변수 타입을 바꿔야 하는데, typedef로 별칭을 지정하면 typedef에서만 바꿔주면 됨!
트리 요소 배열 함수에서는 재귀를 호출할 때 인덱스로 &index를 넘긴다.
index는 지역 변수이기 때문에 해당 함수 안에서만 사용할 수 있다.
이 인덱스를 다른 함수에서 참조하기 위해 index의 주솟값을 넣어 포인터 변수로 넘겨서
다른 함수에서도 참조할 수 있게 하는 것!
이 관점에서 보면 파이썬으로 결과를 리스트의 extend하는 방식이 아닌
객체 자체를 넘겨서(객체 자체의 주소를 넘김) 재귀 호출한 방식과 비슷하다고 볼 수 있음!
C 포인터 이해하니까 파이썬 이해 됨!!!
파이썬에서 가변객체는 그 자체가 포인터 변수라고 할 수 있음!!
// 중위 순회 재귀
void inorder_recursion(const node_t *node, key_t *arr, size_t *index,
const node_t *nil)
{
if (node == nil)
return;
inorder_recursion(node->left, arr, index, nil);
arr[(*index)++] = node->key;
inorder_recurtion(node->right, arr, index, nil);
}
// 트리 요소 배열
int rbtree_to_array(const rbtree *t, key_t *arr, const size_t n)
{
if (t == NULL || arr == NULL)
return -1;
size_t index = 0;
// 여기에서 &index를 넘긴다.
inorder_recursion(t->root, arr, &index, t->nil);
if (index != n) {
return -1;
}
return 0;
}
카이스트 류석영 교수님 온라인 강의
사용자 5천만명을 모으는데 걸리는 시간은 빠르게 줄어 들고 있다.
라디오 시대에는 38년
텔리비전 13년
인터넷 4년
페이스북 1096일
구글+ 68일
과거에는 폭포수 방식으로 개발했다면 지금은 애자일 모델
시장의 니즈는 매우 빠르게 변한다.
TDD
테스트는 실행 가능한 문서다. (주석은 그냥 글)
구글은 테스트가 없으면 커밋이 불가능하다.
자잘하게 자주 커밋해야 디버깅이 쉽다.
Pair Programming
부트캠프식 일방향 강의 등 다양한 방식 중
페어 프로그래밍이 지식을 가장 빨리 배울 수 있는 방법이더라.
코드 리뷰는 딱 코드만 보는 것!
아키텍서 설계, 기능 검토는 코드 리뷰에서 다루는 게 아니다.
코드 리뷰는 작성하는 사람을 위한 게 아니라, 읽는 사람을 위한 것!
구글의 코드 리뷰 워크 플로우
A. CL(change list) 만들기
B. 코드 리뷰 요청(구글은 봇이 적절한 코드 리뷰어를 추천해 줌)
C. 코드 리뷰 코멘트
D. 코드 개선 및 B~C 반복(LGTM때까지, Looks Good To Me)
E. 모든 리뷰어의 LGTM을 얻으면 커밋
좋은 코드 리뷰 형식
~이건, ~이러한 이유로, ~이렇게 바꾸는 것이 좋습니다.
이름은 자세하게 설명하기
함수는 작게 짜라. 이름에서 함수 역할이 드러나야 한다.
가장 중요한 건 팀의 스타일을 지켜라.
테스트 자체는 컴퓨터 과학에서도 큰 주제이다.
새로 온 개발자로 테스트 코드로 프로젝트로 기여할 수 있다!
unit testing: 가장 많은 테스트는 유닛 테스트(함수 하나하나 테스트)
integration testing: 통합 테스트
regression testing: 회귀 테스팅, 소프트웨어 변경 전후 기능이 올바르게 작동하는지
-> 이건 오래 걸려서 보통 밤에 돌림
end to end(E2E) testing: 사용자가 시스템을 사용하는 것과 유사한 흐름으로 테스팅
동작을 바꾸지 않으면서 내부 구조로 개선하는 일
코드 리뷰의 이유는
1. 이해하기 쉽게
2. 유지보수 쉽게
(이를 위해 리팩토링을 한다.)
단, 리팩토링을 오버헤드가 있다.
소프트웨어는 나이가 먹는다.(설계는 낡아진다.)