본문 바로가기

전체 글23

C++ 이동 의미론 (move semantics) - #1 배워야 할 것들 : std::move, type&&, 이동 생성자, 이동 대입 연산자 이유 : 임시 객체를 만들 때 복사 동작 생략해서 성능 향상하기 위해 int a = (4 + 2); 위 코드를 조금 상세하게 보면 (4 + 2) 의 결과가 임시값으로 생성되고 'a'라는 변수에 복사 됩니다. 여기서 'a'는 이름이 있는 변수로써 좌측값에 해당하고, (4 + 2)는 임시 객체로 우측값에 해당 합니다. void display(string& message); string a = "Hello"; string b = "World"; display(a + b); 그렇다면 위에서 함수 인자로 전달되는 두 string 변수의 합은 어떨까요? 아래와 같은 컴파일 에러가 발생합니다. error: cannot bind no.. 2023. 8. 23.
observer design pattern example 위 그림에서 MyTextView->draw() 와 MyGraphView->draw() 를 사용하고 MyIntDocument->getData()를 사용해야 하는 경우 상호간 양방향 참조를 하고 있습니다. 이를 개선하기 위해서 아래와 같이 변경하면 MyTextView와 MyGraphView에서 MyDocument로만 의존성이 있게 됩니다. MyIntDocument에서 MyTextView로의 의존성은 Observable에서 Observer 인터페이스 방향으로 추상화 되었습니다. 위 그림에서 각 구현체 객체들의 일관된 인터페이스로 통신하는 것이 더 좋을 것 같습니다. 의존성 역전(DIP)의 SOLID 원칙을 추가해서 구현해 보면 아래와 같이 MyDocument와 MyView의 인터페이스를 라이브러이 안에 가두어.. 2022. 11. 29.
composite design pattern example 각 다형성의 요소들을 그룹으로 묶어서 같이 관리하고자 할 때 사용할 수 있습니다. 위와 같은 상태에서 FigureGroup도 Rectangle과 Line을 다루는 인터페이스로 같이 사용하기 위해서는 아래와 같이 FigureGroup이 Figure class를 상속하게 해줍니다. 여기서 FigureGroup과 같은 컬랙션을 다시 상속하여 구현할 수 있는데 아래와 같은 다른 예시가 있습니다. Array와 List 방식의 각 Collection으로 Object*를 저장하는 위와 같은 구현이 있을 때 Array와 List도 Collection을 통해 아래와 같이 Object*를 상속하게 만들어서 List에 다시 List를 저장하여 관리하는 기능을 확장할 수 있습니다. 2022. 11. 29.
정렬: heap(priority queue) 좌우 트리가 균형적일 경우에는 배열로 표현하는 것이 유리합니다. 장점 - 리스트로 구현할 때 소비되는 연결 포인터에 대한 메모리 공간을 절약할 수 있고 포인터 연산에 필요한 메모리 접근을 수식 연산으로 대체합니다. 메모리 접근 비용보다 수식 연산이 빠릅니다. 단점 - 배열 크기를 사전에 결정하여 할당해야 하기 때문에 구현 시 배열 크기가 가늠이 되지 않을 경우에는 사용이 어렵고 사전에 결정이 가능하다고 하더라도 시작부터 전체 메모리를 할당하고 시작해야 하기 때문에 메모리를 효율적으로 사용하기 어렵습니다. 왼쪽 자식 인덱스 (2 x 부모 인덱스) + 1 오른쪽 자식 인덱스 왼쪽 자식 인덱스 + 1 부모 인덱스 (자식 인덱스 - 1) / 2 heap 힙은 완전 이진 트리를 이용하여 힙에 값을 넣을 때나 뽑을.. 2022. 7. 3.
정렬: radix sort counting sort는 전체 원소의 최대값 만큼 counting table을 할당 해서 처리해야 하므로 원소 값들의 차이가 클 때는 불리한 면이 보입니다. 그래서 counting sort 같이 각 원소들의 우선 순위를 비교하지 않는 방법이면서 어떤 묶음 단위로 계층적으로 처리하면 이에 대한 단점을 보완할 수 있기 때문에 radix sort를 사용합니다. radix는 base라고도 하며 2진법, 10진법, 16진법 같은 개념입니다. 그런데 꼭 radix sort는 기존 몇 진법에 따라서만 사용하는 것이 아니라 필요에 따라 1000진법 같은 효율적은 묶음 단위 방법으로 사용해도 좋을 것 같습니다. 10진수로 고정하여 C/C++로 아래와 같이 구현해 보았습니다. #define _CRT_SECURE_NO_W.. 2022. 7. 3.
정렬: counting sort 정렬될 결과에서 배치될 순서를 기준으로 정렬하는 방법으로 해당 항목값이 몇 개씩 있는지 세는 방법으로 정렬하는 방식을 counting sort라고 합니다. counting table만 구해서 그 counting 값을 기준으로 원소 값들을 재 배치하면 단순 하겠지만 다음 radix sort에서도 동일 원리를 사용하여 구현하는 것이 용이하기 때문에 누적 counting 값을 기준으로 원소들을 재 배치 합니다. C/C++로 구현하면 아래와 같습니다. void counting_sort(int *data, int len) { int table_max = max(data, len) + 1; int *counting_table = new int[table_max]; int *sorted_data = new int[l.. 2022. 6. 20.
정렬: heap heap은 완전 이진 tree를 이용하여 heap에 값을 넣을 때나 뽑을 때 항상 최대 또는 최소 값을 정렬하여 저장하도록 구성됩니다. 완전 이진 tree의 부모는 자식보다 클 때 root가 최대값을 가지는 최대 heap을 부모가 자식보다 작을 때 최소값을 가지는 최소 heap을 구현할 수 있습니다. 1) 삽입 방법 - 배열의 끝에 추가한 후 부모와 자식의 관계를 이용하여 위로 재 정렬 합니다. 2) 추출 방법 - 루트를 추출하여 사용한 후 배열의 끝 원소를 root 자리로 옮긴 다음 아래로 정렬 합니다. 좌우 tree가 균형적일 경우에는 배열로 표현하는 것이 유리합니다. 장점 - list로 구현할 때 소비되는 연결 pointer에 대한 memory 공간을 절약할 수 있고 pointer 연산에 필요한 m.. 2022. 6. 19.
정렬 1. 각 항목간 비교하여 정렬하는 방법 선택, 삽입, 버블 정렬들은 worst O(n^2) 이므로 일반적으로 사용이 쉽지 않다고 생각됩니다. 분할 정복 기법을 추가하여 정렬하는 합병 정렬과 quick 정렬은 O(nlog n) 이지만 quick 정렬은 피벗을 잘 못 선택하면 worst O(n^2)이기 때문에 주의해서 사용해야 하고 합병 정렬은 최소 정렬할 자료의 크기 만큼 저장소가 추가로 필요하고 recursive로 구현할 때 stack 넘침의 위험성이 있습니다. 그래서 가장 용이하게 시도할 수 있는 방법으로 우선 순위 queue를 구현하는 방법인 heap 정렬을 생각해 볼 수 있을 것 같습니다. 2. 정렬될 결과에서 배치될 순서를 기준으로 정렬하는 방법 각 항목을 서로 비교하여 정렬하는 방법들은 O(nl.. 2022. 6. 19.
의사 난수 생성기 - 4. 메르센 트위스터(Mersenne Twister) 1997에 Makoto Matsumoto와 Takuji Nishimura가 개발하여 현대에 보편적으로 사용하는 PRNG (의사 난수 생성기)로 R 이나 Ruby, Pascal, PHP, Python, GLib, C++ Boost등의 기본 난수 생성기 알고리즘으로 사용되고 있습니다. 그 이름의 유래는 난수 생성 주기가 Mersenne prime 수인 2^19937 - 1 개의 주기 길이에서 만들어졌습니다. 기본 구현인 MT19937은 32 비트로 구현 되었으며 64 비트로 구현된 것은 MT19937-64로 호칭합니다. 624개의 정수(seed 포함)를 짝지어서 623차원의 하이큐브에 해당하는 좌표에 점을 찍어서 일관성을 발견할 수 없을 만큼 분포가 좋습니다. 필요한 버퍼 크기는 일반적으로 2.5KiB로 크.. 2022. 5. 2.
의사 난수 생성 - 1. Middle-square method 1949년 폰 노이만에 의해서 고안된 의사 난수 생성 방법으로 애니악에서 사용되었다고 합니다. 최초값 seed를 제곱한 후에 중앙에서 seed와 동일한 자리수를 추출하는 방법입니다. 예를 들어 seed 값이 117이라고 했을 때 117 * 117 = 13689 이고 중앙에서 3자리를 뽑아 내면 368이 됩니다. 다음에도 368을 seed로 하여 동일한 방법을 반복 합니다. 그런데 이를 계속 반복해 보면 117 368 360 960 160 560 360 금새 같은 값을 가지게 되었습니다. 그리고 많은 seed 값들이 0으로 수렴하게 됩니다. 따라서 현재는 간단한 의사 난수 생성기로 LCG를 사용합니다. 전체적인 의사 난수 생성기의 역사적인 흐름은 아래 링크를 참고 하였습니다. 메르센 트위스터 이후로는 새로.. 2022. 5. 2.
의사 난수 생성 - 2. LCG (Linear Congruential Generator) 선형 합동 생성기 라고 직역 할 수 있겠습니다. C 언어의 rand() 함수 구현과 Java.util.Random에 사용되었습니다. 가장 잘 알려진 간단한 의사 난수 생성 방법 중의 하나로, 1958년에 만들어 졌으며 재귀적으로 아래와 같은 점화식으로 정의 됩니다. 1) m > 0 2) 0 16) % 0x8000; } 참고: https://en.m.wikipedia.org/wiki/Linear_congruential_generator Linear congruential generator - Wikipedia The other widely used primitive for obtaining long-period pseudorandom sequences is t.. 2022. 5. 2.
의사 난수 생성 - 3. LFSR (Linear Feedback Shift Register) PS (Problem Solving) 문제의 입력 데이터 생성을 위해서 재현 가능한 난수가 필요 합니다. 어찌보면 "재현 가능하다"와 "난수"라는 개념이 상반되지만 암호학에서 pseudo-noise sequence, 통신에서 whitening sequence 등이 필요한 곳에서 사용하는 방법으로 실제 상황과 유사하게 임의의 데이터를 발생 시켜서 입력 해야 하지만 분석을 위해서 재현 가능한 패턴이 필요한 것이죠. 사용되는 선형 함수를 잘 선택하면 주기가 길고 무작위적인 실제와 매우 유사한 입력 데이터를 생성할 수 있다고 합니다. 이를 의사 난수 생성(Pseudo Random Number Generation: PRNG)이라고 합니다. 이 때 사용되는 것 중에서 한가지 방법이 1965년에 만들어진 LFSR 이.. 2022. 5. 1.
테스트 주도 개발 저자의 명성을 동경하여 책을 읽기 시작 했는데 생각 외로 가르치려는 개념이 별로 좋지 않다는 반감이 들었습니다. 저뿐만 아니라 그룹 스터디 멤버들도 같은 의견이었는데요, 다시 의외로 책을 거의 다 읽어갈 무렵 어떤걸 보여주려고 하는 것인지 어렴풋이 이해가 가더군요. 이래서 TDD는 쉽지 않은가 보다라고 생각이 들었습니다. 처음부터 보여주는 익숙하지 않은 테스트로 부터의 설계와 구현이 익숙해 지면 TDD를 잘 활용할 수 있을까요? 1부 화폐(돈) 예제 1장 다중 통화를 지원하는 Money 객체 2장 타락한 객체 3장 모두를 위한 평등 4장 프라이버시 5장 솔직히 말하자면 6장 돌아온 ‘모두를 위한 평등’ 7장 사과와 오렌지 8장 객체 만들기 9장 우리가 사는 시간(times) 10장 흥미로운 시간 11장 .. 2022. 4. 16.
컴퓨터과학이 여는 세계 세상을 바꾼 컴퓨터 소프트웨어의 원천 아이디어 그리고 미래 우연한 기회에 알게되어 구입하여 읽은 책인데 아는 내용도 있었지만 한번 읽어서 이해가 되지 않는 부분도 상당 부분 있었습니다. 이런 내용을 대학교 교양 과목으로 강의 하다니 놀라울 따름 이었어요. 유투브에 강의도 공개해 주시고 감사합니다. 역시 좋은 학교 부럽네요. https://www.youtube.com/watch?v=HTWSPoDLmHI&list=PL0Nf1KJu6Ui7yoc9RQ2TiiYL9Z0MKoggH 처음에는 NP/P 문제에 대한 내용에 끌려 책을 보게 되었는데, 보편만능의 기계 튜링 머신부터 만들려는 것을 표현해서 대상으로 바라보며 분석하는 체계적인 방법을 갖추기 위해서 이해를 하고 이해를 하면 체계가 생기고 대상이 명확해 지면 비.. 2022. 4. 16.
Effective Modern 이펙티브 모던 C++ 전문가를 위한 C++를 빨리 읽고 보기 위해 같이 구입 했는데 계속 늦어지고만 있네요 😂 생각보다 모던 C++ 중심으로 설명된 책을 잘 찾을 수 없었는데 아직 읽지는 못했지만 "전문가를 위한 C++"와 이 책이 C++98까지만 했던 사람들에게 모던 C++을 추가로 덮기에 좋은 책일 것 같았습니다. 1장 형식 연역 항목 1: 템플릿 형식 연역 규칙을 숙지하라 항목 2: auto의 형식 연역 규칙을 숙지하라 항목 3: decltype의 작동 방식을 숙지하라 항목 4: 연역된 형식을 파악하는 방법을 알아두라 2장 auto 항목 5: 명시적 형식 선언보다는 auto를 선호하라 항목 6: auto가 원치 않은 형식으로 연역될 때에는 명시적 형식의 초기치를 사용하라 3장 현대적 C++에 적응하기 항목 7: 객체 생.. 2022. 4. 16.
전문가를 위한 C++ C++17, 제네릭 람다, STL, 템플릿, 디자인 패턴, 객체지향의 원리를 익히는 확실한 방법 Modern C++ 관련 서적을 찾아 보니 막상 많이 없었는데 이 책이 좋은 것 같았습니다. 6장까지 클린 코드, 설계 관련 내용들이 좀 길게 이어지는데 실제 상세 내용을 바로 보고 싶으신 분은 Part 3에서 부터 시작하셔도 될 것 같습니다...🐱‍🏍 [Part 1 전문가를 향한 C++의 첫걸음] CHAPTER 1 C++와 표준 라이브러리 초단기 속성 코스 _1.1 C++의 기초 _1.2 C++의 고급 기능 _1.3 C++의 객체지향 언어 특성 _1.4 유니폼 초기화 _1.5 표준 라이브러리 _1.6 첫 C++ 프로그램 _1.7 정리 CHAPTER 2 스트링과 스트링 뷰 다루기 _2.1 동적 스트링 _2.2.. 2022. 4. 16.
클린 아키텍쳐 물론 아키텍쳐 이론에 대해서는 다른 의견들도 존재하지만 기본 이론에 충실히 중심을 잡고 현실화 시키면서 경험을 쌓아서 이 책의 내용을 몸으로 체화 시키는 것이 앞으로 설계를 할 때 많은 도움이 될 것이라고 생각됩니다. 책에서 소프트웨어 개발자의 전문성에 대한 충고가 제일 인상 깊었습니다. 소프트웨어 개발자는 단순히 작업 설계서에 따라 업무를 수행하는 역할이 아니고 의사나 요리사와 같은 전문 분야의 전문가 이기 때문에 외부의 압박이 들어와도 굴복해서 따라가는 것이 아니고 본인의 전문성에 기반하여 설계하고 일정을 진행해야 한다고 하셨어요. 물론 현실적으로 가능하지는 않지만 이상을 위해서 지속적으로 노력하는 어른이가 보람되겠죠...🤣 === 1부 소개 === 1장 설계와 아키텍처란? __목표는? __사례 연구.. 2022. 4. 16.
클린 코드 한 마디 한 마디 무릎을 칠 수 밖에 없는 명쾌한 가르침들 이었습니다. 어렴풋이 생각해 오던 내용도 있었고 전혀 생각지도 못했던 가르침들도 있었습니다. 지금은 명료한 이름 짓기 밖에 명확히 떠오르지 않지만 프로그래밍을 업으로 하는 개발자들은 지속적으로 되새김질 하며 읽기를 반복해야 할 책이라고 생각됩니다. 이 책을 읽고 나서야 왜 엉클 밥, 엉클 밥 하는지 알 수 있었습니다. 1장 깨끗한 코드 코드가 존재하리라 나쁜 코드 나쁜 코드로 치르는 대가 __ 원대한 재설계의 꿈 __ 태도 __ 원초적 난제 __ 깨끗한 코드라는 예술? __ 깨끗한 코드란? 우리들 생각 우리는 저자다 보이스카우트 규칙 프리퀄과 원칙 결론 참고 문헌 2장 의미 있는 이름 들어가면서 의도를 분명히 밝혀라 그릇된 정보를 피하라 의미 있.. 2022. 4. 16.
기본 알고리즘 목록 기본 풀이법 전개 # 되돌아가기 (back-tracking) 되돌아간 지점까지는 같은 행보를 한 후보 중에서 종전의 후보와 관련이 있는 후보를 선택한다. # 나눠풀어 합치기 (divide-and-conquer) 문제를 작은 크기로 쪼개고 그렇게 푼 결과들을 합쳐서 전체 문제의 답으로 만든다. # 기억하며 풀기 (dynamic programming) 문제의 일부분에 대해서 풀고 기억한다. 문제의 다른 부분을 풀 때 기억한 부분의 답을 활용한다. # 질러놓고 다듬기 (iterative improvement) 한개의 답 후보를 임의로 선택하고 다듬으면서 답에 근접해 간다. #1 스택 Memoization DP (Dynamic Programming) DFS (Depth First Search) Back Trac.. 2022. 1. 25.
코딩의 기술 작고 얇은 책의 분량이지만 필살 기술을 전수 해 주고 싶은 마음으로 다양한 방면에서 꼭 필요한 내용들을 이야기 해주려고 노력한 듯 보입니다. 저자는 일본공학원 하치오지 전문학교 전임 강사로 게임 프로그래밍과 관련한 전반적인 수업을 담당한다고 하는데 다른 저서의 책들은 찾을 수 없었습니다. Slideshare에 3개 자료가 올라와 있는데 한개는 34만 뷰가 넘었네요. (일본어로 작성되어 있어 공부해 볼 수는 없었습니다.) 전체가 3개장으로 구성되어 있으며 첫째장은 클린 코드 구현, 둘째장은 설계, 셋째장은 품질 측정에 대한 내용 입니다. 전반적인 내용은 로버트 마틴의 Clean Code와 Clean Architecture 내용이 많이 들어가 있었습니다. 인상 깊고 좋았던 내용은 1장에서 실제 STL을 활용.. 2021. 10. 4.
[My cheat-sheet] PUML 참고 : http://www.plantuml.com/plantuml/uml usecase @startuml usecase_diagram title AM3352 IG Use Cases left to right direction actor LSM #blue package Init { usecase "Init IG FPGA" as Init_UC1 } package SwUpdate { usecase "Self Update" as SwUpdate_UC1 usecase "Forward\n FPGA binary" as SwUpdate_UC2 } LSM --> SwUpdate_UC1 LSM --> SwUpdate_UC2 @enduml class @startuml skinparam classAttributeIconSiz.. 2021. 9. 29.
micro:bit 장난감 3년전 첫째 아이 과학 선생님의 참여 학습 때 감명 받아 급 구매 하게된 ICbandQ 마이크로비트 GENIUS KIT https://www.icbanq.com/P013150516 아이가 별 흥미를 느끼지 못해 방치했다가 제 장난감으로 사용해 볼까 하고 살펴 봤습니다. V1.3B로 구해 했는데 찾아보니 Nordic 사 nRF51822 네요. https://os.mbed.com/platforms/Microbit/ BBC micro:bit | Mbed BBC micro:bit The BBC micro:bit is a pocket-sized, codable computer that allows anyone to get creative with technology. Made possible through a m.. 2021. 9. 12.
[My cheat-sheet] Design Patterns 디자인 패턴의 주요 관점: 1) 동일 코드 및 유사 코드까지 통합하려고 객체 지향의 다형성을 이용하여 코드 중복을 제거 하고 2) 객체 지향의 추상화 인터페이스 레벨을 맞추어 기존 코드를 수정하지 않고 새로운 코드를 추가하여 사용하도록 구성하는 방법 VisitorSum::visit(Line(this)) -> Line에서 정보 얻어서 VisitorSum 동작 수행, VisitorSum::visit()의 구현을 바꾸면 원하는 동작을 수정 가능 [문제점] Client에 각 구현 class 의존성 있음 Strategy 여러 상황에 따라 구현이나 알고리즘을 변경하여 사용할 수 있도록 (동적 변경도 가능) 우측 그림에서 Context는 각 Strategy들을 교체하여 사용, Client에서 AlgorithmA/B에.. 2021. 7. 3.