2013년 5월 10일 금요일

1장 - 자료구조와 알고리즘의 이해

지금 내가 공부하고 있는 교재는 "윤성우의 열혈 자료구조" 이다.
난 그저 복습과 요약 차원에서 글쓰는 거니깐 책을 사서 보는게 좋다.

일단 c언어가 어느정도 되는 사람이 사야할 책이다.
c언어도 잘 못하는 분이 이책을 사면 멘붕이 올 수가 있다(이건 오바인가?)

툴은 무료툴인 코드블락을 이용해서 공부 중이다.
코드블락 다운 링크 : http://www.codeblocks.org/

1. 자료구조란 무엇인가??

자료구조란?? 데이터를 표현하고 저장하는 방법에 대한 설명이다.
크게 선형 구조와 비선형 구조로 나뉜다.
선형 구조는 자료를 표현 및 저장하는 방식이 선형이다.

선형이 뭐지?! 여자이름인가? 하는 사람은 솔로 기간이 긴.....;;

선형은 선의 형태의 약자다.
선의 형태... 즉, 자료가 일렬로 저장되어 있다는 것이다.(배열 같이)

비선형 구조는 당연 선의 형태가 아닌 일렬로 저장되어 있지 않은 구조다 (너무 당연한가 ?)

2. 알고리즘이란 무엇인가?

뜬금없이 자료구조 이야기 하다가 알고리즘이 나오는 이유는 자료구조와 알고리즘은 서로 필요하기 때문이다.
자료구조가 데이터 저장방법을 설명한다면 알고리즘은 저장된 데이터를 활용하는 법이기 때문이다.
데이터가 어찌 저장되어 있느냐에 따라 알고리즘도 달라진다.

3. 알고리즘의 성능분석 방법

요즘은 빅데이터 시대이다.
데이터가 어~~~~~~~~~~~~ㅁ청 많다는 것이다.
이걸 얼마나 빠르고 정확하게 찾아내고 처리해줄수 있는지가 알고리즘의 성능인데.
보통 알고리즘 성능을 따질 때는 시간 복잡도와 공간 복잡도를 따진다.

시간 복잡도 - 속도가 얼마나 빠른가?
공간 복잡도 - 메모리를 얼마나 필요로 하는가??

물론 최고는 속도도 빠르고 메모리는 적게 먹는게 젤 좋은거지만 둘 중 고르라면
속도가 빠른 것을 선호하는 편이다.
공간 복잡도는 메모리가 워낙 싸서 한개 더 달면 된다 -_-;

고로 알고리즘의 성능 분석은 주로 시간 복잡도(속도)를 따질 것이다.

그럼 이제 어찌 속도를 평가할 수 있을까??
데이터를 죽어라 만들어서 초를 젤까??
뭐 그것도 나름 방법이긴 하다. 하지만 이왕이면 머리를 써보자.

어떤 데이터를 찾는다고 할 때 공통으로 들어가는게 뭘까??
당연 = 이다.(코드상으로는 == 이지만...)
내가 찾는 데이터가 같은게 있냐 없냐? 있다면 어디에 있냐?
이걸 최대한 빠르게 찾는게 목적아닌가??

그럼 = 횟수가 적을수록 좋은 알고리즘이라 할 수 있다.
이걸로 시간 복잡도를 계산할 것이다.
--------------------------------------------------------------------------------
1. 순차 탐색 알고리즘

그럼 가장 먼저 볼 알고리즘은 순차 탐색(Linear Search) 알고리즘이다.
순차 탐색이란 그야말로 처음부터 끝까지 쭈~~욱 비교해가며 찾는 것이다.(가장 단순하다)
인덱스 0 ~ 데이터 있는 최대 값까지 순차적으로 죽어라고 비교해서 찾는거다(단순 무식 과격)

기본적인 코드를 보자.
--------------------------------------------------------------------------------


#include <stdio.h>

int LSearch(int ar[], int len, int target)
{
int i;
for(i=0; i<len; i++)
{
if(ar[i]==target)
return i;    // 찾은 대상의 인덱스 값 반환
}
return -1;    // 찾지 못했음을 의미하는 값 반환
}

int main(void)
{
int arr[]={3, 5, 2, 4, 9};
int idx;

idx=LSearch(arr, sizeof(arr)/sizeof(int), 4);
if(idx==-1)
printf("탐색 실패 \n");
else
printf("타겟 저장 인덱스: %d \n", idx);

idx=LSearch(arr, sizeof(arr)/sizeof(int), 7);
if(idx==-1)
printf("탐색 실패 \n");
else
printf("타겟 저장 인덱스: %d \n", idx);

return 0;
}
--------------------------------------------------------------------------------
소스는 오렌지미디어에서 다운 받되
직접 실행 시켜가며 바꿔가며 해보자.
소스 받는 곳 : http://www.orentec.co.kr/jaryosil/DA_ST_1/add_form.php

소스가 어렵지 않으니 이해하는데 별 어려움은 없을 것이다.
순차 탐색은 데이터가 많아질수록 속도가 느려진다.
우연히 내가 찾는게 맨 처음에 있으면 젤 먼저 찾겠지만.
제일 뒤에 있다면 데이터 갯수만큼 비교해야하는 비극이 일어난다.
-------------------------------------------------------------------------------
2. 이진 탐색 알고리즘

이진 탐색 알고리즘은 데이터 위치를 절반씩 줄여가면서 비교하는 방식이다.
이 알고리즘의 필수 요소는 배열에 저장된 데이터가 "정렬"되어 있어야 한다는 것이다.
즉, 정렬 안되어 있는 데이터에는 아무짝에도 쓸모 없는(?) 알고리즘이다.
정렬은 오름차순이던 내림차순이던 상관은 없다.

방법은 이러하다.
1)배열 인덱스의 시작과 끝을 더한다.
2) 더한 값을 2로 나눈다.
3) 나온 값의 인덱스에 있는 데이터를 찾고자 하는 값과 비교한다.
4) 찾고자 하는 값과 기준값이 같다면 한번에 찾은것이다(오오미 지리것소)
5) 찾고자 하는 값이 기준값보다 크다면 기준 인덱스의 오른쪽 배열로 넘어간다.
5-1) 찾고자 하는 값이 작다면 기준값보다 작다면 기준 인덱스의 왼쪽 배열로 넘어간다.
6) 이 짓을 찾을 때까지 한다.(아악 반복이라니)


7) 1개 남은 것까지 비교했는데도 없으면 없는거다(아오 빡쳐)
소스를 보자.
-------------------------------------------------------------------------------

#include <stdio.h>

int BSearch(int ar[], int len, int target)
{
int first=0;   // 탐색 대상의 시작 인덱스 값
int last=len-1;   // 탐색 대상의 마지막 인덱스 값
int mid;

while(first<=last)
{
mid=(first+last)/2;   // 탐색 대상의 중앙을 찾는다.

if(target==ar[mid])   // 중앙에 저장된 것이 타겟이라면
{
return mid;
}
else    // 타겟이 아니라면
{
if(target<ar[mid])
last=mid-1;   // 뒷부분을 탐색 대상에서 제외
else
first=mid+1;   // 앞부분을 탐색 대상에서 제외
}
}
return -1;   // 찾지 못했을 때 반환되는 값 -1
}

int main(void)
{
int arr[]={1, 3, 5, 7, 9};
int idx;

idx=BSearch(arr, sizeof(arr)/sizeof(int), 7);
if(idx==-1)
printf("탐색 실패 \n");
else
printf("타겟 저장 인덱스: %d \n", idx);

idx=BSearch(arr, sizeof(arr)/sizeof(int), 4);
if(idx==-1)
printf("탐색 실패 \n");
else
printf("타겟 저장 인덱스: %d \n", idx);

return 0;
}

--------------------------------------------------------------------------------
확실히 순차탐색보다는 코드가 좀 길다(이게 길다고 하면 한강으로....는 농담)
중간에 보면 -1,+1 하는 부분이 있다.
이게 뭐하는 짓이지? 왜 빼고 더하지? 생각해 보자.
mid는 기준이 되었던 인덱스가 있는 값이다.
기준이 되었던 것이 같지 않다면(같으면 그게 범인이야!!) 어차피 한번 비교한거니깐
빼거나 더해서 그 값을 배제하고 찾는 것이다.

책에는 그림도 있어서 이해가 더 쉽고 빠르지만 내가 결코 그림그리기가 귀찮아서 이러는게
아니고 책을 사서 보라는 의도...........다.
-------------------------------------------------------------------------------
3. 순차 탐색과 이진 탐색의 알고리즘의 비교

여기서 비교 하는 것은 최악의 시간을 비교하는 것이다.(즉, 다 봤는데 찾는 데이터가 없어!!)
순차 탐색은 데이터 갯수 만큼 시간이 걸릴테니 당연 젤 느리다 -_-

이진 탐색은 윗 소스를 조금 바꿔서 카운트를 셀꺼다.(물론 나도 소스 코드를 퍼오는 것이지만....;;;;)
--------------------------------------------------------------------------------

#include <stdio.h>

int BSearch(int ar[], int len, int target)
{
int first=0;
int last=len-1;
int mid;
int opCount=0;   // 비교연산의 횟수를 기록

while(first<=last)
{
mid=(first+last)/2;

if(target==ar[mid])
{
return mid;
}
else
{
if(target<ar[mid])
last=mid-1;
else
first=mid+1;
}
opCount+=1;   // 비교연산의 횟수 1 증가
}
printf("비교연산 횟수: %d \n", opCount);  // 탐색 실패 시 연산횟수 출력
return -1;
}

int main(void)
{
int arr1[500]={0,};    // 모든 요소 0으로 초기화
int arr2[5000]={0,};    // 모든 요소 0으로 초기화
int arr3[50000]={0,};    // 모든 요소 0으로 초기화
int idx;

// 저장되지 않은 정수 1을 찾으라고 명령
idx=BSearch(arr1, sizeof(arr1)/sizeof(int), 1);
if(idx==-1)
printf("탐색 실패 \n\n");
else
printf("타겟 저장 인덱스: %d \n", idx);

// 저장되지 않은 정수 2를 찾으라고 명령
idx=BSearch(arr2, sizeof(arr2)/sizeof(int), 2);
if(idx==-1)
printf("탐색 실패 \n\n");
else
printf("타겟 저장 인덱스: %d \n", idx);

// 저장되지 않은 정수 3을 찾으라고 명령
idx=BSearch(arr3, sizeof(arr3)/sizeof(int), 3);
if(idx==-1)
printf("탐색 실패 \n\n");
else
printf("타겟 저장 인덱스: %d \n", idx);

return 0;
}
--------------------------------------------------------------------------------
모든 배열에 0밖에 없는데 다른 정수를 넣어봐야 끝까지 비교하고 찾지도 못할 것이다.

순차 탐색의 비교 연산 횟수는 위와 같은 경우면 500, 5000, 50000 번 이다.(쩔어)
이진 탐색의 바교 연산 횟수는 9, 13, 16 번이다.(오오미 나 팬티 좀 갈아 입고 올께)

하지만 데이터가 정렬되어 있어야 하는 단점이 있다.(0 밖에 없는 것도 정렬된거다 ㅡㅡ;;)

이와 같이 알고리즘과 자료구조는 잘 적용하는 문제지 뭐가 젤 좋고 젤 후진 건 없다.
이로써 1강 요약은 끝~



2013년 5월 7일 화요일

후~ 계획을 변경한다.

원래는 TCP/IP를 먼저 하려고 했으나
자료구조 공부가 더 우선 순위라는 생각에 자료구조로 변경하였다.
절대 가상머신으로 깐 우분투 13이 느려서가 아니다(어휴 컴터 좀 사야지 ㅠㅠ)
네트워크 프로그래밍은 주로 유닉스/리눅스 계열에서 하는데
파티션을 할당하기엔 지금 자료의 일부를 지우고 재할당 해야해서.......;;;
컴터 살 때 하드도 하나 추가 구입해야겠다.

어째든 자료구조도 공부해볼까 한다.
학교 다니면서 다 해본 것들이지만 복습차원에서 다시 해본다.
책은 "열혈 자료구조" 이다.

2013년 3월 27일 수요일

델파이 10장, 11장

10장 보고서 작성


즉, 결과물을 인쇄하는 것인데. 현재 내가 쓰고 있는 XE3 버전에는 Fast  Report 밖에 없다.

사용법은 매우 간단하다.

DB와 테이블을 연결하고 위치만 잡아주면 끝이다.

책이 워낙 대충 설명해놔서 실습하는데 애 먹었지만 익히는데는 금방이었다.

인쇄물 틀잡는 것만 좀 해놓으면 계속 써먹을 수 있다는 장점도 있다.

책과 내가 가지고 있는 툴이 버전이 틀린 관계로 애를 먹고 있다.

허리도 아프고, 시간도 촉박하고 델파이 공부 얼렁 끝내고 싶다 진짜 ㅡㅡ

11장 DLL 작성과 호출


DLL 은 다른 응용 프로그램에서 사용되는 코드나 자원을 포함하는 컴파일된 모듈이다.

한마디로 말하자면 공통으로 쓰는 부분을 합쳐서 공유하게 하자는 거다.

 1.DLL 사용시 장점

  • 응용프로그램의 재 컴파일 없이 DLL을 변경하거나 프로시저 및 함수를 추가 할 수 있다.
  • 여러 개의 응용프로그램에서 사용되는 DLL은 단일 복사본이 메모리에 올라가므로 응용 프로그램의 크기는 작아지고 메모리 사용량도 작아짐
  • DLL은 다른 언어간의 호환을 제공함. 
2.DLL 작성법

  1. File -> New -> Other에서 DLL(Dynamic_link Library)용 프로젝트를 선택
  2. DLL을 작성하기 위한 새로운 프로젝트를 생성
  3. 프로그램 작성
  4. DLL 생성하기 위해 Project->Build All을 실행하면 dll이 생성된다.
3. DLL 호출
DLL을 호출하는 방법은 3가지가 있다.

  • 정적으로 가져오기
프로그램 가동시 미리 라이브러리를 로드하여 해당 프로시저나 함수를 호출하는 방법으로 메모리 효율면에서는 좋지 않음

  • 동적으로 가져오기
필요한 시점에서 라이브러리를 로드하여 해당 함수나 프로시저를 호출하고 라이브러리를 해제함
메모리 사용면에서는 효과적이나 자주 사용하는 라이브러리인 경우는 정적 로딩이 효과적일수 있음

  • 지연 방식으로 가져오기
정적 로딩과 동적 로딩의 절충형으로 델파이 2010에 추가된 기능이며 라이브러리를 미리 선언해 놓지만 호출 시에 로드하고 프로그램 종요시에 해제함


4. DLL 호출 시 주의 사항

  • 정적 로딩의 경우 라이브러리와 호출하는 응용프로그램의 경로가 다른 경우, 라이브러리의 패스를 명시해야 함
  • 정적 라이브러리인 경우 하나의 라이브러리에서 여러 개의 프로시저나 함수를 사용한다고 해도 라이브러리의 이름과 함수을 쌍으로 명시해야 함
  • 프로시저나 함수 이름은 대소문자 구분을 합니다
  • 프로시저나 함수 호출 시, 특히 언어가 다른 경우 매치되는 정확한 타입을 주어야 함


2013년 3월 22일 금요일

델파이 9장

1. Exception 처리


에러처리는 사용자들에게 덜 빡치게(?) 해주는 아주 중요한 것이다.

에러가 났을 때 고객 지원 전번을 띄어주는 업체와

걍 아무런 메세지 없이 종료되는 업체는 고객들에게 많은 생각을 가지게 해줄 것이다.

델파이에서 제공해주는 기본 에러 처리 개체 종류는

입출력/힙/정수 일치/부동 소수정 일치/타입 캐스팅/
변환/하드웨어/데이터베이스/문자와 리스트

등의 에러처리를 제공해 준다.

에러처리 블록의 기본 구문이다.

try .... finally블록

try
   statement1;
   statement2;
finally
   statement3;
   statement4;
end;

  • 오류가 발생하지 않으면 모든 문장들이 순차적으로 실행
  • 오류가 발생했을 경우에는 바로 finally 부분의 코드로 이동하여 실행
  • 오류가 발생하던 하지 않던 finally 부분은 항상 실행
  • 주로 이 블록은 개체, 파일, 윈도우 자원 등을 보호하기 위해 구현
-------------------------------------------------------------------------------
try...except 블록

try
   statement1;
   statement2;
except
   On e:Exception Type1 Do
      statement3;
   On e:Exception Type2 Do
      statement4;
end;

  • 오류 발생 없이 코드가 수행될 경우에는 Except 문의 코드는 실행되지 않음
  • 오류가 발생하면 Except 부분으로 옮겨져서 수행
  • 오류 개체가 try...except 블록으로 들어와 처리되면 시스템은 더이상 오류 상황을 보지 않고 정상적으로 처리 함
  • 특정 타입의 Excpetion 개체를 검색하기 위하여 On... Do문을 사용할 수 있으며 그 개체의 인스턴스를 사용하기 위한 임의의 변수 e를 사용할 수 있음
  • Exception 개체는 이 변수를 통해 해당 개체의 속성과 메소드에 접근할 수 있음
  • On...Do문의 어떤 것도 현재 Excpetion에 적용되지 않으면 else 부분을 제공하여 실행하도록 할 수 있음. 
  • 만일 else 부분이 제공되지 않으면 계속 바깥쪽의 try 문을 계단식으로 찾아감
  • try...except 나 try...finally 블록은 블록 내에 중첩하여 사용할 수 있음

2. Raise


오류 조건을 표시하기 위해 예약어 Raise를 사용하여 일부러 에러를 유발 시킬 수 있다.
에러를 일부러 유발시키는 경우는 주로 입력 체크나 조건 체크에 사용한다.
예) 패스워드가 3회 이상 틀렸을 때.

사용법
Raise Exception.Create('입력 오류');

3. EAbort Exception


델파이에는 조용한 에러처리로 불리는 특별한 Exception 클래스가 있다.
이를 Silent Exception이 발생했다고 한다.
Exception과 방식은 동일하지만 대화 상자가 나타나지 않는다.

Raise EAbort Create('보이지 않는 메세지');


내용은 더 있는데.........
쓰기가 힘들다 ㅡㅡ;; 감기도 걸리고 허리도 아프고 ㅠㅠ
아아 오랜만에 맘먹고 공부하는데 태클이 ㅠㅠ

델파이 8장

8장은 필드 에디터 이다.

1. 필드 개체

델파이는 db 테이블의 각 필드 타입과 크기에 맞는 독립적인 하나의 필드 개체들을 자동으로 만들어 준다.
이런 필드 개체는 실행되는 동안에만 사용할 수 있지만 디자인 타임에도 필드 에디터를 이용하여 필드 개체를 만들 수 있다.
필드에 대해서 제어하는 것이 필드 에디터 이다.

하........... 델파이 버그가 너무 심하다.......

예제 소스에 있는 것을 그대로 컴파일하고 실행 시켰는데.

에러가 생기더니 마우스가 서버린다.

뭐 이런게 다 있지?? 내가 델파이를 공부하긴 하지만 정말 버그도 많고 개판이다.

진짜 취업만 아니면 때려치고 싶은 델파이다.

어쩌면 이글을 마지막으로 델파이는 않쓸지도 모르겠다....

델파이 공부 끝나면 그 때나 다시 요약해서 올리겠다.

끝~

델파이 7장

7장은 BDE를 사용한 데이터베이스 프로그래밍 이다.
분량이 꽤 길고 오류도 많고, 내가 몸상태도 영 시원찮아서 이제야 마치고 쓴다 ㅡㅡ;;
프로그램 개발 과정은 너무 기니 패스하고 요약만 하겠다

소스코드 링크가 없어졌다 ㅡ.ㅡ;;; 이건 찾으면 다시 업뎃하겠다....;;;
그나마 소스코드 다운 받아놔서 다행이넹~

이건 뭐 내용이 너무 기니 책을 보고, 그대로 따라하며 배우라고 밖에 할 수 없다 ㅡㅡ;;

간단한 프로그램을 만들어보니 DB 연결도 몹시 쉽고 (DB목록에서 선택만 하면 된다.)

쿼리문을 변수에 넣어서 처리하는 방식이다 보니

쿼리문이 바뀌면 바뀌는 쿼리문만 바꿔서 넣어서 하면 되기에 프로그램을 많이 수정할 필요가 없다.

물론 소스코드에 쿼리문을 직접 넣는 개발자는 하수다 -_-

책에는 엑셀 컴포넌트가 있지만 내가 설치한 xe3에는

엑셀관련 컴포넌트가 없어서 해보질 못해서 좀 아쉬웠다.

아주 조금이지만 DB를 이용한 프로그램을 만들어 봤다~





2013년 3월 19일 화요일

델파이 6장

데이터베이스 프로그래밍 개요.


1. 데이터베이스란?

방대한 양의 데이터 저장, 관리 및 사용을 위한 시스템,
데이터 베이스는 한개 이상의 테이블로 구성되어 있음.
테이블은 행과 열로 구성되는 2차원 구조의 집합체 입니다.
데이터베이스에서는 행을 레코드, 열을 필드라고 함.

레코드는 정보를 표현하는 기본 단위로서 관련 있는
여러 필드가 모여서 하나의 레코드를 구성함
레코드와 필드를 합친 것을 테이블이라고 하고,
이 테이블을 모아 놓은 자료가 데이터베이스

데이터 베이스는 로컬 데이터베이스/리모트 데이터베이스 2가지가 있음.
로컬 데이터베이스는 개인 또는 복수 사용자를 위한 것이고
리모트 데이터베이스는 다중 사용자를 위한 것

2. 데이터베이스에서 사용되는 용어들


  • Primary Key

한 레코드를 다른 레코드와 구별해주는 컬럼이나 필드를 기본키라고 한다.
기본키가 되기 위해서는 각 레코드에 대해 유일한 값이어야 하고 NULL 값이 아니어야 함

  • Foreign Key
다른 테이블과 연결하기 위하여 사용되는 키를 의미한다. 한 테이블에서 기본키가 되는 필드가 다른 테이블의 참조키로 사용될 수 있음.

  • 인덱스
테이블에 대한 보다 빠른 접근이나 효과적인 정렬 작업을 위해 테이블 내의 필드 값들을 기본적으로 하여 물리적으로 만들어 두는 것.
모든 기본키는 인덱스로 생성되어 있음.

  • 트랜젝션
여러개의 데이터베이스 연산들을 하나로 묶는 것을 의미하며 묶인 모든 연산들이 제대로 실행되면 데이터데이스에 변경된 내용기 기록되고(Commit), 한 연산이라도 실패하면 원래대로 돌아감(RollBack).

  • 저장프로시저
저장 프로시저는 여러분 수행될 필요가 있는 데이터베이스 연산들을 프로시저 형태로 미리 데이터베이스에 컴파일하여 저장해 두는 것, 데이터베이스에 따라 작성하는 방법이 다름

3. SQL이란?

데이터베이스의 자료를 이용하거나 데이터베이스에 테이블을 생성하고, 생성된 테이블에 데이터를 저장하기 위해 SQL을 사용함.
델파이에서는 어떠한 데이터베이스에서도 사용할 수 있는 표준 SQL을 사용함

4. 델파이와 데이터베이스 연결 유형

로컬 구조 (Single-tiered)
클라이언트/서버구조

1. BDE를 이용한 연결 
 2. ADO를 이용한 연결
 3. DBExpress를 이용한 연결
분산구조
1. BDE를 이용한 멀티-티어구조
 2. ADO를 이용한 멀티-구조

3. DBExpress를 이용한 멀티-티어구조

보면 별로 바뀐 부분이 없다 ㅡ.ㅡ;;
내일부터는 본격적으로 DB를 이용해서 프로그램을 만들어 보자~