분류 전체보기 646

[Spring] Bean 자동등록 VS Bean 수동등록

어노테이션으로 스프링 컨테이너에 Bean을 등록하는 방법은 2가지가 있다. 1) 컴포넌트 스캔으로 자동등록 ( @Component, @Service, @Repository ... ) 2) @Configuration 클래스에 수동등록 ( @Bean ) 두 가지 방식은 언제 어떻게 사용하는 것이 좋을까? 1) 업무로직 VS 기술지원 자동방식은 컴포넌트 스캔으로 @Component로 선언된 클래스를 자동으로 Bean으로 등록하니 편하다. 그러나 @Component가 여기저기 퍼져 있어 추적이 힘들다. 수동방식은 @Configuration 클래스를 생성하고 Bean을 하나하나 정의해야 하는 번거로움이 있지만 하나의 클래스에 Bean이 모여 있다보니 관리가 쉽다. 그러므로 자동등록 방식은 업무로직 Bean에 사용..

SPRING/Spring Basic 2024.02.06

[Spring] 스프링 컨테이너와 싱글톤 패턴

싱글톤 패턴 가장 단순한 방식으로 싱글톤 패턴이 적용된 클래스는 다음과 같다. 1. Static 영역에 상수로 인스턴스가 생성되어야 한다. 2. 생성자는 private 접근자로 막아놓는다. 3. 인스턴스는 static 메소드로만 외부 접근을 허용한다. public class Box { // 1. statice 영역에 상수로 객체를 생성한다. private static final Box instance = new Box(); // 2. 생성자는 private 접근자로 막아놓는다. private Box(){ } // 3. 인스턴스는 static 메소드로 조회한다. public static Box getBox(){ return instance; } } 웹에서 싱글톤 객체가 중요한 이유는 수많은 Request가..

SPRING/Spring Basic 2024.02.05

[Spring] 스프링을 사용하는 이유

스프링(Spring)을 사용하는 이유 스프링을 사용하는 이유는 객체(Bean) 생성과 의존관계 주입(DI)을 대신 해주기 때문이다. ( IOC, 제어의 역전 ) 그렇다면, 개발에서 객체생성과 의존관계 주입을 대신 해주는 프레임워크가 필요한 이유는 무엇일까? Spring은 객체지향개발을 도와주는 프레임워크이다. 객체지향개발에서 핵심은 객체 간 결합도를 줄이는 것이다. public class Computer { MouseA mouseA = new MouseA(); // MouseA에 의존, 결합도 증가 public void click(){ mouseA.click(); // MouseA에 의존 } } 컴퓨터 객체가 마우스 객체를 참조하면 클릭 기능을 사용할 수 있다. 그러나 위 코드와 같이, 컴퓨터가 특정 마..

SPRING/Spring Basic 2024.02.01

[Modern JAVA] 클로저(Closure)란?

JAVA에서 클로저(Closure)란? 클로저(Closure)란, 외부 스코프에 선언된 변수를 다른 스코프 영역에서 참조하는 기술이다. 사실, JAVA에서 클로저는 없는 개념이다. 익명함수 클래스나 람다로 인스턴스를 생성할 때, 외부 스코프 변수를 캡처하여 인스턴스 내부에 저장하는 '캡처링' 기술을 두고, 단순히 클로저라 부르는 것이다. 외부에 선언된 변수를 내부에서 사용하니, 마치 클로저 같은 기능을 하기에 붙여진 이름이다. 외부 변수를 캡처하여 인스턴스에 저장하면, 외부에 있는 데이터와 인스턴스에 저장된 데이터는 서로 동일해야 한다. 만약 둘 중 하나가 변경되면 데이터 멱등성이 훼손되기 때문이다. 그래서 JAVA8 이전에는 캡처링 기술이 적용될 변수는 변경되지 못하도록 final 선언을 강제했다. J..

JAVA/Modern JAVA 2024.01.31

[PS] Programmers - 혼자 놀기의 달인 ( DFS )

프로그래머스 코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요. programmers.co.kr ◎ 문제풀이 상자 안에는 다음 오픈할 상자의 번호가 적혀있는 카드가 들어있다. 임의의 한 상자를 오픈하여 연달아 오픈해서 이미 오픈한 상자를 만날 때까지 오픈한다고 했을 때, 연달아 오픈할 수 있는 상자의 개수가 가장 많은 것과 그 다음 많은 것의 곱을 구하는 문제이다. 문제가 복잡해보이지만 싸이클을 찾는 문제이다. 방향그래프에서 싸이클을 찾는 문제는 DFS 알고리즘을 사용하면 된다. DFS 알고리즘으로 가장 큰 싸이클과 그 다음 싸이클을 찾아서 싸이클 안의 상자수를 곱하면 된다. 주의할 점은 입력으로 주어진..

[Algorithm] DFS, BFS 시간복잡도가 O(N+E)인 이유

노드의 개수가 N이고 간선의 개수가 E일 때,DFS, BFS로 그래프를 완전탐색한다면 시간복잡도가 O(N+E)인 이유는 무엇일까?       DFS, BFS는 완전탐색에 이용된다.반복문으로 모든 노드를 탐색해야 하므로 시간복잡도는 최대 O(N)을 갖는다.  그럼 이제 노드 하나를 방문해보자.여기서 부터 간선의 개수가 연산에 영향을 미친다. DFS는 재귀호출로 인접한 노드에 접근하고BFS는 인접한 노드를 큐에 넣는다.  그러므로 DFS는 인접한 노드의 개수, 즉 간선의 개수에 따라 재귀호출이 반복되고BFS는 인접한 노드의 개수, 즉 간선의 개수에 따라 while문이 반복된다. ( 큐가 빌때 까지 ) 그리고여기서 방문처리가 이루어 진다.  A노드를 방문하면 인접한 노드 B, C를 방문하고 B를 방문하면 인접..

[PS] BOJ17484 진우의 달 여행 ( DP ) with JAVA

17484번: 진우의 달 여행 (Small) 첫줄에 지구와 달 사이 공간을 나타내는 행렬의 크기를 나타내는 N, M (2≤ N, M ≤ 6)이 주어진다. 다음 N줄 동안 각 행렬의 원소 값이 주어진다. 각 행렬의 원소값은 100 이하의 자연수이다. www.acmicpc.net ◎ 문제풀이 진우가 지구에서 달까지 높이마다 정해진 방향으로 이동할 때, 비용의 최솟값을 구하는 문제이다. 처음에는 높이마다 정해진 방향으로 이동하므로, 계층에 따른 모든 경우의 수를 완전탐색하는 DFS 알고리즘을 떠올렸다. 그러다가 문제가 탐색(재귀호출)으로 어떤 조합을 찾기보다는 최적해를 구하는 문제이므로, 메모리제이션을 활용한 DP 풀이가 더 적합하다는 생각으로 바뀌었다. 이동에는 3가지 경우가 있다. 1) 좌측 아래로 대각선..

문제풀이/DP 2024.01.27

[PS] BOJ1515 수 이어 쓰기 ( 그리디 ) with JAVA

1515번: 수 이어 쓰기 세준이는 1부터 N까지 모든 수를 차례대로 공백없이 한 줄에 다 썼다. 그리고 나서, 세준이가 저녁을 먹으러 나간 사이에 다솜이는 세준이가 쓴 수에서 마음에 드는 몇 개의 숫자를 지웠다. 세준 www.acmicpc.net ◎ 문제풀이 1부터 N까지 공백없이 이어붙인 수열에서 임의로 몇 개의 수가 제거되었을 때, 제거된 수열만보고 N의 최솟값을 알아내는 문제이다. 수열의 좌측의 수부터 하나씩 그 수를 포함하는 수의 최솟값을 구하면된다. 134211 이 임의로 제거된 수열이라고 해보자. 가장 좌측인 1을 포함하는 수의 최솟값은 1이다. 그 다음 3을 포함하는 수의 최솟값은 3이다. 그 다음 5를 포함하는 수의 최솟값은 5이다. 그 다음 2를 포함하는 수의 최솟값은 2이다. 그 다음..

문제풀이/Greedy 2024.01.26

[OS] 가상메모리(Virtual Memory)란?

가상메모리에 대해서 알아보기 전에, 우선 CPU부터 간략히 알아보자. 32bit CPU, 64bit CPU라는 말을 많이 들어보았을 것이다. 여기서 32bit와 64bit는 무엇일까? 바로. CPU가 접근할 수 있는 메모리(RAM) 주소범위이다. 1bit가 0 과 1 , 2가지 경우를 표현하므로 32bit는 232가지 경우를 표현할 수 있다. 1GB는 230 가지 경우를 표현하므로, 232 = 22 x 230 = 4GB 정리하면, 32bit CPU는 4GB 메모리에 접근 가능하고 64bit CPU는 264 = 232 x 232 = 4GB X 4GB = 16GB 메모리에 접근가능하다. 그럼 이제 32bit CPU를 예로 들어 가상메모리 기법에 대해서 알아보자. ( 64bit도 원리는 동일하다. ) 가상메모..

CS/OS 2024.01.25

[자료구조] 우선순위큐에 비교로직 전달하기

JAVA에서 우선순위 기준이 복잡할 때, 정렬을 위해 주로 사용하는 자료구조가 우선순위큐(PriorityQueue)이다. 우선순위큐가 내가 원하는 우선순위대로 정렬하려면, 비교로직을 우선순위큐에 전달해야 한다. 이번 포스팅은 우선순위큐에 비교로직을 전달하는 방법을 알아보겠다. 예시 정렬기준 ( 여러 단어를 3가지 기준으로 정렬한다. ) 자주 나오는 단어일수록 앞에 배치한다. 해당 단어의 길이가 길수록 앞에 배치한다. 알파벳 사전 순으로 앞에 있는 단어일수록 앞에 배치한다 1) Comparable 인터페이스 우선순위큐는 객체를 기준으로 정렬하는데, 객체가 자체적인 정렬기준을 가지고 있으면 우선순위큐가 알아서 참조하여 정렬한다. 객체가 자체적인 정렬기준을 가지려면 Comparable 인터페이스를 구현해서 c..