일단 씻고 나가자
23.03.31 본문
2023. 03. 31 금요일
- [DB] 특정 행을 기준으로 N번째까지 뽑는 방법? 주의점?
: mySQL에서는 limit를 쓴다.
Oracle에서는 ROWNUM과 inner Class를 쓴다.
이때 rownum은 =2, =3은 정상 작동되지 않는다. 작동방식이 해당 조건 연산에 부합하지 않으면 버리고 새로운 행을 검사하기 때문인데, rownum=2일 경우 가장 먼저 1번 row를 만나고 이는 !=2 이기 때문에 버린다. 그럼 다음에 오는 행도 1번 행이 되어 조건 연산자에 들어올 텐데, 역시 맞지 않으므로 이를 반복하다가 논리적인 결과가 나오지 못한다.
https://jhnyang.tistory.com/454
- [DB] Every derived table must have its own alias 오류란?
: inner class에 이름을 붙여주지 않았을 때 발생한다. 소괄호 끝에 해당 inner class의 이름을 명시해야 하며, 이는 mySQL에서만 발생한다. (Oracle은 필요 없음.)
- [DB] 오라클의 AS와 NVL?
: AS는 SELECT에서 DB의 칼럼명을 원하는 컬럼명으로 바꿀 때 사용한다. (Alis)
NVL은 해당 칼럼이 NULL일 경우 두 번째 매개변수를 실행한다.
NVL2는 해당 칼럼이 NULL일 경우 두 번째, 아닐 경우 첫 번째 매개변수를 실행한다.
NVL(애트리뷰트 명, 0) // NVL2(애트리뷰트 명, 1, 0)
https://gent.tistory.com/189
- [DB] 오라클의 LIKE?
: 문자열을 검색하는 방법. 정규식이라 보면 될 듯하다. WHERE에 적으며 LIKE 후 문자열과 와일드카드를 사용한다.
(WHERE 애트리뷰트 명 LIKE ‘S%’ // 와일드카드는 %를 사용하며, S이후 문자열을 무시한다.)
- 하샤드 수란?
: 양의 어떤 정수가 각 자리수의 합으로 나누어 떨어지면 하샤드 수라 한다.
예를 들어 18 => 1+8 = 9. 18은 9로 나누어 떨어지므로 하샤드 수이다.
- [Git] branch를 지우는 키워드?
git branch –d 브랜치 이름
그럼 merge를 하지 않았는데 정말 지울 거니? 하고 물어보고 에러를 띄운다.
git branch –D 브랜치 이름
을 입력하면 강제로 지운다.
- [Git] 서로 다른 branch에서 같은 파일의 같은 부분을 수정하고 merge 하면 일어나는 일?
=====를 구분하여
<<< HEAD 부분이 현재 branch에서 수정한 부분,
>>> exp 부분이 해당 브랜치 명에서 수정한 부분이다.
사용자는 해당 사항을 수정하지 않으면 modified에 commit을 할 수 없다.
- [Java] 어노테이션이란?
: Java 5부터 추가된 기능이며, at이라 읽는다. 소스 코드에 메타 코트를 부여한다고 하며, 클래스가 해당 의미에 따라 다르게 실행된다.
사용자가 직접 정의할 수도 있으며, custom annotation이라고 한다.
- [Java] 커스텀 어노테이션 생성 방법? 관련 클래스?
: new에 들어가면 어노테이션을 만들 수 있는 란이 있다.
만들게 되면 public @interface 클래스명{} 으로 나오며, JVM이 실행 시에 감지할 수 있도록 java.lang.annotaion.Retention & RetentionPolicy를 import하고
클래스 위에 @Retention(RetentionPolicy.RUNTIME)을 새겨준다.
관련 어노테이션이 잘 적용되어 있는지 확인할 수 있는 방법도 있다.
java.lang.reflect.Method 클래스에는 특정 객체의 함수에 대한 정보를 받을 수 있는 내용이 있다. Method m = 원하는 클래스.getClass().getDeclareMethod(“함수 이름”);은
모든 Object가 상속받는 getClass 함수는 해당 클래스가 생성될 때 해당 클래스의 정보를 전달해주는 역할이며, 함수에서 getDeclareMethod를 호출하면 매개변수로 받는 이름의 함수 이름을 찾아 정보를 전달한다. Method 클래스는 try-catch로 감싸주어야 한다.
m.isAnnotationPresent(어노테이션 이름.class) 은 전달받은 함수가 매개변수로 받은 어노테이션 클래스가 잘 적용되어 있다면 true를 반환한다.
- 플립플롭이란?
: 메모리 역시 논리 회로로 이루어져 있고, 그를 플립플롭이라 함.
기본적으로 NOR 게이트를 두 개 연결한 꼴인데, NOR 게이트는 (0,0) 에서만 1을 출력함.
해당 그림처럼 위의 스위치를 켰다가 꺼도 불은 계속 들어와 있다.
이것은 현재의 출력과 상관없이 과거에 한 번이라도 눌렀다는 의미이며, 이것을 저장의 의미로 표현할 수 있다.
그 이후에 아래 스위치를 눌렀다 떼면 같은 이유로 불이 꺼지며, 삭제의 의미이다.
종류로는 R-S(Reset-Set) flip-flop, // 단순 NOR 게이트 2개.
// Set-Reset이 동시에 안 되도록 설계.
Level-triggered flip-fliop (hold that bit) // 클럭 때 HTB에 전류를 주어 그때만 운영 ( 클럭을 지원한다는 의미 )
D-type flip-flop // Set-Reset을 하나로 묶음.
// NOT 게이트로 막음.
그래서 총 합인 level-triggered D-type flip-flop이 탄생한다.
Hold That Bit는 기본적으로 클럭이지만 명령이라고 볼 수 있다. write라는 명령이 떨어질 때만 Q에 데이터가 전송되기 때문!
- AVL 트리란? 각 케이스?
: 트리의 밸런싱을 조절해주는 트리.
균형 트리가 되기 위해서, 자식의 수를 왼쪽을 기준으로 하여 BF(Balance Factor)인 [-1, 0, 1]로 표현한다. 양수라면 왼쪽이 자식이 더 많다는 뜻이기 때문에 왼쪽에 문제가 있다는 뜻이다.
LL, RR, LR, RL 케이스가 있다.
LL, RR은 각 방향의 첫 글자를 본떠 만든 이름으로 역방향으로 회전시키면 된다.
(여기서 회전의 의미는 RR이라면 Right의 원소가 Left보다 많은 음수의 케이스로, 오른쪽 가장 윗 노드를 왼쪽으로 내리는 의미이다.)
LR, RL의 경우 맨 윗단의 노드부터 자식 노드가 왼쪽-오른쪽 혹은 오른쪽-왼쪽에 있다는 뜻으로, 반대 방향으로 두 번 회전시키면 된다.
(LR의 경우 반대 방향이 R, L이기 때문에 L-R의 위치를 바꾸어 LL의 사향 트리로 만들고 LL의 케이스처럼 오른쪽으로 회전 처리한다.)
- Red-Black 트리란? 조건과 삽입, 삭제?
: 조건을 만족하도록 유지하며, 계속해서 rebalancing 하는 트리.
조건)
1. Root와 Leaf node는 black이다.
(여기서 leaf는 트리의 실제 말단 노드가 아닌, 그 아래에 임의의 null(nil) black 노드)
2. red의 자식은 red가 될 수 없다.
3. root에서 leaf까지의 모든 경로는 같은 black의 개수를 유지한다.
삽입) “double red case” (삽입 후 부모가 red일 때)
모든 삽입은 red node로 이루어진다.
1. 부모의 형제가 red일 때
: 부모와 형제를 모두 black으로 바꾸고, 부모의 부모를 red로 바꾼다.
이때 부모의 부모에서 double red가 발생한다면 같은 방법으로 거슬러 올라간다.
만일 부모의 부모가 root일 경우 red를 black으로 아무 조건 없이 바꾸고 종료한다.
2. 부모의 형제가 black이거나 없을 때
: 삽입 노드, 부모, 부모의 부모 세 노드를 비교하여 숫자를 정렬하고
가운데 숫자를 부모의 자리로 선택. 나머지 두 노드를 자식 노드로 지정하고
부모 노드는 black, 자식 노드는 red로 바꾼다.
삭제) “double black case” (삭제 후 대체 노드인 자식이 black)
1. black이 삭제, 그 자리에 오는 노드가 red.
: red 노드를 black으로 색칠.
2. black이 삭제, 그 자리에 오는 노드가 black.
2-1. 형제가 black, 형제의 자식도 모두 black
: 원래의 자리가 black, 그 자리에 오는 노드가 black이라면 대체한 노드의 상태를 double black이라 한다.
double black의 상태를 해제하기 위해 자신의 형제 노드를 red로 바꾸고 부모에게 double black 상태를 올린다.
double black 상태가 된 노드가 root라면 아무 조건 없이 black으로 바꾸고 종료한다.
2-2. 형제가 red
: 형제를 black, 부모를 red로 칠하고 왼쪽으로 회전한다. 그 후 위의 상황에 맞게 해결한다.
2-3. 형제가 black, 형제의 오른쪽 자식이 red
: 부모의 자식을 black으로 칠하고, 왼쪽 회전.
2-4. 형제가 black, 형제의 왼쪽 자식이 red
: 형제를 red, 자식을 black 칠하고, 형제를 기준으로 오른쪽 회전. 그 후 2-3.
- Red-Black 트리와 AVL 트리의 차이?
: AVL이 엄격, R-B가 회전수가 적다.
따라서 탐색이 많은 경우엔 AVL, 삽입 삭제가 많은 경우는 R-B가 유리하다.