본문 바로가기

전체 글

(185)
스프링디자인패턴(2) 프록시 패턴 - Proxy Pattern 프록시 패턴 (Proxy Pattern) Proxy는 대리인을 뜻하는 것으로, 청와대의 대변인을 생각하면 쉽습니다. 청와대 대변인들은 본인 의견을 말하기 보다 입장을 대리해서 이야기하는데, 이 개념이 엔티티에 적용되었다고 생각하면 됩니다. 프록시 패턴은 Service 메서드가 가진 메서드와 같은 이름을 사용하는데, 이를 위해 인터페이스를 이용합니다. 즉, 인터페이스로 구현을 강제하는 것이지요. 이로 같은 이름의 메서드가 구현되는데, 클라이언트는 실제 서비스 객체로 값을 받는지 프록시로 값을 받는지 알 수 없습니다. 여기서 중요한 포인트가 존재합니다. 대변인은 공식 입장문에 자신의 이야기를 추가하지 않지요? 그것처럼 프록시 패턴도 반환되는 결과 값을 그대로 반환할 뿐, 절대 무언가를 가감하지 않고 순수하게..
스프링 디자인패턴(1) 어댑터 패턴 - Adapter Pattern 디자인패턴 (Design Pattern) 객체 지향 특성과 설계 원칙을 기반으로 구성됨 실제 개발 현장에서 비즈니스 요구 사항을 프로그래밍으로 처리하며 만들어진 해결책 중 많은 이들이 인정한 방식으로 정리한 것 어댑터 패턴 (Adapter Pattern) 어댑터를 직역하자면 변환기이며, 이 패턴 또한 마찬가지로 서로 다른 두 인터페이스 사이 통신이 가능하게 한 것이다. 즉, 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 다른 인터페이스로 전환한 것이다. 고로 어댑터 패턴을 이용하면 호환성 문제로 같이 쓸 수 없는 클래스를 연결해서 사용할 수 있다. 대표적인 예시로 ODBC와 JDBC, JVM이 존재한다. 어댑터 패턴 또한 확장에는 열려있으나, 변경에는 닫혀있어 SOLID 원칙 중 OCP을 따른다..
객체 지향 설계 5원칙, SOLID 원칙 [ ※ 구체적 내용은 스터디 주차에 맞추어 추가할 예정 ] 객체 지향 언어 특성을 요리에 비유해보겠다. 객체 지향 4대 특성인 [ 상속, 캡슐화, 추상화, 다형성 ]이 요리도구라면, 객체 지향 설계 5원칙은 [ 요리 도구 사용법 ]이며, 디자인 패턴은 [ 레시피 ] 이다. 정리하자면 자바의 4가지 특성을 사용한 SOLID 원칙에 기반해 설계된 것이 디자인 패턴이라고 보면 된다. SOLID 원칙 단일 책임 원칙 [ SRP: Single Responsibility Principle ] 클래스 변경 이유는 오직 하나라는 것. 즉, 하나의 클래스는 하나의 책임 [ = 목적 ]만 가지며, 책임[ = 역할 ]을 분리한다는 것임. 개방 폐쇄 원칙 [ OCP: Open Closed Principle ] 엔티티의 확장은..
알고리즘: 재귀함수(5) 예제 N Queens ※ 두 가지 코드 형식을 학습해 업로드한 코드는 다름. 채스의 Queen을 생각하면 됨 말은 어떠한 대각선과 행, 열에서 절대 겹치면 안 됨 상태 공간 트리 찾는 해를 반드시 포함하고 있는 트리 이 트리는 모든 가능한 경우의 수를 놓은 것이기 때문에 반드시 노드에 찾는 해가 존재한다는 것임 즉, 해가 존재한다면 그것은 반드시 이 트리의 어떠한 노드에 해당한다는 것으로 이 트리를 체계적으로 탐색하면 해를 구할 수 있음 하지만 그렇다고 하여 모든 노드를 탐색해야 한다는 것은 아님. 만약 해의 조건을 만족하지 않는다면 해당 노드는 infeasible 하다고 체크하며, 가장 최근에 진행하였던 노드로 돌아가 다른 선택지의 노드를 체크함. 백트래킹 (Backtracking) 수행하다가 수행 방법이 잘못되었음을 확인..
알고리즘: 재귀함수(4) 예제 Counting cells in a Blob Counting cells in a Blob - 입력으로 하나의 Binary 이미지가 주어짐 - 각 픽셀은 Background pixel이거나 image pixel임 - blob : 서로 연결된 image pixel들의 집합을 blob이라고 부름 - 상하좌우, 대각방향으로도 연결된 것으로 간주함 - 색칠된 background pixel을 우리의 기준으로 잡는 것임 - 이미지상 좌표가 주어졌을 때, 그 점이 속해있는 blob의 크기를 계산하는 것임 - 만약 blob에 속하지 않을 때 0을 반환함 입력 N*M 크기의 2차원 그리드(grid)가 주어짐 하나의 좌표는 ( x, y )임 출력 픽셀 ( x, y )가 포함된 blob의 크기를 출력함 ( x, y )가 어떤 blob에도 속하지 않는 경우는 0을 반환함..
알고리즘: 너비 우선 탐색 (Breadth First Search) 너비 우선 탐색(BFS) 알고리즘 기준점에서 가장 인접한 후보부터 탐색 한 길을 깊이 확인하는 깊이 우선 탐색 (DFS)와 비교됨 최단 경로 구하기에 주로 사용됨. 목적지 발견시 바로 종료할 수 있어 DFS에 비해 빠른 경우가 많음 재귀로 시스템 스택을 사용하는 DFS에 비해 queue를 사용해 스택오버플로우 (Stack over flow)에서 비교적 자유롭고, 힙(Heap) 공간을 넓게 사용할 수 있어 넓은 탐색 범위에 유리함 탐색 초기 Queue에 시작 좌표를 넣고 다음 과정 반복 Dequeue 좌표에서 이동 가능한 모든 경로를 Enqueue 함 다시 Dequeue 좌표에서 이동 가능한 모든 경로를 Enqueue함 도착 지점에 도달할 때까지 2 ~ 3과정 반복 - 양쪽으로 번갈아가며 탐색해 나가기에 ..
알고리즘: 재귀함수 (3) 응용: 미로찾기 미로찾기 조건 - 2차원 그리드(Grid)가 주어짐 - 크기: N * N - 입구 좌표: ( 0 , 0 ) - 출구 좌표: ( n-1, n-1 ) - 미로찾기 알고리즘 해결은 다양한 알고리즘이 있음. 재귀함수가 가장 적합하다는 것 같은데..?.. -- 내용 추가 (2021.03.16 23시 35분) - 개인적으로 가장 적합한 것은 아닌 것 같음. 우선 커리큘럼상 먼저 해당 방법으로 진행된 듯한데, 스택에 담아 탐색하는 경우 모든 경우의 수를 끝까지 가서 판별하기에 속도가 느림. - 반면에 BFS의 경우 큐(Queue) 자료구조로 기준점에서 물의 파동이 퍼져나가듯이 탐색함. 즉, 기준에 인접한 것에 먼저 도달하며 탐색해 나감. 그러다보니 다각도(?)로 진행되는데, 먼저 도달한 곳이 존재한다면 그 즉시 프로..
알고리즘: 재귀함수 (2) Designing Recursion 설계 조건 적어도 하나의 Base Case가 존재해야 함. ( 종료되는 case ) 모든 case는 결국 Base Case로 수렴함. Recursion과 반복문 작성시 주목할 차이점 암시적 (implicit) 매개변수을 명시적 (explicit) 매개변수로 바꾸어라 예시 (1) 순차 탐색 [ Sequention Search ] int search(int []data, int target){ for(int i=0; i < data.length; i++){ if(data[i] == target) return i; } return -1; } 말 그대로 순차적으로 탐색하는 알고리즘으로 찾는 데이터가 어디에 위치하는지 index 번호 리턴하는 경우 만약 데이터가 정렬되어 있다면 이진검색 진행 만약 순차 검색을 위..