일단 씻고 나가자
23.04.20 본문
2023. 04. 20 목요일
- [DB] WHERE, GROUP BY, HAVING, ORDER BY의 설명?
: WHERE은 각 ROW 별로 조건을 주는 것.
GROUP BY는 같은 값을 가진 행끼리 묶는 것.
HAVING은 GROUP BY 된 GROUP 들에게 부여하는 조건.
ORDER BY는 정렬 기준.
https://velog.io/@dntjd7701/SQL-GROUP-BY
- [DB] 특정 값을 대소문자 구분 없이 검색하는(바꾸는) 두 가지 함수?
: SELECT UPPER/LOWER(컬럼 명)
- [Spring] fail fast란?
: 코드를 짜다 보면 예외 케이스에 대한 분기를 메서드 내부에 적어야 하는데, 이때 성공 케이스에 대한 처리를 앞부분에 하지 않고 가장 뒤로 미루고 실패 케이스들에 대한 분기를 성공 케이스 앞 부분에 적는 것.
- 프로세스의 구조는? SP? 코드의 진행 과정을 예시로 표현?
: code – 코드 / data – 변수, 초기화된 데이터 / stack – 임시 데이터 (함수 호출, 로컬 변수, 매개 변수) / heap – 코드에서 동적으로 만들어지는 데이터 (객체)
SP – Stack Pointer. 스택의 최상단 포인터. (스택의 가장 위에 있는 데이터의 한 칸 위 주소) 최상단 위치를 알면 현재 어디까지 호출이 되어 있는지 알 수 있음. 레지스터로 구성.
1. 코드를 PC와 SP가 읽어가며, 함수나 지역 변수는 딱히 처리 없이 PC만 늘린다.
2. 전역 변수가 data에 담긴다.
3. 함수가 호출되면 stack에 호출한 함수의 위치(RET == return address)가 담기고, 그 위에 전역 변수가 차례로 담긴다.
4. return을 만나면 스택을 POP하며, 3번에서 수행한 RET까지 스택을 비운다.
5. RET에 쓰여 있는 주소를 PC에 담고, 그 주소부터 코드를 다시 실행한다.
6. 객체는 언제, 얼마나 생성될지 알 수 없으므로 Heap에 담긴다.
- 컨텍스트 스위칭이란? PCB는 무엇이며 무엇이 저장되는지?
: 시분할 시스템에서 다음 프로세스에게 자원을 넘겨줄 때 현재 진행 상황을 저장하고 넘겨주어야 다음에 다시 자원을 잡았을 때 그 위치부터 실행할 수 있다. PC와 SP만 저장하여 바꿔주면 된다. 이런 정보들은 프로세스마다 PCB (Process Control Block) 내부에 저장된다. 이렇게 이전에 저장된 정보를 불러와 CPU의 레지스터에 넣고 다른 프로세스를 실행하는 것.
PID – 프로세스별 유니크한 ID값
register – PC, SP
- O(n log n)의 네 가지 정렬 방법과 설명?
1. 합병 정렬 O(n log n)
배열을 반씩 나눠 길이가 1이 되도록 만들고, 다시 병합할 때 인접한 부분끼리 정렬.
속도는 빠르나, 병합할 때 데이터들을 저장할 공간이 n개만큼 더 필요하다.
2. 힙 정렬 O(n log n)
힙 형태로 배열을 정렬. 단 힙의 자료구조에 배열을 넣으면 그만큼 공간이 더 필요하므로 주어진 배열 내에서 정렬.
3. 퀵 정렬 O(n^2)
임의의 기준값(pivot)을 기준으로 좌우로 분할하며 정렬하는 방식.
평균 시간이 빠르지만, pivot이 최대 혹은 최솟값일 경우 O(n^2)
pivot을 구하는 방법은 배열의 맨 앞, 맨 뒤, 가운데 값 선택 등 여러 가지가 있지만
worst case인 O(n^2)를 피하고자 임의의 세 값 중 중간값을 선택하는 방법도 있다.
1) pivot 기준 큰 값을 왼쪽에서부터 증가하며 찾고, 작은 값을 오른쪽에서부터 찾는다.
-> 두 값의 자리를 교체한다.
2) 두 인덱스가 같아지면 그 자리의 값과 pivot을 교체해주고, 그 자리는 고정한다.
3) 고정된 자리를 기준으로 왼쪽, 오른쪽 나누어 같은 과정을 진행한다.
4. 트리 정렬 O(n log n)
이진 탐색 트리(BST)를 만들어 정렬하는 방식.
- [Effective Java] finalizer란?
: 객체 생성 시 @Override 받을 수 있는 public void finalize() 함수.
java 9 버전부턴 deprecated 되었으며, 내용은 객체의 레퍼런스가 끊어졌을 때
GC가 발동하여 해당 메모리를 지울 때 함께 실행되는 내용.
혹시 사용자가 사용 후 레퍼런스를 끊지 않았을 때를 대비한 거름망 같은 역할이며,
실제 FileIn/OutputStream 등의 클래스 내부에서
public void finalize() throws Throwable { if(!this.closed) close(); } 같은 형태로
구현이 되어 있다고 한다.