힙 정렬 (Heap Sort) ▶힙 정렬은 힙 자료구조를 기반으로 원소들을 정렬하는 방식을 의미합니다. 힙에 대한 기본 지식은http://lktprogrammer.tistory.com/69 에서 확인 할 수 있습니다. ■ 정렬 과정 ▶ 이번 게시글에서는 최대힙을 기준으로 설명을 하겠습니다. 힙의 기본은 완전 이진 트리의 형태이면서 부모 노드가 자식 노드보다 큰 값을 가지는 힙 성질을 만족하는 트리를 의미합니다. 따라서 최상위 노드인 루트 노드는 전체 원소 중에서 항상 최대값을 가지게 됩니다. 1. 배열에 저장 된 원소들을 최대힙으로 구성 2. 루트 노드에 존재하는 값을 가지고 오고, 가장 말단에 있는 노드를 루트 노드에 위치 시킵니다. 새로 자리 잡은 루트 노드에 대하여 다시 힙 성질에 맞게끔 배열을 조..
힙 자료구조 힙 자료구조는 원소 값들 중에서 최대값과 최소값을 구하는데 효율적인 자료 구조를 의미합니다. 트리의 개념을 공부하고 싶으면 http://lktprogrammer.tistory.com/67 여기를 참조해주세요. 힙은 완전 이진 트리의 형태를 가지면서 동시에 다음과 같은 힙 성질을 만족해야 합니다. ● 부모노드가 자식노드보다 큰 경우 - 최대 힙 ● 부모노드가 자식노드보다 작은 경우 - 최소 힙 ▶ 이번 게시글에서는 최대 힙을 기준으로 설명 하겠습니다. 왼쪽 최대 힙을 보면 모두 부모 노드의 값이 자식 노드 값보다 큰 형태를 이루고 있습니다. 부모 노드 50의 경우 자식 노드 25와 40보다 크며, 부모 노드 25는 자식 노드 12와 14보다 큰 형태를 이루고 있습니다. 즉, 힙의 이러한 성질 ..
옵저버 패턴 (Observer Pattern) 옵저버 패턴은 개개체의 상태 변화를 관찰하는 관찰자들, 즉 옵저버들의 목록을 객체에 등록하여 상태 변화가 있을 때마다 메서드를 통하여 관찰 대상자가 직접 옵저버들에게 통지하여 상태를 동기화 할 수 있도록 하는 디자인 패턴을 의미합니다. ■ 옵저버 패턴 예제 ▶옵저버 패턴이 적용된 예제를 구현 해보겠습니다. ● Generator : 관찰 대상자를 나타내며, 현재 관찰 대상자에 붙어있는 Observer들을 관리합니다. 뿐만 아니라 현재 관찰 대상자의 상태 정보를 얻기 위한 메서드를 제공하며, 상태 변화시 등록되어 있는 모든 관찰자들에게 상태 변화를 통지해주는 메서드를 제공합니다. ● StringGenerator : Generator를 상속받는 실제 상태 정보를 ..
트리 (Tree) 계층적인 구조를 표현하기 위한 자료구조로 여러 노드가 한 노드를 가리킬 수 없는 구조를 의미합니다. 일반적으로 조직도, 디렉토리 구조등을 생각하면 됩니다. 스택이나 큐와 같은 선형구조가 아닌 뒤집어놓은 나무 모양 같은 계층구조를 가지며, 탐색이나 계층적 구조를 가져야 하는 데이터를 다루는데 많이 사용됩니다. 트리의 특징 ▶ 트리는 노드(A,B,C,D,E,F)와 노드들 사이를 이어주는 링크로 이루어져 있습니다. 트리의 노드가 n개라면 링크의 개수는 n-1개가 됩니다. 최상위 노드 A를 루트 노트라고 부르며 B,C를 가지노드라 하며 D,E,F와 같이 자식을 가지지 않는 최하위 노드들을 리프노드라고 부릅니다. ▶ 트리는 기본적으로 부모-자식 관계를 가집니다. A노드 입장에서는 B,C의 자식 ..
메멘토 패턴 (Memento Pattern) 메멘토 패턴은 객체의 상태 정보를 저장하고 사용자의 필요에 의하여 원하는 시점의 데이터를 복원 할 수 있는 패턴을 의미합니다. ■메멘토 패턴 예제 구조 ▶ 실제로 메멘토 패턴을 사용하여 객체 정보를 저장하고 복원하는 예제를 살펴 보겠습니다. 예제는 간단히 String형 데이터 하나와 Int형 데이터 하나에 대한 정보로 가지는 Information 객체를 구현하였습니다. ● User : 메멘토 패턴이 적용 된 Information 객체를 실제로 사용하는 사용자입니다. ● Information : 상태를 저장하고 복원 할 데이터를 가지고 있는 클래스입니다. ● Memento : 특정 시점의 Information의 상태정보를 저장하는 클래스입니다. ● CareTak..
TCP 소켓 프로그래밍 02 - 채팅 앞선 소켓 프로그래밍 포스팅에서는 Server와 Client 사이에 1:1 통신 구현에 대해서 공부 하였습니다. 하지만 이번 포스팅에서 다룰 내용은 서버가 여러명의 Client의 접속을 받고, 접속한 Client끼리 메세지를 주고 받을 수 있는 1간단한 채팅 프로그램에 대해 구현을 해볼 생각입니다. 간단한 TCP 소켓 프로그래밍에 대한 공부는 아래 포스팅을 참조해주세요. http://lktprogrammer.tistory.com/62 ■ 서버 구현 방식 ▶기본적으로 앞에서 1:1 통신 방식에서는 메인 쓰레드 영역에서 Client의 접속을 받고 동시에 데이터를 주고 받았습니다. 일 대 다 통신으로 구현되어야 하는 채팅 프로그램에서 마찬가지 방식으로 구현 될 경우 문제점..
[JAVA] 예외처리하기 예외란 프로그램 실행 시에 예쌍치 못한 일로 에러를 말합니다. 예외처리는 이러한 예외를 프로그래머가 원하는 방향으로 움직이도록 만드는 일을 말합니다. 1. try~catch~finally Colored By Color Scripter™ 1 2 3 4 5 6 7 8 try { //예외 발생 예상 지역 }catch(예외_발생_예상_클래스 객체) { //예외 발생시 처리할 내용 }finally { //예외 발생 여부와 상관없이 무조건 처리해야 할 내용 } 예외처리 구문은 총 3개의 구문으로 나누어집니다. 첫 번째 try{} 구문안에는 예외가 발생 될 것으로 예상되는 코드가 들어갑니다. 예를 들어 배열을 사용하는 경우 범위를 벗어나는 인덱스를 사용하는 경우, 정수를 0으로 나눌려는 경우..
TCP 소켓 프로그래밍 01 - 일대일 연결 이번 포스팅에서는 Socket을 활용하여 Clinet측에서 Server로 일대일 연결을 유지하면서 Client측에서 보낸 메세지를 Server측에서 수신하여 수신 받은 메세지를 다시 Client측으로 송신하는 프로그램 구현에 대해 알아보겠습니다. ■ TCP 소켓 프로그래밍 구현 과정 1. Server측에서는 ServerSocket을 생성하고 accept() 메서드를 호출함으로써 Client의 접속을 대기합니다. 2. Client측에서는 Server에 접속을 함으로써 Server와의 통신을 위한 Socket을 생성합니다. 3. 마찬가지로 Server측에서 Client 접속이 이루어지면 해당 Client와 통신 할 수 있는 Socket을 반환받습니다. 4. Cli..
데코레이터 패턴 (Decorator Patter) 중심이 되는 객체에 부가적인 기능을 동적으로 추가하고자 할 때 사용하는 패턴입니다. ■ 데코레이턴 패턴 구조 (예제) 예제는 기본 빵 객체를 대상으로 여러가지 재료를 조합하여 동적으로 햄버거를 만드는 예제입니다. ● Hamburger : 장식할 대상이 가져야 할 공통 인터페이스를 정의합니다. ● Bread : 구체적인 장식 할 대상입니다. 다른 장식 대상을 장식 할 수는 없습니다. ● Ingredient : 장식 할 대상을 장식하는 클래스로 또한 Hamburger의 인터페이스를 가지기 때문에 장식 대상이 될 수도 있습니다. 장식 할 대상의 객체를 참조합니다. ●Shrimps_Patty 와 Bulgogi_Patty : Ingredient의 인터페이스를 구현..
1. 파일의 개방과 종결 파일로부터 데이터를 입출력하기 위해서는 제일 먼저 파일을 열어야 합니다. 파일을 열겠다는 의미는 파일과 데이터를 주고 받을 수 있는 스트림을 생성한다는 의미입니다. C언어에서 파일을 열기 위한 함수로 fopen_s 함수를 제공합니다. Colored By Color Scripter™ 1 2 3 4 5 int main() { FILE* f; //파일포인터 변수 fopen_s(&f,"Test.txt","rt"); //fopen_s 함수 호출 } fopen_s 함수는 총 3개의 인자를 가집니다. 첫 번째 인자는 파일이 성공적으로 개방하면 리턴되는 파일 구조체의 포인터 값을 저장 할 변수가 옵니다. 두 번째로는 열고자 하는 파일의 경로가 오게 되고 프로젝트와 같은 위치에 존재한다면 파일 ..
원형큐 (Circular Queue) 원형 큐는 선형 큐의 문제점을 보완하기 위한 자료구조입니다. 앞선 포스팅에서 선형큐의 문제점은 rear이 가르키는 포인터가 배열의 마지막 인덱스를 가르키고 있을 때 앞쪽에서 Dequeue로 발생한 배열의 빈 공간을 활용 할 수가 없었습니다. 원형큐에서는 포인터 증가 방식이 (rear+1)%arraysize 형식으로 변환하기 때문에 배열의 첫 인덱스부터 다시 데이터의 삽입이 가능해집니다. ■ Enqueue rear의 포인터를 1증가 시키고 그 위치에 데이터 삽입이 이루어집니다. 만약 rear+1이 배열의 끝이고 포화상태가 아니라면 배열의 첫 번째 인덱스에 데이터를 삽입합니다. → 배열의 포화상태 여부를 판단하기 위하여 배열의 1칸은 비워둡니다. (rear+1)%arra..
방문자 패턴 (Visitor Pattern) 데이터 구조와 연산을 분리하여 데이터 구조의 원소들을 변경하지 않고 새로운 연산을 추가 할 수 있습니다. 새로운 연산을 추가하려면 새로운 방문자를 추가하기만 하면 됩니다. ■ 방문자 패턴 구조 (예제) 오른쪽에는 Composite 패턴으로 구현 된 File과 Directory로 이루어진 데이터 구조가 있습니다. 다만, 방문자를 수용하기 위해 Element 인터페이스를 상속받아서 accept() 메서드를 각각 구현하고 있으며 각 element의 경로를 구하는 연산 부분이 방문자에서 이루어집니다. 왼쪽에는 방문자로 데이터 구조를 방문하면서 필요한 연산을 수행합니다. 각 element에 접근하기 위한 visit메서드를 오버라이딩 및 오버로딩을 하고 있습니다. ■ 소..
■ 함수의 인자로 구조체 전달하기 함수 호출에 의한 구조체 변수의 전달은 크게 두 가지로 나누어 집니다. 하나는 값에 의한 전달 (Call-By-Value)이고 다른 하나는 주소 값에 의한 전달(Call-By-Reference)입니다. Colored By Color Scripter™ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 void show(struct Data st); //Call-By-Value void swap(struct Data* st); //Call-By-Reference struct Data { int data1; int data2; }; int main() { Data st1 = { 10,20 };..
구조체의 정의 구조체란 하나 이상의 변수를 그룹 지어서 새로운 자료형을 정의하는 것을 의미합니다. 그룹 지어진 변수는 서로 다른 자료형의 변수라도 상관없고 포인터 변수나 배열도 그룹에 속할 수 있습니다. 프로그램 내에서 만약 학생에 대한 정보 (이름, 나이, 성별)를 가지기 위해서는 3개의 변수가 필요합니다. 이 세 개의 변수는 서로 독립 된 정보를 나타내는 것이 아니라, 하나의 정보를 나타내는 변수들입니다. 즉 학생의 정보' 나타내기 위해 늘 붙어 다녀야 하는 것입니다. Colored By Color Scripter™ 1 2 3 4 5 6 struct Student //Student 구조체를 정의 { char *name; //char* 타입의 구조체 멤버 int age; //int 타입의 구조체 멤버 ..
함수 포인터에 대한 이해 예를 들어 Add와 Main 두 개의 함수로 이루어진 Test.exe 프로그램을 실행을 한다고 가정을 해보겠습니다. CPU를 통해 프로그램을 수행하기 위해서는 Add와 Main으로 구성 된 Text.exe를 하드디스크에서 가져와 메인 메모리에 위치 시켜야 합니다. 그리고 함수 포인터(함수의 이름)는 메인 메모리에 위치 한 Add나 Main을 가르키고 있는 포인터가 됩니다. ■ 함수 포인터 타입 함수의 포인터 타입을 결정짓는 요소는 리턴형과 전달인자입니다. C 1 2 3 4 5 6 7 8 9 10 11 int fct1(int num1) // 반환형이 int형이며 전달 인자 int형 변수 하나 { num1++; return num1; } double fct2(double num1, ..