반응형 Study64 [자료구조] 해쉬 테이블(Hash table) 자료구조 HashTable Key 값에 해싱된 Value를 저장하는 데이터 구조. Hash Hash는 일방향 함수이다. 어떤 동일한 값을 함수에 매개변수로 넘긴다면 정해진 하나의 해쉬 값을 도출한다. 하지만 그 역은 구할 수 없다. Hash 충돌 만약 해쉬 값을 Boolean 자료형으로 한다면 해쉬 값은 50%의 확률로 겹칠 것이다. 이러한 상황을 해쉬 충돌이라 한다. 완전한 해시 함수 어떤 hash 함수가 충돌없이 1:1대응을 할 수 있다면 이를 완전한 해시 함수라 한다. 충돌 극복 방법 1.Open Address 이 방법은 만일 해쉬 충돌이 생긴다면 그 다음 주소에 해당 값을 저장하는 방식으로 사용된다. 하지만 remove 기능을 효율적으로 구현하기 어려운 문제가 생긴다. 2.Separate Chai.. 2022. 7. 28. [Server] DDD(Domain-Driven Design) 도메인 주도 설계 정의 유사한 업무들을 묶어 중심에 놓고 설계하는 방식 프로젝트 단위의 바운디드 컨텍스트가 생긴다. 장점 명시적인 강제 언어 경계가 생긴다. 컨텍스트 별 독립적인 발전이 가능해진다. 인터페이스에 기반한 컨텍스트 간 통신이 이뤄진다. 언어가 중요한 요소! 언어의 경계를 얼마나 잘 나누느냐가 DDD의 성패 결정 Conway's Law 우리가 만드는 시스템은 조직의 모양에 따라간다. 비지니스 도메인 별 팀을 꾸리게 된다면 자연스럽게 그에 맞는 바운디드 컨텍스트를 가진 프로세스가 제작될 가능성이 높다. 분산화된 데이터 관리 통일화된 DB를 가진다면 join의 유혹에 빠지기 쉽다. 서비스별 물리적 논리적 DB를 가지게 된다면 경계를 치기가 더욱 유리하다. 진화하는 설계 각각의 프로세스가 개별로써 진화하고 발.. 2022. 7. 15. [CS] 객체 지향 객체 지향 객체 지향의 발생 객체를 지향하는 대표적인 언어인 C++, JAVA, C# 등이 발생하기 전엔 C와 같은 절차지향적 언어가 주로 사용됐다. 이러한 언어는 제공하고자 하는 서비스의 목표를 이뤄가기 위해 구문이라는 연산을 흐름에 맞게 제작하여 이어 붙인 코드를 제작한다. 제공하고자 하는 서비스의 크기가 점점 커지고 복잡해 지면서 코드상에서도 확인할 수 있는 반복되는 구문을 쉽게 발견할 수 있었고 절차 지향 언어에서는 이러한 반복을 막고 관리하기 위해 우리가 아는 함수라는 개념을 만들어 사용하였다. 여기서 함수라는 연산을 진행하기 위해서는 연산의 주체인 CPU와 연산에 사용되는 자료구조를 관리하는 Memory의 관리가 필요한데 이를 한 묶음으로 엮어 모듈화 하여 한 파일로 만들어 관리하기 시작했다... 2022. 7. 2. [Go] 고루틴(GoRoutine) 심화(7) - 파이프라인 유래 파이프라인은 한 곳에서 다른 곳으로 액체를 옮기기 위해 사용한 파이프들의 집합을 말한다. 컴퓨터에서 말하는 파이프라인 역시 이와 마찬가지로 어떤 위치에서 다른 위치로 데이터를 처리 후 운반하기에 이와 같은 용어를 사용하는 것으로 보인다. 파이프라인이란? 시스템에서 추상화를 구성하는 데 사용할 수 있는 도구이다. 특히 Stream이나 Batch 작업들을 처리해야 할 때에는 특히 탁월한 효과를 낸다. 각 단계의 관심사를 분리할 수 있다. 그로써 다양한 이점을 얻을 수 있다. 1. 상호 독립적으로 단계를 수정할 수 있다. 2. 단계들의 결합 방식을 짜맞출 수 있다. 3. 일부분을 팬 아웃하거나 속도를 제한할 수 있다. 파이프라인의 특성 1. 각 단계는 동일한 타입을 소비하고 리턴한다. 2. 각 단계에서 .. 2022. 6. 24. [Go] 고루틴(GoRoutine) 심화(6) - 고루틴 에러 처리 아무리 잘 짜여진 코드에서도 에러는 발생하기 마련이다. 그 원인이 내부적인 문제가 아니라 외부 환경에 의한 문제일 수 도 있고 아직 내가 겪어보지 못한 다양한 이유가 존재할 수 있다. 그렇기에 안정적인 서비스를 위해선 효율적인 에러 처리가 필수적이다. 그리고 Go라는 언어는 다른 언어에서 채용하는 에러 처리방법인 예외 모델을 사용하지 않고 더욱 직접적으로 에러를 다루는 형식을 채용한다. 그렇기에 다른 프로그래밍 언어에 비해 귀찮지만 조금 더 효율적이고 직관적인 에러 처리를 할 수 있다. 그렇다면 동시성 프로그래밍을 적용한 작업에선 어떤식으로 처리하는 것이 좋을까? 에러 처리에서 중요한 것 에러 처리를 함에 있어서 가장 중요한 것은 에러를 처리하는 주체이다. 동시에 프로세스가 병렬적으로 진행되는 동시성 프.. 2022. 6. 20. [Algorithm] Programmers_42579_베스트앨범 - Go 문제 링크 Programmers_42579_베스트앨범 생각 1. 장르의 우선순위를 먼저 생각 2. 장르별로 노래의 우선순위를 생각 기본적으로 sort만을 사용해서도 풀이가 가능하지만 우선순위 큐를 체득하고 싶어서 우선순위 큐도 사용 코드 import ( "container/heap" "fmt" "sort" ) type genre struct { name string playAmount int } type song struct { index int playCount int } type pq []song func (p pq) Len() int { return len(p) } func (p pq) Less(i, j int) bool { if p[i].playCount == p[j].playCount { ret.. 2022. 6. 13. 이전 1 2 3 4 5 6 ··· 11 다음 반응형