본문 바로가기

CS19

MySQL 인덱스 👉 쿼리의 성능을 좌우하는 것은, **어떻게 디스크 I/O 를 줄이는 것이 핵심**1. 디스크 읽기 방식1-1. HDD(기계식) && SSD(전자식)HDD: 데이터 저장용 플래터(원판)SSD: 플래시 메모리데이터를 가져오는 방법:기계식에서는 원판을 돌려서 데이터 위치를 찾고 가져옵니다. 그러나 SSD는 전자식이라 이런 과정이 없습니다. 디스크의 성능은 디스크 헤더의 위치 이동횟수인데, SSD는 원판이 없으므로 HDD보다 빠른 것입니다.1-2. 순차적 I/O && 랜덤 I/O순차적 I/O:연속된 데이터를 접근하기 때문에 헤더가 일정한 방향으로 이동랜덤 I/O:랜덤 I/O는 데이터가 디스크 여러 곳에 흩어져 있어 헤더가 불규칙하게 더 많이 이동1-3. HDD의 I/O 방식순차 I/O연속된 섹터를 읽거나 씀.. 2024. 11. 26.
LiskedList vs ArrayDeque vs 배열 // 원형 배열의 경우realIndex = (head + index) % array.length;element = array[realIndex];// 일반 배열의 경우element = array[index];Queue의 구조는 한쪽에서는 삽입만 일어나고 한쪽에서는 삭제만 하는 자료구조 입니다. 즉, 먼저 들어간 것이 먼저 나오는 FIFO 구조입니다. 앞과 뒤 전부에서 삽입 삭제가 가능한 Deque도 있습니다. Queue와 Deque의 인터페이스를 구현하는 대표적인 두 가지 클래스는 LinkedList와 ArrayDeque가 있습니다. LinkedList 앞, 뒤 노드를 참조하고 있어 배열, ArrayDeque보다 상대적으로 오버헤드가 있음요소들이 연속적으로 메모리 할당이 되어있지 않음 ArrayDeque.. 2024. 8. 1.
HashMap 동작원리 HashMap은 Key와 Value가 짝 지어진 자료구조입니다. HashMap 동작원리HashMap은 key의 HashCode을 이용해서 시간복잡도 O(1)으로 value를 찾아낸다. HashCode를 인덱스로 삼는 배열 자료구조이다. 실제 계산은 HashCod % size 이다.나머지 연산을 하는 이유는 배열의 인덱스 중 하나로 매핑시키기 위함이다.특정 값에 대한 해시값  만약 3288449라는 값을 배열의 인덱스로 사용한다면 최소 3288449 크기의 배열을 생성해야한다. 메모리를 많이 차지할것이다. 때문에 이 값을 배열의 Size로 나눈 나머지를 구하고 이를 Index로 사용하는 것이다. 만약 HashMap 내부 배열 Size가 10이라면 3288449 % 10 = 9. 즉 9라는 인덱스를 갖게 된.. 2024. 5. 23.
웹 브라우저 통신 방법(Polling, Long Polling, SSE, Socket) Polling일정 주기를 가지고 서버의 API를 호출하는 방법이다. 예를 들어, 클라이언트에서 5초마다 한 번씩 알림 목록을 호출한다면, 업데이트 내역이 5초마다 갱신되며 변경사항을 적용할 수 있다. 이 방식은 기본적인 HTTP통신을 기반으로 하기 때문에 호환성이 좋다는 장점이 있다.당연하지만 업데이트 주기가 길다면 실시간으로 데이터가 갱신되지 않는다.업데이트 주기가 짧다면 갱신 사항이 없음에도 서버에 요청이 들어와 불 필요한 서버 부하가 생긴다. Long-Polling롱 폴링은 일반 폴링보다 더 나은 방식이다.Polling과 비슷하나, Client의 요청에 대해서 서버가 일정시간 동안 기다렸다가 서버 이벤트가 생기면 서버가 응답하고 Client가 곧바로 request를 보내는 방식이다.서버가 요청을 받.. 2024. 5. 21.
Iterator에 대하여 Iterator 자바의 컬렉션에 존재하는 값들을 읽어오기 위한 방법으로 'iterator'라는 클래스가 존재한다. 이 iterator는 해당 컬렉션의 주소값을 기반으로 하나씩 값을 조회하는 클래스이다. 따라서, 대표적으로 다음과 같은 두 개의 함수가 존재한다. hasNext() : 다음 값을 갖고 있는지 true/false 반환 next() : 다음 값으로 이동 및 반환 자바에서는 각각의 컬렉션별로 Iterator를 반환하는 함수를 갖고 있고, 이 함수는 컬렉션의 첫 번째 주소 값을 반환하는 형식으로 되어있습니다. Iterator를 이용해 컬렉션을 추출하는 방법은 '첫 번째 주소를 담은 Iterator 생성 -> 반복문을 통해 하나씩 이동하며 저장된 값 반환' 입니다. 이를 코드로 나타내면 다음과 같습니.. 2024. 4. 16.
Set에 대하여 Set은 중복을 없애기 위해 사용한다. Set의 구현체로는 HashSet, LikedHashSet, TreeSet이 있다. HashSet: 순서x, 중복x LikedHashSet: 순서o, 중복x TreeSet: 오름차순, 중복x HashSet intHashSet = new HashSet(); LinkedHashSet intLinkedHashSet = new LinkedHashSet(); TreeSet intTreeSet = new TreeSet(); for (int i : new int[] { 3, 1, 8, 5, 4, 7, 2, 9, 6}) { intHashSet.add(i); intLinkedHashSet.add(i); intTreeSet.add(i); } Set strHashSet = new Ha.. 2024. 4. 16.
List <-> 배열 변환하는 법 배열을 List로 1. Arrays.asList() String[] arr = { "A", "B", "C" }; List list = Arrays.asList(arr); 배열의 요소를 수정하든 List의 요소를 수정하든 서로의 영향을 받는다 ex) 배열에서 "A"를 "D"로 바꾸면 List에서도 "A"가 "D"로 바뀜 얕은 복사(Shallow Copy)로 생각하시면 됩니다. 2. new ArrayList( Arrays.asList()) String[] arr = { "A", "B", "C" }; List list = new ArrayList(Arrays.asList(arr)) 그래서 new 생성자로 새로운 List를 만든 후 거기에 복사해줍니다. 깊은 복사(Deep Copy)로 생각하시면 됩니다. 그런데.. 2024. 3. 29.
HashMap 사용법 HashMap은 Key와 Value의 묶음모음으로 이루어져 있는 자료구조입니다. HashMap 생성법 HashMap h1 = new HashMap( ); // 기본 capacity:16, load factor:0.75 HashMap h2 = new HashMap(20); // capacity:20으로 설정 HashMap h3 = new HashMap(20, 0.8); // capacity:20, load factor:0.8로 설정 HashMap h4 = new HashMap(h1); // 다른 Map(h1)의 데이터로 초기화 c capacity는 데이터 저장 용량, load factor는 데이터 저장공간을 추가로 확보해야 하는 시점을 지정합니다. load factor 0.8 은 저장공간이 80% 채워져 .. 2024. 3. 28.
프로그래머스 sql 문제 풀이하면서 배운 점(2) 문제1 https://school.programmers.co.kr/learn/courses/30/lessons/157339 CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 .. 2024. 2. 9.