[크래프톤 정글 3기] 11/5(일) TIL

ClassBinu·2023년 11월 5일
0

크래프톤 정글 3기 TIL

목록 보기
24/120

일요일이어서 한 시간 더 자는 사치 좀 부려 봄..
8:45 입실
RB Tree 삭제 코드로 구현하고 완벽하게 이해한다!!


C


size_t가 뭐야?

메모리 크기를 표현할 때 사용되는 자료형

과제에서 정의한 구조체인 줄 알았는데 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 int key_t;

typedef로 기존 데이터 타입에 별칭을 부여한 것!
typedef int key_t;에서 컴파일러는 key_t를 int로 해석한다.

그냥 int쓰지 왜 별칭 붙이나?
1. 가독성이 높아짐
2. 코드 내 특정 타입 의미 명확히 하기 위함
3. 유지보수성 좋아짐 -> 추후 key_t의 변수를 int에서 long으로 바꿀 때 typedef가 아니라면 모든 변수 타입을 바꿔야 하는데, typedef로 별칭을 지정하면 typedef에서만 바꿔주면 됨!


pointer의 유용함!

트리 요소 배열 함수에서는 재귀를 호출할 때 인덱스로 &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. 유지보수 쉽게
(이를 위해 리팩토링을 한다.)
단, 리팩토링을 오버헤드가 있다.

소프트웨어는 나이가 먹는다.(설계는 낡아진다.)

0개의 댓글