latest 👒
- [CH 05.01, 05.02] 리팩토링, 단위테스트 리팩토링을 하기 위해서는 설계 원칙, 디자인 패턴, 코딩 규칙 등을 능숙하게 사용할 수 있어야 하기 때문에 문제를 해결하는 것보다 더 많은 능력이 요구된다. 리팩토링의 목적 리팩토링의 정의 리팩터링은 코드에 대한 이해를 쉽게 하기 위해 소프트웨어의 내부 구조를 개선하는 것으로, 소프트웨어의 외부 동작을 변경하지 않고 수정 비용을 줄이는 것을 목적으로 한다. (마틴 파울러)"외부동작을 변경하지 않는다"- 함수를 리팩토링 한다면, 함수의 정의를 변경하지 않는다.- 라이브러리를 리팩토링 한다면, 외부에 노출된 API, 메서드를 변경하지 않는다. 리팩토링이 필요한 이유 1) 코드 품질 저하를 효과적으로 방지한다.2) 고품질 코드는 한번의 설계에 나오는 것이 아니라, 지속적인 작업의 결과로 나오는 것이다.3) 초.. 2025.08.12
- [CH03.01] 설계 원칙 - 단일 책임 원칙 단일 책임 원칙의 정의 및 해석 클래스와 모듈은 하나의 책임 또는 기능을 가지고 있어야 한다는 설계 원칙* 여기서 모듈을 - 추상적인 개념으로 클래스도 일종의 모듈이라고 정의하거나 - 클래스보다 포괄적인 개념으로 여러개의 클래스가 모여 모듈이 된다고 정의 가능그렇지만 모듈을 어느 개념으로 정의하더라도 단일 책임 원칙의 개념을 적용하는데 큰 지장은 없다클래스에 비즈니스와 관련 없는 기능이 두 개이상 포함되어있으면 단일 기능을 가진 더 작은 클레스로 분할 해야 한다.클래스에 단일 책임이 있는지 판단하는 방법 [주문 관련 기능 vs 사용자 관련 기능] 과 같은 예시는 서로 다른 기능임을 구분하기 쉬우나, 다음과 같은 상황에서 클래스가 단일 책임 원칙을 만족하는지 판단하는 것은 쉽지 않다.public class.. 2025.08.05
- [CH02.09] 상속보다 합성 상속이 더이상 사용되지 않는 이유 상속을 이용한 AbstractBird 구현 예시 public class AbstractBird { public void fly() {}}public class Ostrich extends AbstractBird { public void fly() { throw new UnsupportedMethodException("에러메세지"); }} 다른 날지 않는 새들에 관련된 클래스를 구현할 때마다 예외를 발생시켜야 하고, 날지도 않는 새에게 fly() 함수를 구현하는 것은 최소 지식 원칙(LOD)에도 위반된다. 위의 문제를 해결하기 위해서 특정 기준으로 나누어 클래스를 세분화 한다면, AbstractBird- AbstractFlyableBird- A.. 2025.08.04
algorithm 🔑
- 최단거리구하기_다익스트라(Dijkstra) 알고리즘 다익스트라 알고리즘에 대한 이해 - 하나의 정점으로 부터 다른 모든 정점까지의 최단거리를 구하는 문제이다. - 음수 간선이 있는 그래프에서는 사용할 수 없다. - 우선순위큐를 이용한다. V = 6, E = 7인 다음 그래프에 대하여, 정점 1번으로 부터 다른 모든 정점까지의 거리를 구해보자. 1번으로부터의 거리를 저장하는 dist 배열을 구성하고, 우선순위 큐에 1번 노드의 (거리, 노드번호)를 추가한다. 우선순위 큐는 가장 작은 값을 먼저 뱉어내므로, 1번으로부터의 거리가 가장 가까운 노드를 뽑아내면 (0, 1)이 된다. 이 때, 큐에서 뽑아낸 (0, 1)의 정보와 배열의 정보 dist[1] = 0이 일치하므로 1번까지의 거리를 확정한다. 1번에서 이동할 수 있는 노드는 2번 노드 뿐이다. 거리가 확정.. 2022.08.29
- 비트 연산_AND 연산/OR 연산/ XOR 연산/ NOT 연산 / Shift 연산 / 비트의 특정 인덱스 추출(업데이트) 비트 연산 0과 1로 이루어진 이진수의 비트 별 연산 AND 연산(&) 두 비트가 모두 1일 때만 1인 연산 0 0 1 1 0 1 0 1 -------- 0 0 0 1 OR 연산(|) 두 비트 중 하나라도 1이면 1인 연산 0 0 1 1 0 1 0 1 -------- 0 1 1 1 XOR 연산(^) 두 비트가 다르면 1인 연산 1 1 0 1 0 1 0 1 -------- 1 0 0 0 NOT 연산(~) 0을 1로, 1을 0으로 변환하는 연산 0 1 0 1 -------- 1 0 1 0 Shift 연산 - Left shift: 비트들을 왼쪽으로 k칸씩 옮기고 남는 자리에 0을 채우는 연산 (x > k) 1 0 0 1 > 2 --------------- 1 0 특정 인덱스의 값을 추출하는 법 num = 12.. 2022.04.03
- 완전탐색_순열/중복순열/조합/중복조합 순열(Permutation) - n개 중 r개를 선택할 때, 순서를 고려하고 중복을 허용하지 않는 방법 - nPr = n!/(n-r)! - 재귀적으로 배열을 채워나가면서 중복하는 숫자가 없도록 check 배열을 업데이트 #include #include using namespace std; //순열: 순서 O, 중복 X //nPr = n!/(n-r)! #define n 3 #define r 2 int arr[30]; int check[30]; void printarr() { for (int i=0; i 2022.03.11
- 최단거리구하기_플로이드 와샬(Floyd Warshall) 알고리즘 플로이드 알고리즘에 대한 이해 - 플로이드 알고리즘이란, 그래프의 모든 정점 쌍 사이의 최단 거리를 구하는 알고리즘이다. - 모든 정점 쌍에 대한 2차원 표를 채우는 과정으로 진행된다. V(노드의 개수) = 6, E(간선의 개수) = 7 인 다음과 같은 그래프에서 모든 정점 쌍 사이의 최단 거리를 구해보자. 먼저, 아무 정점도 거치지 않았을 때 정점 i와 정점 j 사이의 최단 거리로 표를 채운다. 예를 들어, 정점 3과 정점 6은 아무 정점도 거치지 않았을 때 거리가 8이다. 물론, 3 -> 2 -> 5 -> 6 으로 이동하는 경우 더 작은 거리(7)로 도달할 수 있으나, 가장 처음에는 다른 정점을 거치는 경우를 제외하고 직행으로 연결하였을 때의 최단 거리만 표에 기록한다. int V, E; vector.. 2022.03.07
- 최소신장트리(Minimal Spanning Tree)_크루스칼(Kruscal) 알고리즘 최소신장트리(MST)에 대한 이해 - 신장트리란, 뱡향성이 없는 그래프의 부분그래프(Subgraph)들 중에서, 모든 정점을 포함하는 트리이다. - 최소신장트리란, 신장트리들 중에서 간선의 합이 가장 작은 트리를 말한다. - 그래프에서 최소신장트리는 여러 개 있을 수 있다. 최소신장트리를 구하는 알고리즘으로는 크게 크루스칼(Kruscal) 알고리즘과 프림(Prim) 알고리즘이 있으며, 해당 글에서는 크루스칼 알고리즘의 방법을 다룬다. V(노드의 개수) = 6, E(간선의 개수) = 7 인 다음과 같은 그래프에서 최소신장트리의 간선 길이의 합을 구해보자. 간선들 중, 가장 길이가 짧은 간선을 선택하여 연결된 두 노드를 확인한다. 만약 두 노드가 다른 집합에 속해있다면 두 노드를 같은 집합에 포함시키고 해당.. 2022.03.04