일단 씻고 나가자
23.03.29 본문
2023. 03. 29 수요일
- [Java] HashSet(HashMap)이 정보를 저장하는 방법? key가 왜 정렬이 돼?
: 해시 테이블 최초 객체 생성 시기에 생성자에 적은 기본 catacity(default = 16)을 인덱스 삼아 들어오는 원소들을 정렬한다. 예를 들어 기본 capacity인 16의 설정 후 0, 1, 5, 17 이 순서대로 들어왔다면
0은 0번, 1은 1번, 5는 5번 인덱스에 들어가지만 17은 16을 넘는 인덱스이므로 17%16==1 즉 1번 인덱스로 설정된다. 하지만 이미 1이 1번 인덱스에 들어가 있으므로, 그 다음 인덱스인 2번에 들어가서 0, 1, 17, 5로 정렬되어 저장된다.
이는 char인 a~Z에서도 볼 수 있는데, 최초 capacity를 33으로 해주면 대문자가 먼저 정렬되는 것을 볼 수 있다.
- [Java] 정규식의 ?! 패턴과 +, $, ^의 의미?
: ? 은 단일로 쓰이면 앞의 패턴이 최대 1개만 존재한다는 뜻.
(ex. a? -> “a” (o) / “ ” (o) / aa (x) )
?! 패턴은 뒤에 쓰이는 패턴이 존재한다면 false
(ex. hello?!hi -> “hellohi” (x) / “hello” (o) )
+ 는 앞의 표현식이 1개 이상 존재한다는 뜻으로, ?과 있거나 없거나 한 *과 대비.
(ex. a+ -> “b” (x) / “ba” (o) )
$ 는 문자열의 끝이 해당 패턴으로 끝난다는 뜻.
(ex. a$ -> “i am a” (o) / “ab” (x) )
^ 는 대괄호 안에서 쓰일 때는 제외, 밖에서 쓰일 때는 시작점을 말함.
(ex. [^a-z] -> a~z 제외 / ^a -? “abc” (o) )
- [Java] 세제곱근을 구하는 함수?
: Math.cbrt(8) == 2.0
제곱근은 sqrt인데, sqrt는 square root, cbrt는 cube root이며 유래는 그리스 시대에 수를 기하학적으로 표현한 것에 있다.
- [Spring] AOP란? 관심 사항의 종류?
: AOP(Aspect Oriental Programming) 란 모든 메소드의 호출 시간을 측정하고 싶을 때 사용된다.
특정 메소드 호출 시간을 알려면, 해당 메서드의 처음과 끝에 System.currentTimeMillis()를
측정하여 둘을 빼는 것으로 알 수 있겠지만, 모든 메서드에의 적용이 힘든 것과 핵심 코드와 해당 코드가 섞여서 유지보수가 힘든 점, 그리고 해당 기능은 핵심 관심 사항은 아니지만 공통 관심 사항이므로 이를 통일할 필요성이 있다.
관심 사항에는 공통 (cross-cutting concern)과 핵심(core concern) 관심 사항이 있다. 핵심 관심 사항으로는 서비스 로직 등이 있다.
- [Java] DataOutputStream이란? 사용법?
: 생성자로 장식 대상(경로를 명시할 수 있는 객체)을 받는 장식을 하는 클래스.
장식 대상을 다양한 방식으로 꾸며주는 클래스다.
사용 방법은 new DataOutputStream(new FileOutputStream(“경로”)); 이며,
해당 클래스는 writeInt/Boolean/Double 등으로 다양한 형태로 사용할 수 있지만
해당 방식으로 쓰인 파일도 같은 형태로 읽어주지 않으면 문자열이 깨져 제대로 된 내용을 읽을 수 없다.
- 컴퓨터가 전류로 0과 1을 출력하는 과정? 논리 게이트의 종류, 도형, 수식과 수식의 명칭?
: 자기장은 오른손의 법칙으로, 엄지를 들고 오른손을 쥐면 손가락의 방향대로 전류가 흐를 때 자기장은 엄지 쪽(N)으로 나가 반대쪽(S)으로 들어간다.
컴퓨터는 개별 스위치마다 자기장이 발생하는 전류를 주어, 전류를 흘렸을 때 스위치가 그쪽으로 당겨져 연결되고, 전류를 풀면 스위치가 돌아가는 성질을 이용한다.
이런 개별 스위치는 비트와 같은 의미를 갖는다.
AND는 해당 스위치를 직렬 형태로 연결, OR은 스위치를 병렬형태로 연결한 것을 말한다.
다른 게이트는 Not, Not과 AND, OR을 결합한 NAND, NOR 등이 있다.
AND는 *, OR은 +, NOT은 머리 위에 짝대기를 씌운다.
이렇게 논리적인 게이트를 수식으로 풀어낸 것을 ‘부울 대수식’이라 한다.
- 가산기와 캐리비트란?
: 가산기란 덧셈 연산을 수행하는 논리 회로이다.
캐리비트란 해당 진법의 값이 초과되어 자릿수가 올라가는 것, 즉 캐리란 최상위 비트(MSB)에서 그 위 비트로 자리 올림이 발생하는 것을 말한다. 캐리비트는 해당 연산이 일어나는 비트이다.
- 캐리비트를 해결하는 방법? 해당 논리와 관련된 논리 게이트? 반가산기와 전가산기?
: 캐리비트는 비트 1과0의 덧셈 연산에서 1+1=0을 해결하기 위해 나온 논리이다.
캐리비트는 1+1일 때만 1이고 나머지 경우에는 모두 0, 원래 비트 자리의 연산(sum)에서는 (0,0), (1,1)일 때 0을 출력해주어야 하는데
이는 input을 각각 AND, OR 연산하고 나온 두 연산 값을 AND 연산하면 나오며
이것이 XOR의 탄생 과정이다. (XOR의 도형은 OR의 도형 밑바닥에 선을 하나 추가한다.)
즉 XOR 연산은 두 비트가 같을 때만 0을 반환하고, 다를 때는 1을 반환하는 논리이다.
캐리비트는 (1,1)일 때만 1이면 되기 때문에 이는 AND 게이트 하나로 충분히 표현된다.
정리하자면, 두 비트의 덧셈 계산은 XOR, AND 두 가지만 있으면 표현할 수 있다.
이렇게 두 비트의 연산을 sum, carry 비트로 각각 출력해주는 것이 반가산기(half adder)이다. 그의 반대인 전가산기(full adder)는 넘어간 carry 비트까지 다음 자리에서 계산해주며, 반가산기를 두 개 묶으면 논리적인 계산이 된다.
(S : Sum / CO : Carry Bit)
- 트리란? 트리 용어?
: 트리란 Node와 링크로 구성된, 노드 간 이동 경로가 유일한 자료구조이다. LinkedList도 트리의 일종이라 볼 수 있으며, 트리에서 사이클이 생기면 그래프가 된다. (Acyclic) 폴더 구조(디렉토리 – 서브 디렉토리)나 조직도, 가계도처럼 계층적 구조를 나타낼 때 많이 쓰인다.
- 이진 트리란? 이진 트리의 종류? 특징?
: Binary Tree. 각 노드는 최대 2개의 자식을 가질 수 있으며, 자식 노드의 좌우를 구분하여 자식의 위치가 달라지면 같은 트리라 보지 않는다.
이진 트리의 종류에는 포화/완전/정/편향(사향)/균형 이진 트리가 있으며,
포화 (Perfect)는 모든 레벨에서 노드가 꽉 차있는 트리.
완전 (Completely)은 마지막 레벨을 제외하고 노드가 모두 채워진 트리.
정 (Full)은 모든 노드의 자식 개수가 0 혹은 2인 트리.
편향 (Skewed, 사향)은 한쪽으로만 자식이 생긴 트리. (= LinkedList)
균형 (Balanced)은 모든 노드의 좌우 서브 트리 높이가 1 이상 차이 나지 않는 트리.
(== 특정 노드의 두 자식부터를 포함한 깊이가 1 이상 차이 없음. 편향 X
탐색 속도가 빠르다.)
중요한 특징으로는
* 포화 이진트리의 노드의 수는 2^최대 깊이(높이 +1) -1개.
* 포화/완전 트리 노드의 높이는 log(2) 노드 개수. (정수부만 확인)
* 이진트리의 최대 가능 높이는 N-1. (사향 트리가 최대 가능 높이)
- 이진 트리의 순회란? 종류?
: Traversal. 모든 노드를 빠뜨리거나 중복하지 않고 방문하는 연산.
이진 트리의 순회에는 전위/중위/후위 (DFS) /레벨 (BFS) 순회가 있으며
* 전위 (Preorder)는 현재 -> 왼쪽 (최대한) -> 오른쪽 순서.
* 중위 (Inorder)는 왼쪽 (최대한에서 시작) -> 현재 -> 오른쪽 순서.
* 후위 (Postorder)는 왼쪽 자식 -> 오른쪽 자식 -> 현재 순서.
* 레벨 (Levelorder)은 위쪽 레벨부터 왼쪽 -> 오른쪽 순서.