![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fy2j4V%2FbtsK6kFnUKt%2FV6kFVRaVKBEKc68liBfMyk%2Fimg.png)
처음 자바를 배울 때는 제네릭이 이렇게 중요한 줄 몰랐는데 개발을 할 수록 제네릭 개념이 많이나와서 정리해보고자 한다. 해당 글은 인프런의 '김영한의 실전 자바 - 중급 2편'을 참고했다. 제네릭이 필요한 이유왜 제네릭을 많이 사용할까? 사실 나는 개발할 때 많이 사용하지 않는다. 하지만 사용하고 있는 라이브러리 코드들을 확인해보면 T나 K가 사용되고 있는 코드들이 많았다. 많이 사용하는 이유 중 하나는 `코드의 재사용`이다. 코드의 재사용제네릭을 사용하면 StringBox이든, IntegerBox이든 객체마다 새로운 클래스를 만들지 않고도 단 하나의 클래스만으로 여러 개의 클래스를 지원할 수 있게 된다.public class GenericBox { private T value; pub..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fv5i3E%2FbtsK5cOdMlL%2FNbbKX0lrZASx9WK79WBiW0%2Fimg.png)
1. 문제 2. 접근이 문제는 알파벳 N개를 사용해서 최대 연속된 문자열의 길이를 구하는 것이다. 처음에 N이 2로 고정된 줄 알고 완탐 돌릴려고 했는데 1부터 26까지 주어지는 것이었다. 그래서 생각한 아이디어는 set과 투 포인터를 이용한 풀이었다. 중복이 허용되지 않는 set으로 알파벳을 저장하고 set의 사이즈가 N을 넘어가면 사이즈가 N이 될 때가지 빼주면 되겠구나 했다. 하지만 'cacc' 처럼 c가 연속적으로 나오지 않는 경우를 고려하지 못한 풀이였다. 단순히 c를 만나면 다음 문자열이 c가 아닐 때까지 빼주고 c를 set에서 삭제했더니 a 뒤에 나오는 cc를 삭제하지 않고 있었다. 그래서 `HashMap`을 이용해서 카운팅한 문자의 카운트를 저장하고, 값이 0이 될 때 map에서 삭제해..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcRdVFq%2FbtsK5bVCka4%2F1UC22SPzCTERE5IpvNuWxk%2Fimg.png)
무상태 (stateless) 웹 계층수평적 확장을 위해서는 상태 정보(사용자 세션 데이터 같은)를 웹 계층에서 분리해야 한다. 웹 계층과는 별도의 DB에 저장해서 필요할 때 가져오도록 한다. 상태 정보를 웹 계층에서 저장한다면 사용자 A의 요청은 언제나 상태 정보를 가지고 있는 웹서버에서 수행되어야 한다. 대부분의 로드밸러서는 특정 클라이언트의 요청을 특정 인스턴스로 고정하는 고정 세션 기능을 지원한다. 하지만 이는 특정 클라이언트의 요청이 특정 인스턴스에 몰리기 때문에 부하의 불균형을 초래할 수 있다. 그래서 웹 서버 계층이 아닌 데이터 계층에 별도의 DB를 두어서 웹 서버에서 필요할 때 정보를 가져오도록 한다. 아래 그림의 공유 저장소가 그 역할이다. 이러한 구조를 통해 웹 서버는 상태 정보와 무관하..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdyqKR3%2FbtsK3vAlgxj%2F6TqWa9B43R2hZHoBad9To0%2Fimg.png)
1. 문제 2. 접근단순히 괄호 찾아서 지우는 문제인 줄 알았는데 괄호 쌍의 조합을 구해야 하는 문제였다. 처음엔 스택만 이용하다가 괄호가 2개 이상 동시에 지워져야 한다는 것을 깨닫고 Set을 이용하여 괄호의 쌍 인덱스를 저장했었다. 하지만 구현이 계속 어려워져서 원점으로 돌아가서 다시 생각했다. 중간에 문제를 잘못 이해한 것을 깨달았으면 구현하고 있는 것을 계속 붙잡고 있을게 아니라 처음부터 다시 생각하는게 오히려 빠른 것 같다. 그냥 다시 생각하자. 처음부터 다시 생각한 결과, 괄호의 쌍들을 구해서 조합으로 뽑는 것으로 결정했다. 괄호의 쌍은 스택을 이용해서 구하고 요소 하나로 저장한다. 그 후 백트랙킹으로 괄호의 쌍을 1개부터 10개까지 선택한다. 3. 코드import java.io.Buffe..
![article thumbnail](https://img1.daumcdn.net/thumb/R750x0/?scode=mtistory2&fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb6sies%2FbtsKWUNuquK%2FmnsURKLCXaqa5reNU8Iapk%2Fimg.png)
1. 문제 2. 접근문제를 읽어보면 특정 알고리즘을 이용하는 것이 아니라 구현 문제임을 알 수 있다. 계속 구현 문제를 풀면서 느낀 것은 구현 문제는 처음부터 잘 구현해야한다!! 그렇지 않으면 디버깅 시간이나 실수 고치는 시간이 더 드는 것 같다. 그래서 구현 문제임을 파악하고 구체적인 설계부터 시작했다. 문제에서 친절하게 각 단계마다 설명을 줘서 단계별로 함수를 나눴다.고민한 점은 내려가는 위치, 올라가는 위치를 담을 고정 위치 정보, 움직이는 벨트 정보, 인형의 정보를 겹치지 않고 어떻게 저장할까 였다. class를 너무 많이 만들면 오히려 헷갈려서 최대한 줄이면서 표현하려고 했다. 처음엔 int[] 배열로 각 벨트의 내구도를 저장하고 `Doll` 클래스로 인형의 생성카운트, 현재 위치를 저장했다. ..