본문 바로가기

전체 글35

클린코드 - 6장 🔖 6장 : 객체와 자료 구조읽은 날짜 : 2024.09.04지은이 : 로버트 C. 마틴출판사 : 인사이트 기억하고 싶은 내용자료 추상화변수를 private으로 선언하더라도 각 값마다 getter, setter를 제공한다면 구현을 외부로 노출하는 것이다.클래스는 추상 인터페이스를 제공해서 사용자가 구현을 모른 채 자료의 핵심을 조작할 수 있어야 한다. 자료 구조 vs 객체1. 자료 구조자료를 공개하고 아무 메서드도 제공하지 않는다.public class Square { public Point topLeft; public double side;}public class Rectangle { public Point topLeft; public double height; public doub.. 2024. 9. 4.
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 6장 🔖 6장 : 키-값 저장소 설계읽은 날짜 : 2024.09.04지은이 : 알렉스 쉬출판사 : 인사이트 기억하고 싶은 내용키-값 저장소비 관계형 데이터베이스고유 식별자를 키로 가져야 하고, 값은 키를 통해서만 접근할 수 있다.키는 짧을수록 좋고, 값은 무엇이든 된다.e.g. AWS DynamoDB, Redis, Cassandra, BigTable 단일 서버 키-값 저장소가장 직관적인 방법은 키-값 전부를 메모리에 해시 테이블로 저장하는 것.메모리의 한계를 해결하기 위해 아래와 같은 방법이 있지만, 서버 한 대로 부족할 때가 도래한다.데이터 압축자주 쓰이는 데이터만 메모리에 두고 나머지는 디스크에 저장 분산 키-값 저장소키-값 쌍을 여러 서버에 분산시킨다.분산 시스템을 설계할 때 CAP 정리를 이해해야 한.. 2024. 9. 4.
Boyer-Moore 과반수 투표 알고리즘 Boyer-Moore 과반수 투표 알고리즘(Boyer-Moore majority vote algorithm)주어진 후보자 목록에서 과반수를 차지하는 후보를 찾는 알고리즘입니다.배열 내 과반수에 해당하는 원소가 항상 존재한다고 가정하면, 결과값은 항상 과반수 원소가 됩니다.핵심 아이디어는 주어진 후보자 목록에서 두 가지의 서로 다른 후보를 지정하고, 이들을 서로 상쇄시켜 가며 최종 후보를 결정하는 것입니다.시간 복잡도는 O(N), 공간 복잡도는 O(1) 입니다. 동작 방식 입력 시퀀스 요소 m과 카운터 c를 0으로 초기화한다.입력 시퀀스에서 각각의 요소 x에 대해서c == 0이면 m = x, c = 1 대입한다.m == x이면 c = c + 1 대입한다.m != x이면 c = c - 1 대입한다.m을 반환.. 2024. 8. 29.
클린코드 - 5장 🔖 5장 : 형식 맞추기읽은 날짜 : 2024.08.29지은이 : 로버트 C. 마틴출판사 : 인사이트  기억하고 싶은 내용왜 형식을 맞춰야 하는가?코드 형식은 의사소통의 일환이다.코드는 바뀔지라도 처음 잡아놓은 구현 스타일과 가독성 수준은 사라지지 않는다.앞으로 바뀔 코드의 품질에 지대한 영향을 미친다. 소통을 원활하게 하는 코드 형식 1 : 세로 형식 맞추기1. 적절한 세로 길이일반적으로 큰 파일보다는 작은 파일이 이해하기 쉽다.엄격하게 지킬 필요는 없지만 200줄 정도가 적당하다.2. 빈 행으로 분리하기빈 행은 새로운 개념을 시작한다는 시각적 단서이다.일련의 행 묶음은 완결된 생각 하나를 표현한다. 생각 사이에는 빈 행을 넣어 분리한다.패키지 선언부, import 문, 각 함수 사이에 빈 행을 넣어.. 2024. 8. 29.
parseInt( ) vs Number( ) Javascript에서 parseInt( )와 Number( )의 차이를 정리해보았습니다. parseInt( ) 문자열을 파싱해서 특정 진수의 정수를 반환합니다. 첫 번째 매개변수는 string, 두 번째 매개변수는 radix 입니다.문자열에서 첫 번째 숫자 부분을 정수로 변환하고, 소수점과 숫자 이후의 문자열은 무시합니다.radix가 2~36 범위의 값이 아니거나, 공백이 아닌 첫 문자를 정수로 변환할 수 없는 경우 NaN을 반환합니다.parseInt("123"); // 123 (문자열을 정수로 변환)parseInt("123.45"); // 123 (소수점 이하 숫자는 무시)parseInt("123abc"); // 123 (숫자 이후의 문자는 무시)parseInt(" .. 2024. 8. 27.
알고리즘 복잡도 알고리즘 복잡도에 대해서 정리해보았습니다.알고리즘의 복잡도는 시간 복잡도와 공간 복잡도로 나뉩니다. 시간 복잡도 & 공간 복잡도최근에는 하드웨어 메모리 용량이 커졌기 때문에, 알고리즘의 성능 측정에서는 시간 복잡도가 좀 더 우선시 됩니다. 시간 복잡도시간 단위가 아닌, 알고리즘에 필요한 단계 수만을 고려합니다.데이터가 증가할수록 단계 수가 어떻게 변하는지를 말해줍니다. 공간 복잡도프로그램을 실행시켰을 때 필요로 하는 자원 공간의 양입니다.정적으로 선언된 변수, 재귀 함수와 같이 동적으로 공간을 계속해서 필요로 하는 경우도 포함합니다. 빅 오 표기법빅 오 표기법은 자료 구조와 알고리즘의 효율성을 간결하고 일관된 언어로 설명하기 위해 등장했습니다.절대적인 실행 시간과 필요한 자원 공간의 양을 파악하는 것은 .. 2024. 8. 27.
클린코드 - 4장 🔖 4장 : 주석읽은 날짜 : 2024.08.27지은이 : 로버트 C. 마틴출판사 : 인사이트 기억하고 싶은 내용주석은 나쁜 코드를 보완하지 못한다코드만으로 의도를 표현하는 것을 우선으로 해야 한다.주석이 거의 없는 코드가 복잡한 주석이 많이 달린 코드보다 좋다. 좋은 주석이란?법적인 주석 저작권, 소유권 정보, 표준 라이선스, 외부 문서 등정보를 제공하는 주석표현력 있게 코드를 작성하면 필요 없어질 수 있다.✅ 구현 의도를 설명하는 주석 인수나 반환값의 의미를 명료하게 밝히는 주석✅ 결과를 경고하는 주석 ~하지 마세요, ~해야 합니다 등✅ TODO 주석 앞으로 할 일, 필요하지만 당장 구현하기 어려운 업무 등✅ 그냥 넘어갈 수 있는 부분의 중요성을 강조하는 주석 공개 API의 Javadocs 나쁜 주.. 2024. 8. 27.
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 5장 🔖 5장 : 안정 해시 설계읽은 날짜 : 2024.08.26지은이 : 알렉스 쉬출판사 : 인사이트 기억하고 싶은 내용해시 키 재배치(rehash) 문제N개의 캐시 서버가 있을 때 서버들에 부하를 균등하게 나누는 일반적인 방법은serverIndex = hash(key) % N특정 키가 보관된 서버의 인덱스를 계산하는 방법이 방법은 서버 풀의 크기가 고정되어 있을 때와 데이터 분포가 균등할 때는 잘 동작한다.그러나 서버가 추가되거나 기존 서버가 삭제되는 경우(즉, N 값이 바뀜), 서버 인덱스 값이 바뀌면서 대규모 캐시 미스(cache miss)가 발생한다. 안정 해시(consistent hash)해시 테이블 크기가 조정될 때 거의 대부분의 키를 재배치하는 전통적인 방식과 달리, 안정 해시는 평균적으로 k.. 2024. 8. 26.
클린코드 - 3장 🔖 3장 : 함수읽은 날짜 : 2024.08.26지은이 : 로버트 C. 마틴출판사 : 인사이트 기억하고 싶은 내용의도를 분명히 표현하는 함수를 만드는 방법1. 작게 만들어라길이가 짧을수록 좋다. 2. 한 가지 일만 해라의미 있는 이름으로 다른 함수를 추출할 수 있다면 그 함수는 여러 작업을 하는 셈이다. 3. 하나의 함수 내의 추상화 수준을 동일하게 만들어라코드는 위에서 아래로 이야기처럼 읽혀야 한다.위에서 아래로 읽을 때 추상화 수준이 한 번에 한 단계씩 낮아지면 읽기 쉬워진다. 4. Switch 문을 추상 팩토리에 숨겨라각 case 조건에 대한 구현을 캡슐화하고, 이를 추상 팩토리를 사용하여 동적으로 선택할 수 있도록 한다. 5. 서술적인 이름을 사용해라길고 서술적인 이름이 짧고 어려운 이름보다 .. 2024. 8. 26.
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 4장 🔖 4장 : 처리율 제한 장치의 설계읽은 날짜 : 2024.08.20지은이 : 알렉스 쉬출판사 : 인사이트 기억하고 싶은 내용처리율 제한 장치를 두면 좋은 점DoS(Denial of Service) 공격에 의한 자원 고갈 방지서버 개수나 서드 파티 API 사용료에 대한 비용 절감봇(bot)에서 오는 트래픽이나 사용자의 잘못된 이용 패턴으로 유발된 트래픽으로 인한 서버 과부하 방지 1단계 : 문제 이해 및 설계 범위 확정클라이언트 측 제한 장치인가, 서버 측 제한 장치인가?서버 측이라면 API 호출을 제어하는 기준은? - IP 주소, 사용자 ID 등시스템의 규모는?시스템이 분산 환경에서 동작해야 하는가?처리율 제한 장치는 독립적인 서비스인가, 애플리케이션 코드에 포함될 수 있는가?사용자의 요청이 처리율 .. 2024. 8. 20.
클린코드 - 2장 🔖 2장 : 의미 있는 이름읽은 날짜 : 2024.08.19지은이 : 로버트 C. 마틴출판사 : 인사이트 기억하고 싶은 내용이름을 잘 짓는 방법1. 의도를 분명하게 밝히기변수, 함수, 클래스 이름으로 존재 이유, 수행 기능, 사용 방법을 드러낼 수 있어야 한다.따로 주석이 필요하다면 의도가 분명하게 드러나지 않은 것이다.코드 맥락이 코드 자체에 명시적으로 드러나야 한다.// Badint d; // 경과 시간(단위: 날짜)// Goodint daysSinceCreation;int daysSinceMotdification; 2. 코드 의미를 흐리는 잘못된 정보를 남기지 않기널리 쓰이는 의미 있는 단어를 다른 의미로 사용하면 안 된다.컨테이너 유형을 이름에 넣지 않는 것이 좋다.accountList ➡️ .. 2024. 8. 19.
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 2~3장 🔖 2~3장 : 개략적인 규모 추정 ~ 시스템 설계 면접 공략법읽은 날짜 : 2024.08.19지은이 : 알렉스 쉬출판사 : 인사이트 기억하고 싶은 내용개략적인 규모 추정(back-of-the-envelope estimatation)보편적으로 통용되는 성능 수치상에서 사고 실험을 행하여 추정치를 계산하는 행위어떤 설계가 요구사항에 부합할 것인지 보기 위한 것2의 제곱수, 응답지연 값, 가용성과 관련된 수치를 이해해야 한다. 2의 제곱수최소 단위는 1바이트(=8비트). ASCII 문자 하나가 1바이트.1 byte(바이트) - 1KB(킬로바이트) - 1MB(메가바이트) - 1GB(기가바이트) - 1TB(테라바이트) - 1PB(페타바이트)단위가 바뀔 때마다 2의 10제곱씩 곱해진다. 응답지연 값메모리는 빠르.. 2024. 8. 19.