sw사관학교정글 59

[week06] 가상 메모리란? Virtual Memory

가상 메모리(Virtual Memory) 우리는 main memory(RAM)를 가지고 있다. 그런데 main memory의 크기가 작아서 모든 정보를 담기에는 부족한 경우가 있다. 이 때 하드디스크까지 main memory(RAM)를 확장해서 사용하는 것을 큰 틀에서의 Virtual Memory 기법 이라고 한다. 물리 주소와 가상 주소 물리주소는 main memory(RAM)에만 존재하는 것이다. 가상주소는 하드디스크까지 메모리를 확장했을 때 얻을 수 있는 값들을 이야기한다. 물리주소와 가상주소가 어떻게 동작하는지 살펴보자. 일단 main memory가 16KB 크기를 가진다고 가정하자. CPU가 가상메모리에서 어떤 주소를 할당해달라고 요청하면, MMU(memory management unit)가 요..

[week06] 헤더 파일을 사용하는 이유 feat(Private global, static)

malloc 과제를 진행하다가.. /* Private global variables */ static void *extend_heap(size_t words); 라는 주석과 코드를 만났는데, Private이 무슨 뜻인지 궁금해서 구글링 해봤더니 다음과 같은 설명을 찾을 수 있었다. 키워드: 접근 제한, 접근 제어 public: 내부, 외부 접근 모두 허용 private: 내부접근만 허용 그런데 global은 전역변수로서 모든 함수에서 접근가능하고, private은 내부접근만 허용하는데 그럼 이 두개의 의미가 충돌하는 것이 아닐까? 하는 생각이 들었다. 결론부터 말하자면 그렇지 않다! 왜냐하면 뜻하는 범위가 다르기 때문이다. 이것을 이해하기 위해서는 header file을 사용하는 이유에 대해서 알아야 한..

[week05] C언어 시작하자마자 red-black tree 구현하기

📷 회고 이번 주는 조금(많이) 버거웠던 주였다. 앞으로 9주 동안 C언어를 사용하기 때문에 첫 주차에 C언어의 기본적인 내용들을 정리하고 가고 싶었다. 그래서 목, 금, 토, 일요일을 모두 사용해서 C언어를 한번 훑었다. 파이썬과 비슷한 부분은 넘어가면서 최대한 빨리 본 것인데도 4일이나 걸려서 당황스러웠다. 3일 정도 걸릴 것이라고 생각했는데 생각보다 양이 많았다... C언어 개념과 문법을 훑은 다음에는 linked list를 직접 구현해 보면서 포인터에 익숙해졌다. 그리고 이진탐색 트리를 linked list를 사용해서 구현한 것을 직접 구현해보고 싶었지만 시간이 너무 부족해서 이해만 하고 바로 red-black tree 공부로 넘어갔다. 그런데 red-black tree가 생각보다 너무 어려웠다 ..

[week05] 포인터 이해하기 - part.2

포인터의 포인터 포인터의 포인터는 어떻게 표현할까? 쉽게 상상할 수 있듯이 다음과 같이 정의한다. int **p 위는 int를 가리키는 포인터를 가리키는 포인터라고 할 수 있다. 포인터의 포인터 예제 #include int main(){ int a; int *pa; int **ppa; pa = &a; ppa = &pa; a = 3; printf("a : %d // *pa : %d // **ppa : %d \n", a, *pa, **ppa); printf("&a : %p // pa : %p // *ppa : %p \n", &a, pa, *ppa); printf("&pa : %p // ppa : %p \n", &pa, ppa); return 0; } // a : 3 // *pa : 3 // **ppa : 3..

[week05] 포인터 이해하기 - part.1

포인터의 악명 C언어를 조금이라도 공부해 본 사람들은 악명 높은 포인터에 대해 잘 알고 있을 것이다. 심지어 C언어를 공부하지 않았던 사람이라도 주변 사람들이 포인터로 고통받는 것을 목격했을지도 모른다. 이 포인터란 놈은 헷갈리기 쉬운 개념이기 때문에 이번 기회에 차근차근 알아가 보려고 한다. 포인터를 알아보자 포인터는 특정한 데이터가 저장된 (시작)주소값을 보관하는 변수다. 우리가 예전에 다뤄왔던 int나 float을 생각해보자. int형 변수는 정수를 보관한다. float형 변수가 실수를 보관한다. 마찬가지로 포인터는 주소값을 보관한다. 포인터는 아주 새로운놈은 아니었던 것이다. 뭐야? 포인터도 그냥 int, char 같이 어떤 형태의 값을 보관하는 변수잖아? 별거 아녔네!라고 생각하자(그렇지 않더라..

[week05] 코드리뷰 - 류석영 교수님

가독성 더 좋은 버전 ⬇ https://selective-aphid-cd5.notion.site/a4c0b6b92cec4812bf2601988ac16702 코드리뷰 강의 정리 키워드 위주로 적고 나중에 찾아본다(1시간 강의라 깊이가 얕음). selective-aphid-cd5.notion.site ✅ 결론 코드리뷰에서 가장 중요한 2가지는 이해하기 쉬운 코드 유지보수 하기 쉬운 코드 이해하기 쉬워야 유지보수가 편하다. 유지보수가 편해야 디버깅할 일이 없다. 💻 코드리뷰 구글 코드리뷰에서 제일 중요한 것 Test-Driven Development(TDD) 구현해야 할 요구사항(requirements)과 구현(implementation)를 분리하는 것. 구현하기 전에 test부터 짠다. 제대로 동작하려면 이..

[week04] SW사관학교 정글 4주차 회고

📷 회고 이번 주차는 알고리즘 주차의 마지막 주였고 키워드는 동적 프로그래밍, 그리디 알고리즘이었다. 알고리즘 4주차쯤 오니까 어떻게 개념공부를 해야 하고, 어떻게 팀 활동을 해야 하는지 슬슬 알 수 있었다. 문제 수가 적어서 우리 조는 주어진 과제들을 모두 풀고, 답을 보고 푼 문제들은 한번 더 풀고, leetcode와 백준에 연관되어있는 문제도 같이 풀어보았다. 조원 형이 문제를 끊임없이 추천해줘서 문파르타 코딩클럽이라고 장난쳤던게 기억에 남는다. 시험에서 실제로 조원 형이 추천해준 문제가 나왔다...! 시험문제에서 dfs와 greedy를 섞어 놓은 문제가 나왔는데 실제 코딩 테스트에서는 이런 식으로 출제가 될 것 같았다. 정형화된 문제들은 정말 쉽게 풀 수 있어야 2~3개의 개념이 섞인 문제도 풀 ..