프로그래밍(Basic)

    defer와 GC의 상관관계

    안녕하세요. 최근 질문 중에 "Go에서는 defer가 있는데 왜 GC를 사용해야 할까요?"라는 질문이 있었어요. defer와 GC는 하는 역할이 서로 다르기 때문에 '이건 무슨 내용의 질문이지?'하며 한 동안 벙쪄서 아무 말도 하지 못했죠. 그 후 그 질문에 대한 답변을 해주기 위해 공부했던 것들을 정리 해봅니다. 역시 Go에서의 defer와 가비지 컬렉터(GC)는 서로 다른 개념이였어요. 즉, 그들 간에 직접적인 관련은 없었죠. Go를 사용해보신 분들이라면 defer는 함수 내에서 특정 코드를 지연 실행시키는 데 사용되는 기능이며, 주로 리소스 정리나 오류 처리에 유용하고, 가비지 컬렉터는 메모리 관리를 자동으로 처리하여 더 이상 사용되지 않는 객체를 탐지하고 해제하여 메모리 누수를 방지해주는 도구라는..

    Go 1.20 릴리즈 요약

    1.19 이후 6개월 만의 릴리즈. 하위호환 정책으로 기존 프로그램 컴파일/실행은 문제 없음 언어에 4가지 변화 slice를 array로 변환 가능 unsafe 패키지에 SliceData, String, StringData 함수 추가 구조체의 필드값이 정의에 나타난 순서대로 하나씩 비교되도록 하고, 첫번째 미스매치에서 중단되도록 정의됨. 비슷하게 배결 값도 하나씩 인덱스 순으로 비교 Comparable 타입들이 타입 인자가 strictly comparable 하지 않은 경우에도 comparable 조건을 충족 가능 GC 데이터 구조 개선으로 메모리 오버헤드가 줄어들고 전체 CPU 성능 최대 2% 향상 그외 툴체인, 런타임, 라이브러리 구현등이 개선

    Go 1.19 릴리즈

    오늘 Go 팀은 다운로드 페이지 를 방문하여 다운로드 받을 수 있는 Go 1.19를 출시하게 된 것을 기쁘게 생각합니다 . Go 1.19는 올해 초 Go 1.18 릴리스 를 개선하였습니다. Go 1.19의 제네릭 개발은 커뮤니티에서 보고한 미묘한 문제와 코너 케이스를 해결하는 데 집중했으며 중요한 성능 향상(일부 제네릭 프로그램의 경우 최대 20%)을 제공했습니다. 문서 주석은 이제 링크, 목록 및 더 명확한 제목 구문을 지원합니다. 이 변경 사항은 특히 큰 API가 포함된 패키지에서 사용자가 더 명확하고 탐색하기 쉬운 문서 주석을 작성하는 데 도움이 됩니다. 이 변경 사항의 일부로 gofmt이 이제 문서 주석의 형식을 다시 지정하여 이러한 기능을 사용할 때 표준 형식을 적용합니다. 자세한 내용은 "Go..

    [바미] WebSocket과 Socket.io차이는 무엇일까?

    들어가기전에.. Socket.io와 WebSocket 모두 실시간 양방향 통신을 가능하게 하는 기술인데요. 지금 다니는 회사에서는 Socket.io를 주로 사용하고 있어요. 처음 Socket.io를 공부할 때 WebSocket에 대해 먼저 공부했고, 그 당시에는 Socket.io를 사용하기 위해 공부할 때는 단순히 'room'의 개념 여부로만 알고 있었어요. 하지만 그 외에도 차이가 존재하는 것을 발견하여 리마인드 할 겸 정리해보려해요. 프로토콜의 차이점 Websocket은 TCP 소켓을 사용한 HTTP와 독립적인 프로토콜로, 양방향 통신을 제공해요. 브라우저에서 WebSocket을 지원하는 경우, 서버와의 연결을 유지한 상태로 언제든지 데이터를 주고받을 수 있죠. 반면에 Socket.io는 WebSoc..

    [바미] Pattern matching algorithms - Rabin-Karp 알고리즘 구현하기

    Rabin-Karp? Rabin-Karp 알고리즘은 문자열 매칭 알고리즘 중 하나로, 주어진 문자열에서 패턴 문자열을 찾는데 사용되는데 문자열을 해시값으로 변환하여 패턴 문자열의 해시값과 일치하는 부분을 찾아내는 방법을 사용해요. 그럼 구현 해볼까요? 코드 구현 function RabinKarp(text, pattern) { const n = text.length; const m = pattern.length; const base = 26; // 사용할 기수 const prime = 101; // 사용할 소수 // 패턴 문자열과 전체 문자열의 해시값을 계산합니다. let patternHash = 0; let textHash = 0; let power = 1; for (let i = 0; i < m; i+..

    [바미] Pattern matching algorithms - Knuth-Morris-Pratt 알고리즘 구현하기.

    Knuth-Morris-Pratt? Knuth-Morris-Pratt 알고리즘은 문자열 검색 알고리즘 중 하나로, 특정 문자열에서 패턴 문자열을 찾는 알고리즘이에요. 이 알고리즘은 패턴 문자열의 길이와 검색 문자열의 길이에 비례하는 시간복잡도를 가져서 대용량의 문자열에서 효율적으로 검색할 수 있죠. 동작 방식 패턴 문자열을 전처리하여 접두사(prefix)와 접미사(suffix)의 최대길이를 구해요. 검색 문자열을 순회하며 패턴 문자열을 비교해요. 만약 일치하지 않는 문자가 있다면, 해당 문자가 포함된 접미사와 접두사를 이용하여 패턴 문자열을 이동시켜요. 이동한 패턴 문자열과 검색 문자열을 다시 비교해줘요. 일치하지 않는 문자가 없을 때까지 위 과정을 반복해요. 그럼 이제 구현해볼까요? 코드 구현 func..

    [바미] Hash tables - Open addressing알고리즘 구현하기

    Open addressing? Open addressing은 충돌이 발생하면 해시 테이블 내의 다른 빈 슬롯에 데이터를 저장하는 기법인데요. Open Addressing 방식에서는 해시 충돌이 발생했을 때, 선형 탐사, 제곱 탐사, 이중 해싱 방법으로 충돌을 해결하는데요. 이것들에 대해 알아보자면 Linear Probing (선형 탐사) 해시 충돌이 발생하면, 다음 인덱스를 탐사하며 빈 공간을 찾아요. 탐사하는 인덱스는 hash(key) + i (i는 0, 1, 2, ...)와 같이 계산하죠. Quadratic Probing (제곱 탐사) 선형 탐사의 단점을 보완하기 위해, 제곱 값을 이용해 탐사하는 방법인데 탐사하는 인덱스는 hash(key) + i^2 (i는 0, 1, 2, ...)와 같이 계산해요...

    [바미] Hash tables - chaining 알고리즘 구현하기.

    chaining? 해시 테이블에서 충돌이 일어나면 chaining 알고리즘을 사용하여 충돌을 해결할 수 있는데, 이 알고리즘은 연결 리스트 를 사용하여 충돌된 데이터를 저장합니다. Chaining을 구현하기 위해서는 먼저 해시 테이블과 연결 리스트가 필요합니다. 해시 테이블은 키-값 쌍을 저장하는 자료구조로, 키를 해시 함수에 입력하여 버킷 인덱스를 계산하고, 해당 버킷에 값을 저장합니다. 연결 리스트는 각 버킷에 저장되는 데이터를 연결하여 저장하는 자료구조입니다. 코드 구현 해시 함수 구현 해시 함수는 키 값을 버킷 인덱스로 변환하는 함수입니다. 이번 예제에서는 간단한 해시 함수를 구현하여 사용해보겠습니다. function hashFunction(key, size) { let hash = 0; for ..

    [바미] Tree algorithms - Trie trees 구현하기.

    Trie tree? Trie tree는 문자열 검색을 효율적으로 수행하기 위한 트리 자료구조입니다. 이진 트리와는 달리 한 노드당 여러 개의 자식 노드를 가지며, 각 자식 노드는 해당 위치에 올 수 있는 문자를 나타내는 것이 특징이죠. 코드 구현 class TrieNode { constructor() { this.children = {}; this.isEndOfWord = false; } } class Trie { constructor() { this.root = new TrieNode(); } insert(word) { let current = this.root; for (let i = 0; i < word.length; i++) { let ch = word.charAt(i); let node = cu..