전체 글

https://github.com/Layton0-0
Spring/이론

제어의 역전(IoC) & 의존관계 주입(DI)

제어의 역전(Inversion of Control) - AppConfig와 같이 기획자가 프로그램에 대한 제어 흐름 권한을 가져가는 것을 제어의 역전이라고 한다. * 프레임워크 vs 라이브러리 * - 내가 작성한 코드를 제어하고 대신 실행까지 하면 프레임워크다. (JUnit -> @Test 안의 내용만 개발자가 작성. 알아서 테스트 시켜줌.) - 내가 작성한 코드가 직접 제어의 흐름을 담당한다면 라이브러리다. 의존관계 주입(Dependency Injection) - 정적인 클래스의 의존 관계, 실행 시점에 결정되는 동적인 객체(인스턴스)의 의존 관계 - 정적인 클래스의 의존 관계: import 코드로 파악 가능. 클래스 다이어그램. - 동적인 객체(인스턴스)의 의존 관계: 실제 생성된 객체 인스턴스의 참..

알고리즘/이론

이진 탐색(Binary Search)

이진 탐색이란? - 정렬되어 있는 리스트에서 탐색 범위를 절반씩 좁혀가며 데이터를 탐색하는 방법 - 시작점, 끝점, 중간점을 이용하여 탐색 범위를 설정하고 찾은 인덱스를 반환한다. 이진 탐색의 시간복잡도 - 단계마다 탐색 범위를 2로 나누므로 연산 횟수는 log(2)N에 비례한다. - 시간복잡도는 O(logN)을 보장한다. # 재귀함수 버전 def binary_search(array, target, start, end): # 탐색할 곳이 안 남으면 None반환 if start > end: return None mid = (start + end) // 2 # 찾은 경우 중간점 인덱스 반환 if array[mid] == target: return mid # 목표값이 중간점의 값보다 작은 경우 왼쪽 확인 el..

Spring/이론

SOLID(좋은 객체 지향 설계의 5가지 원칙)

SRP(Single Responsibility Principle) 단일 책임 원칙 - 한 클래스는 하나의 책임만 가져야 한다. - 하나의 책임은 클 수도 있고, 작을 수도 있고, 문맥과 상황에 따라 다르다. - 중요한 기준은 변경이다. 변경이 있을 때 파급 효과가 적으면 된다. OCP(Open/Closed Principle) 개방-폐쇄 원칙 - 소프트웨어 요소는 확장에는 열려 있으나 변경에는 닫혀 있어야 한다. - 다형성을 활용하면 되지만 다형성만으로는 지켜질 수 없다. - 인터페이스를 구현한 새로운 클래스를 하나 만들어서 새로운 기능을 구현 - 역할과 구현의 분리가 가장 중요한 원칙이다. - 구현 객체를 변경하려할 때 클라이언트 코드는 변경되면 안된다. LSP(Liskov Substitution Pri..

Computer Science/운영체제

컴퓨터 시스템 구조2(System Structure & Program Execution 2)

동기식 입출력과 비동기식 입출력 동기식 입출력(synchronous I/O) -> 도둑이 은행을 털러오면, 경찰이 온다. (순차적으로 실행되는 것) - I/O 요청 후 입출력 작업이 완료된 후에야 제어가 사용자 프로그램에 넘어감 구현 방법1 - I/O가 끝날 때까지 CPU를 낭비시킴 - 매 시점 하나의 I/O만 일어날 수 있음 구현 방법 2 - I/O가 완료될 때까지 해당 프로그램에게서 CPU를 빼앗음 - I/O처리를 기다리는 줄에 그 프로그램을 줄 세움 - 다른 프로그램에게 CPU를 줌 비동기식 입출력(asynchronous I/O) - I/O가 시작된 후 입출력 작업이 끝나기를 기다리지 않고 제어가 사용자 프로그램에 즉시 넘어감 * 두 경우 모두 I/O의 완료는 인터럽트로 알려줌 DMA(Direct ..

Computer Science/운영체제

컴퓨터 시스템 구조1(System Structure & Program Execution 1)

CPU: 작업을 처리하는 하드웨어 DMA controller: I/O 장치로 부터 온 데이터를 메모리에 저장해주는 역할 Mode bit: 사용자 프로그램의 잘못된 수행으로 다른 프로그램 및 운영체제에 피해가 가지 않도록 하기 위한 보호 장치 -> 0이면 OS가 사용중(커널 모드), 1이면 사용자 프로그램이 사용중(사용자 모드) -> 보안을 해칠 수 있는 중요한 명령어는 커널 모드에서만 수행가능한 '특권명령'으로 규정 -> Interrupt나 Exception 발생 시 하드웨어가 mode bit를 0으로 바꿈 -> 사용자 프로그램에게 CPU를 넘기기 전에 mode bit를 1로 셋팅 사용자 프로그램이 I/O를 하는 법 - 시스템콜: 사용자 프로그램이 OS에 요청하는 것 (CPU에게 요청하기 위해) -> 사..

알고리즘/이론

정렬 알고리즘 시간복잡도 비교

정렬 알고리즘 평균 시간 복잡도 공간 복잡도 특징 선택 정렬 O(N^2) O(N) 아이디어가 매우 간단함. 삽입 정렬 O(N^2) O(N) 데이터가 거의 정렬되어 있을 때 가장 빠름. 퀵 정렬 O(NlogN) O(N) 대부분의 경우 가장 적합함. 충분히 빠름. 계수 정렬 O(N + K) O(N + K) 데이터의 크기가 한정적인 경우에만 사용가능. 매우 빠름. * 표준 정렬 라이브러리는 최악의 경우에도 O(NlogN)을 보장함.

알고리즘/이론

계수 정렬(Count Sort)

계수 정렬이란? - 특정한 조건이 부합할 때만 사용할 수 있지만 매우 빠르게 동작하는 정렬 알고리즘. -> 데이터의 크기 범위가 제한되어 정수 형태로 표현할 수 있을 때 사용 가능하다. -> 가장 큰 데이터와 가장 작은 데이터의 차이가 1,000,000을 넘지 않을 때 효과적으로 사용할 수 있다. -> 동일한 데이터가 여러번 등장할 때 효과적. - 각 인덱스에 해당하는 데이터가 몇 번 등장하는지 카운트해주면 됨. - 데이터의 개수 N, 데이터(양수) 중 최댓값이 K일 때 최악의 경우에도 O(N + K)의 수행시간을 보장. # 계수 정렬 # 모든 원소의 값이 0보다 크거나 같다고 가정 numbers = [3, 7, 1, 9, 11, 10, 5, 4, 2, 4, 5, 2, 8, 1, 5, 3] # 모든 범위..

알고리즘/이론

퀵 정렬(Quick Sort)

퀵 정렬이란? - 기준 데이터를 설정하고 그 기준보다 큰 데이터와 작은 데이터의 위치를 바꾸는 방법. - 일반적인 상황에서 가장 많이 사용되는 정렬 알고리즘 중 하나. - 정렬 라이브러리의 근간이 되는 알고리즘이다. - 가장 기본적인 퀵 정렬은 첫 번째 데이터를 기준 데이터(Pivot)으로 설정한다. 퀵 정렬의 시간 복잡도 - 퀵 정렬은 평균의 경우 O(NlogN)의 시간 복잡도를 가진다. - 최악의 경우 O(N^2)의 시간 복잡도를 가진다. -> 이미 정렬된 배열에 대해서 퀵 정렬을 수행할 경우 맨 왼쪽 원소가 자기 자신을 기준으로 나누기 때문이다. -> 이 경우 한 원소 당 한번의 연산이 수행되는 꼴이므로 탐색O(N) * 나누기 N번 = O(N^2)이 나온다. # 퀵 정렬 numbers = [3, 7..

레이튼
개발 공부 스케치북