병합 정렬 (Merge Sort) 전체 원소를 하나의 단위로 분할한 후에 분할한 원소를 다시 병합하며 정렬해 나가는 방식입니다. ■ 정렬 방식 1. 정렬하고자 하는 데이터 집합을 반으로 나눈다. 2. 반으로 나누어진 하위 데이터의 개수가 2이상이면 1의 과정을 반복한다. 3. 같은 집합에서 나온 하위 데이터 둘을 정렬을 시도하면서 다시 병합합니다. 4. 원래의 데이터 집합이 될때까지 3의 과정을 반복합니다. - 분할과정 전체 데이터 크기(n=8)에서 반으로(n=4) 나눕니다. 이 과정에 대해서 데이터 집합의 크기가 1이 될 때까지 반복합니다. -병합과정 같은 집합에서 나온 하위 데이터집합 두개를 정렬과 동시에 병합을 시도합니다. 주목해야 할 점은 병합이 이루어진 데이터 집합에 대해서는 정렬이 이루어졌습니..
반복자 패턴 (Iterator Pattern) 접근기능과 자료구조를 분리시켜서 객체화합니다. 서로 다른 구조를 가지고 있는 저장 객체에 대해서 접근하기 위해서 interface를 통일시키고 싶을 때 사용하는 패턴입니다. 동기 for(int i=0;i ™ 1 2 3 4 5 6 7 8 public interface Aggregate { public abstract Iterator iterator(); } public interface Iterator { public abstract boolean hasNext(); public abstract Object next(); } Aggregate의 인터페이스를 구현하는 복합 클래스는 반드시 iterator 객체를 생성하는 메서드를 구현합니다. Iterator 인터..
브릿지 패턴 (Bridge Pattern) 구현부에서 추상층을 분리하여 각자 독립적으로 변형이 가능하고 확장이 가능하도록 합니다. 즉 기능과 구현에 대해서 두 개를 별도의 클래스로 구현을 합니다. ■ 브릿지 패턴의 구조 ● Abstraction : 기능 계층의 최상위 클래스. 구현 부분에 해당하는 클래스를 인스턴스를 가지고 해당 인스턴스를 통해 구현부분의 메서드를 호출합니다. ● RefindAbstraction : 기능 계층에서 새로운 부분을 확장한 클래스 ● Implementor : Abstraction의 기능을 구현하기 위한 인터페이스 정의 ● ConcreteImplementor : 실제 기능을 구현합니다. ■ 브릿지 패턴 예제 각 '동물'이라는 클래스와 이 동물 클래스가 가질 수 있는 '사냥방법'을..
프록시 패턴 (Proxy Pattern) 'proxy'는 대리인이라는 뜻입니다. 자바 코드에서 생각을 해보면 어떤 클래스의 수행을 대신 수행 하는 것으로 생각 할 수 있습니다. Proxy Pattern을 사용하는 경우는 어떤 클래스의 객체 생성이 오래 걸리는 경우 그 일을 분업을 하여 proxy 클래스에서 처리 할 수 있는 부분은 처리를 하고 proxy 클래스에서 처리 할 수 없는 작업에 대해서만 실제 클래스의 객체를 생성하고 위임하는 방식을 취합니다. ■ 프록시 패턴 구조 ● Client : proxy 패턴을 사용합니다. ● Subject : proxy와 RealSubject가 가져야 할 공통 인터페이스를 정의합니다. ● Proxy : RealSubject에 대해 대리 수행을 실행합니다. ● RealS..
퀵 정렬 (Quick Sort) 기준이 되는 원소를 기준으로 하여 기준 원소보다 작거나 같은 값을 지닌 자료는 앞으로 큰 값을 진ㄴ 자료는 뒤로 가도록 하여 기준 원소를 중심으로 분할해가며 정렬을 진행하는 방식입니다. ■ 정렬방식 1. 기준이 되는 원소를 정합니다. 배열의 시작 원소를 pivot으로 설정합니다. 2. 좌우 인덱스를 지정합니다. 해당 인덱스는 다음을 의미합니다. - left : pivot 보다 큰 값을 찾으러 다니는 index - right : pivot 보다 작은 값을 찾으러 다니는 index - left_hold : pivot을 제외하고 정렬 대상의 시작점 - right_hold : pivot을 제외하고 정렬 대상의 끝점 3. left를 pivot보다 큰 값을 찾을 때 까지 이동합니다...
버블정렬 (Bubble Sort) 두 인접한 배열요소를 차례대로 검사를 하여 정렬을 하는 방식 ■ 정렬 방식 1. 배열의 가장 앞에서 인접한 두 개의 요소에 대하여 비교를 한다. (배열의 첫 번째 요소와 두 번째 요소) 2. 배열의 다음 인접한 요소(두 번째와 세번째를 비교를 한다.) 3. 배열의 끝까지 반복을 한다. 한 사이클이 끝나면 배열의 맨 끝에는 정렬된 요소 하나가 정렬이 된 채 자리잡는다. 4. 정렬이 된 마지막 요소를 제외한 나머지에 대하여 1,2,3 번 과정을 반복한다. 정렬이 된 상태 비교 원소 5 4 3 2 1 최초 정렬이 이루어지지 않은 상태의 배열입니다. 5 4 3 2 1 첫 번째 요소와 두 번째 요소를 비교합니다. 4가 더 작으므로 둘의 위치를 교환합니다. 4 5 3 2 1 다음 ..
어댑터 패턴 (Adapter Pattern) 어댑터는 변환기로, 서로 다른 두 인터페이스 사이에 통신이 가능하게 합니다. 프로그램에서 어댑터 패턴 디자인이란 한 클래스의 인터페이스를 클라이언트에서 사용하고자 하는 인터페이스로 변환하고자 할때 사용합니다. ■ 문제 A라는 사람이 B파서를 통해 HTML 문서를 파싱하는 어플리케이션을 만들었습니다. 그러던중 B파서 말고도 다른 종류의 문서도 파싱 할 수 있는 C파서도 필요하게 되었습니다. 살펴보니 C파서와 B파서가 제공하는 인터페이스는 약간의 차이가 있습니다. 이러한 상황에 대해 Adapter Pattern을 적용하여 문제를 해결 해보겠습니다. ■ B파서만 사용하는 기존코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class..
삽입 정렬 (Insetion Sort) 자료 배열의 모든 요소를 앞에서부터 차례대로 이미 정렬된 배열 부분과 비교하여, 자신의 위치를 찾아 삽입함으로써 정렬을 완성하는 알고리즘 입니다. ■ 정렬 방식 1. 배열의 첫 번째 요소는 정렬 된 상태라고 가정한다. 2. 배열의 두 번째 요소부터 앞에 정렬된 배열을 차례대로 비교하며 교환한다. 3. 최종적으로 자신의 위치에 맞는 위치에 삽입된다. 4. 다음 배열 요소에 대해서 같은 작업을 반복한다. : 정렬이 완료 된 상태 : 비교되는 배열 요소들 5 4 3 2 1 첫 번째 배열요소는 정렬이 완료된 상태라고 가정을 합니다. 5 4 3 2 1 두 번째 요소부터 비교를 시작합니다. 앞에 정렬된 첫 번째 요소와 비교를 하고 4가 더 작으므로 둘의 위치를 바꿔줍니다. 4..
선택 정렬(Selection Sort) 기존 위치에 맞는 원소를 선택하여 교환하는 방식 ■ 정렬 방식 1. 아직 정렬이 안된 리스트 중에 가장 앞에 원소를 최소값으로 설정 2. 가장 앞에 원소를 제외한 나머지 원소를 차례로 비교하고 최소값을 찾아감 3. 리스트 끝까지 비교 후 찾은 최소값을 가장 앞에 원소와 교환 4. 정렬이 안된 원소들을 가지고 반복 ■ 특징 - 최소값을 찾기 위한 비교횟수는 많지만 교환 횟수는 적다. - 데이터의 개수가 적을 때 좋은 성능을 발휘한다. - 시간복잡도 : O(n^2) ■ 소스코드 (Source Code) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public int[] Selection_Sort(int[] data,int num..
Builder 패턴 빌더 패턴이란 복합 객체의 생성 과정과 표현 방법을 분리하여 동일한 생성 절차에서 서로 다른 표현 결과를 만들 수 있게 하는 패턴입니다. ■ 빌더 패턴(Builder Pattern) 사용 이유 Colored By Color Scripter™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 public class PersonInfo { private String name; private int age; private String email; private String number; public PersonInfo(String name,int age,String email,String number) { this.name = name; this.age = age;..
알고리즘 공부를 하면서 구현 한 소스코드를 깃허브에서 관리하고자 합니다. 깃허브에 새로운 저장소를 생성하고 이클립스에서 생성한 프로젝트를 올리는 내용을 정리하도록 하겠습니다. 1. 깃허브에 새로운 저장소 생성하기 먼저 생성 한 자바 프로젝트의 버전관리를 위한 깃허브에 원격 저장소를 새로 만듭니다. 오른쪽 하단 부분에 New repository를 클릭합니다. 저장소 이름을 입력하고 Public을 체크한 뒤 Create repository를 클릭 합니다. 여기까지 하면 새로운 저장소가 생성 됩니다. 저장소의 url은 자동으로 https://github.com/LKTProtgrammer/저장소이름으로 지정이 됩니다. 2. 이클립스 프로젝트 생성 및 PUSH 이제 로컬 저장소로 사용 할 자바 프로젝트를 생성 해..
Template Method Pattern 상위 클래스에서 처리의 흐름을 제어하며, 하위 클래스에서 처리의 내용을 구체화한다.여러 클래스에 공통되는 사항은 상위의 추상 클래스에서 구현하고, 공통 되지 않는 부분에 대한 상세 구현은 하위 클래스에서 구현한다. 예제 햄버거를 만드는 클래스를 설계 해보겠습니다. 햄버거 종류에는 치즈버거와 불고기버거가 있을 수 있습니다. 1. 빵을 올린다. 2. 패티를 올린다. 3. 양상추를 올린다. 4. 빵을 올린다. 1. 빵을 올린다. 2. 패티를 올린다. 3. 치즈를 올린다. 4. 빵을 올린다. 각 버거는 위에 나온 순서대로 만들어 집니다. 1, 2, 3번 같은 경우는 중복되는 내용입니다. 즉 1, 2, 3 번의 경우 상위 추상 메서드로 올려주고 3번 같은 경우에는 상위에..
Singleton 패턴 디자인 패턴에서 싱글톤 패턴은 특정 클래스에 대해 new 연산자로 생성되는 인스턴스를 Stack 메모리에 한 번만 할당하여 이후에 new 연산자를 통한 객체 생성 요구에 대해서는 최초에 생성되었던 객체를 반환하는 디자인 패턴입니다. 즉 프로그램의 특정 클래스에 대한 유일 객체를 보장하는 패턴이라고 볼 수 있습니다. 일반적으로 앱에서 공통적으로 사용하는 데이터 클래스에 대해서 이와 같은 싱글톤 패턴 형식으로 작성하게 됩니다. 객체 생성을 위한 new 연산자는 해당 클래스의 인스턴스를 stack 메모리에 저장하게 되는데 싱글톤 패턴이 적용된 경우에는 new 사용을 통한 무분별한 인스턴스 생성을 막기 때문에 메모리 낭비를 방지할 수 있습니다. singleton.class 1 2 3 4 ..
저번 게시글에서는 다른 사람의 저장소를 Fork 해오면서 동시에 로컬 저장소를 생성 하는 것을 정리 하였습니다. 오늘은 이어서 다음 내용을 정리합니다. 1. 로컬 Master로부터 Branch 생성하기 2. ReadMe 수정 ( 변경 이력 발생) 3. 변경 사항 Commit 하기 및 Master와 Merge하기 4. 원격 저장소에 Push 브런치 (Branch) 생성하기 일반적으로 저장소가 생성이 되면 Master Branch가 생성이 됩니다. Master Branch로 부터 새 Branch를 생성하는 git 명령어는 다음과 같습니다. git branch 현재 상태를 그림으로 보면 다음과 같다. 현재 Branch를 생성만 한 단계입니다. Head는 Master Branch에 있는 상태입니다. (Head란..
Fork 하기 다른 사람의 저장소에 있는 내용을 내 저장소로 가져와 보도록 하겠습니다. 예제를 위해 bongbongco/bongbongco.github.io의 저장소를 가져오도록 하겠습니다. 가져오고자 하는 저장소의 우측 상단에 fork 버튼을 클릭합니다. 자신의 계정을 클릭하게 되면 다음과 같이 fork 해온 새로운 저장소가 생깁니다. 현재는 다른 사람의 저장소를 내 원격 저장소를 가져오기만 한 상태입니다. 아래 그림과 같습니다. 이제 로컬 저장소도 생성해보겠습니다. git clone 을 통해서 저장소를 복사해옵니다. 이제 bongbongco/bongbongco.github.io 저장소를 내 로컬 저장소로 가져오기가 완료 되었습니다. 다음에는 로컬 저장소의 내용의 일부를 변경하고 변경사항을 Commit..