전체적인 진행과정은 아래와 같이 진행됩니다.

1. 자바개발환경(JDK) 설치하기
2. 안드로이드 SDK 다운로드하기(이클립스 포함)
3. 이클립스 실행하기

로 진행되겠습니다.

 

1. 자바개발환경(JDK) 설치하기

JDK는 이미 설치되어 있을 수 있습니다. 이에 따라 먼저 설치여부 및 버전을 확인합니다.
설치가 안되어 있다면 아래 그림 1과 같이 나타납니다.

진행 : 실행 → cmd  → java -version


그림 1. JDK가 설치 안되어있을 경우 메시지

설치가 안되어 있다면 아래의 링크로 이동하여 다운로드 받습니다.

http://www.oracle.com/technetwork/java/javase/downloads/index.html

 

Accept License Agreement를 클릭 해주셔야 합니다. 다음으로 자신의 운영체제에 맞는 버전을 다운로드 받으시기 바랍니다. 다운로드 속도는 500KB ~ 1MB 정도의 속도가 나옵니다. 2분가량 걸립니다.

다운로드가 모두 완료되었다면 설치를 진행합니다.

설치 완료 후 cmd창에서 java -version을 입력하면 버전이 나오게 됩니다. 

 

2. 안드로이드 SDK 다운로드하기(이클립스 포함)

안드로이드 SDK는 아래의 위치에서 다운로드 받을 수 있습니다.

http://developer.android.com/sdk/index.html

체크박스 체크하고 운영체제 bit 맞춰누르면 다운로드버튼이 활성화 됩니다. 대략 430MB로 300KB~500KB정도의 속도입니다. 20분 가량 걸렸네요.

다운로드 받은 파일은 zip 압축파일로 압축은 원하는 위치에 해제해 주시면 됩니다.
폴더 2개와 실행파일 1개가 있습니다.

 

3. 이클립스 실행하기

안드로이드 SDK를 압축해제하면 그 안에 이클립스가 포함되어 있습니다. eclipse폴더안의 eclipse.exe를 실행시켜 줍니다.


workspace는 프로젝트가 저장되는 경로로 원하는 경로를 지정해줍니다. 이어서 OK버튼을 클릭합니다.


구글에 통계자료 협력에 관한 내용입니다. Yes / No 개인 취향대로 선택 후 Finish를 해주세요.

 

다음은 디바이스 설정입니다. 앞으로의 설명은 가상장치로 진행하기에 가상장치 설정을 하겠습니다.

이클립스 → Window → Android Virtual Device Manager 로 이동합니다.

New를 선택합니다.

원하는 기기명, 기기, OS, RAM을 선택해주고 OK버튼을 클릭합니다. 

 

여기까지가 안드로이드 개발환경 구축하기 였습니다.

다음은 가상기기에서 Hello world를 출력해보겠습니다.

 

 

 

 

Windows 7 설치 중 Administrator 계정을 쓰겠다고 설치 과정 마지막에 사용자 이름 등록 부분을 넘길 경우가 있습니다.

이렇게 되면 사용자 이름이 "Windows 사용자" 가 되버리는데...

마음에 안들면 설치 후 변경하면 됩니다.

아래처럼 따라하시면 됩니다.

1. 시작 -> regedit 실행
2. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion 까지 이동
3. RegisteredOwner를 변경(사용자이름)
4. RegisteredOrganization을 변경(회사이름)


5. 스크린샷과 같이 저는 사용자이름에 Astinlen, 회사이름에 Home를 했습니다.
6. regedit 닫기

그런데 다른 프로그램들 잔뜩 설치하고 바꿔봐야 다른 소프트웨어에서 뜨는 사용자이름은 안바뀝니다.
바꿀려면 "Windows 사용자" 를 검색해서 일일이 바꿔줘야하는데.. 큰 추천은 안합니다.

RamDisk 관련하여 환경 변수 TEMP와 TMP의 경로를 변경 후 발생한 것입니다.

관련 에러 메시지는

---------------------------------------------------------------------------------------------

오류 1 "GenerateResource" 작업에서 예기치 않은 오류가 발생했습니다.
System.TypeInitializationException: 'Microsoft.Build.Utilities.FileTracker'의 형식 이니셜라이저에서 예외를 Throw했습니다. ---> System.NullReferenceException: 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.
   위치: Microsoft.Build.Utilities.FileTracker..cctor()
   --- 내부 예외 스택 추적의 끝 ---
   위치: Microsoft.Build.Utilities.FileTracker.EnsureFileTrackerOnPath(String rootPath)
   위치: Microsoft.Build.Tasks.GenerateResource.Execute()
   위치: Microsoft.Build.BackEnd.TaskExecutionHost.Microsoft.Build.BackEnd.ITaskExecutionHost.Execute()
   위치: Microsoft.Build.BackEnd.TaskBuilder.ExecuteInstantiatedTask(ITaskExecutionHost taskExecutionHost, TaskLoggingContext taskLoggingContext, TaskHost taskHost, ItemBucket bucket, TaskExecutionMode howToExecuteTask, Boolean& taskResult) Test

---------------------------------------------------------------------------------------------

라고 나타납니다.

처음엔 뭔 소린가 했는데 구글링을 하다보니 나오네요...
관련 : http://stackoverflow.com/questions/3221565/microsoft-build-utilities-filetracker-threw-an-exception-error-happens-with-diff

아래처럼 따라하시면 됩니다.

0. RamDisk 또는 기타 사유로 환경 변수의 TEMP, TMP의 값을 변경했었을시 이 작업을 진행하세요.
1. 탐색기를 이용하여 %USERPROFILE%\AppData\Local\ 로 이동을 합니다.
2. Temp 폴더 삭제
3. 실행 -> cmd 실행시킨 후 아래 2줄을 입력합니다.
   cd %USERPROFILE%\AppData\Local\
   mklink /j TEMP "Z:\TEMP"
4. 탐색기를 이용하여 %systemroot% 로 이동을 합니다.
5. Temp 폴더 삭제
6. 실행 -> cmd 실행시킨 후 아래 2줄을 입력합니다.
   cd %USERPROFILE%\AppData\Local\
   mklink /j TEMP "Z:\TEMP"
7. 기존의 변경된 환경 변수의 TEMP, TMP의 값을 원상복귀합니다.
   TEMP, TMP 기본값 보기 : http://astinlen.tistory.com/11

추가적으로 RamDisk에서 부팅시바다 자동으로 TEMP 폴더가 생성되지 않는 RamDisk라면 Z:\TEMP를 Z:\로 하셔도 됩니다.

궁금한 점은 댓글로...

Windows XP

사용자 변수
 - TEMP : %USERPROFILE%\Local Settings\Temp
 - TMP : %USERPROFILE%\Local Settings\Temp

시스템 변수
- TEMP : %SystemRoot%\TEMP
- TMP : %SystemRoot%\TEMP

Windows Vista, Windows 7

제어판 -> 고급 시스템 설정 -> 환경 변수 에서...

사용자 변수
 - TEMP : %USERPROFILE%\AppData\Local\Temp
 - TMP : %USERPROFILE%\AppData\Local\Temp

시스템 변수
- TEMP : %SystemRoot%\TEMP
- TMP : %SystemRoot%\TEMP

제목 그대로 해보도록 하겠습니다.

기본적으로 윈도우 폼 1개를 생성하여 버튼 클릭시 MS Access 파일을 생성토록 하는 것이 최종 목표 입니다. 저는 DBConnection이라는 프로젝트명으로 생성했습니다.

아래와 같이 폼디자인을 설계했습니다. 컨트롤은 TextBox 1개(tbFilePath), Button 1개(btCreateDB), 그리고 보이지는 않지만 SaveFileDialog(sfdCreateDB)로 이루어져있습니다.


현재 우리가 목표로 하는 기능은 [DB생성]이라는 버튼을 눌렀을 때 원하는 위치에 MS Access에서 정상적으로 인식하는 mdb파일를 생성하는 것이 목표가 되겠습니다.

차후엔 생성된 이 mdb파일을 이용해서 무엇인가 작업을 할 수 있겠죠?


우리는 ADOX를 이용하여 하기때문에 먼저 참조를 추가해줘야 합니다.

Microsoft ADO Ext. 2.8 for DDL and Security 를 추가해 줍니다. 없으신 분들은 마이크로스프트 사이트에서 MDAC 2.8를 다운받으시면 되겠습니다.

다음으로는 데이터베이스에 접속하고 컨트롤할 클래스 하나 만들어보겠습니다. 폼 클래스에서 바로 해도 되지만... 별도로 빼두는 것이 다른 폼에서 이용하기 쉽게 할 수 있기 때문에 나중을 위해 빼두겠습니다.

클래스명은 cDBControl입니다.

// 네임스페이스를 추가
using ADOX;
using System.IO;

cDBControl 클래스 안에는 아래와 같은 내용을 넣어줍니다.
		private string strFilePath = "";
		private string strDBConnection = "";

		public cDBControl(string strPath)
		{
			// 파일의 경로를 저장
			this.strFilePath = strPath;
			// DB에 연결하기위한 명령줄 생성
			this.strDBConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + strPath + ";";
			// 데이터베이스에 암호를 설정하고 싶다면 아래내용을 strDBConnection에 추가하면된다.
			// 예시)
			// this.strDBConnection += "Jet OLEDB:Database Password=1234";
		}

		public void funcAccessCreate()
		{
			try
			{
				FileInfo fiStaticDB = new FileInfo(this.strFilePath);
				if (!fiStaticDB.Exists)	// 파일의 유무를 확인, 없으면
				{
					// 생성
					funcCreate();
				}
				else	// 있으면
				{
					// 기존 파일을 제거
					fiStaticDB.Delete();
					// 생성
					funcCreate();
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
		}

		private void funcCreate()
		{
			try
			{
				// MDB파일을 동적으로 생성
				ADOX.CatalogClass adoxCC = new ADOX.CatalogClass();
				adoxCC.Create(strDBConnection);

				// 연결을 끊기위해 null을 할당.
				adoxCC.ActiveConnection = null;
				adoxCC = null;

				// 연결을 끊었다고 adoxCC = null을 해줘도 가비지컬렉션이 작동안하면,
				// 프로그램 실행 중에는 언제될지 모른다. 수동으로 가비지컬렉션 작동
				GC.Collect();
			}
			catch (Exception ex)
			{
				throw new Exception("데이터베이스를 생성 중 에러 발생.", ex);
			}
		}

 

그리고 혹시 특이사항으로...
cAccessCarete 메소드의 CatalogClass 부분에서 에러가 발생할 경우 아래처럼 해결해주시면 되겠습니다.


3번박스의 ADOX를 클릭 후 4번박스의 True를 False로 변경하시면 되겠습니다.

완성된 cDBControl.cs는 그대로 두고 다시 첫 메인 폼으로 이동해서 버튼 클릭시 발생하는 이벤트메소드를 생성해줍니다.

        private void btCreateDB_Click(object sender, EventArgs e)
        {
			// SaveFileDialog에서 예를 누를 경우
            if (sfdCreateDB.ShowDialog() == DialogResult.OK)
            {
				string strFilePath = sfdCreateDB.FileName;
                cDBControl cdbc = new cDBControl(strFilePath);	// DBControl 클래스 생성
				cdbc.funcAccessCreate();	// Access DB를 생성
                tbFilePath.Text = strFilePath;	// 화면상의 텍스트박스에 경로를 보여줌
            }
        }

 

아차차..

그리고 SaveFileDialog 컨트롤을 선택해서 Filter부분에

MS Access 파일|*.mdb
을 넣어주세요


이제 컴파일 하여 실행시켜보세요.

그리고 버튼을 클릭하면 SaveFileDialog가 뜨면서.. 파일이름을 정해주고

저장버튼을 누르면 저장된 파일의 경로가 TextBox에 뜨면서...


아래와 같이 저장되어있음을 알 수 있습니다.
(여기서는 abc라는 이름을 사용했습니다.)
(위의 Filter를 설정해줘야 자동으로 mdb로 저장됩니다.)


여기까지 입니다.

Bubble Sort


  • 버블 정렬의 원리
 버블 정렬(bubble sort)은 인접한 2개의 레코드를 비교하여 크기가 순서대로 되어 있지 않으면 서로 교환하는 비교-교환 과정을 리스트의 왼쪽 긑에서 시작하여 오른쪽 끝가지 진행한다. 이러한 리스트의 비교-교환 과정(스캔)이 한번 완료되면 가장 큰 레코드가 리스트의 오른쪽 끝으로 이동된다. 이러한 레코드의 이동 과정이 마치 물 속에서 거품(bubble)이 보글보글 떠오르는 것과 유사하여 버블정렬이라 부른다. 이러한 비교-교환 과정은 전체 숫자가 전부 정렬될 대까지 계속된다.

 정렬이 안 된 오른쪽 리스트를 한번 스캔하면 오른쪽 리스트의 오른쪽 끝에 가장 큰 레코드가 위치하게 되고, 오른쪽 리스트는 추가된 레코드를 포함하여 정렬된 상태가 된다. 이러한 스캔 과정을 정렬이 안된 왼쪽 리스트에서 반복하여 적용하면 정렬이 완료된다.

첫 번째 정렬 과정

 위 그림은 버블 정렬의 한번의 정렬 과정을 그림으로 표현한 것이다. 먼저 5와 3을 비교하면 5가 더 크므로 서로 교환하고, 다음으로 5와 8을 비교하게 되면 8이 더 크므로 교환 없이 다음 단계로 진행한다. 이러한 과정이 반복되면 8이 가장 리스트의 오른쪽 끝으로 이동하게 된다. 이미 자기 위치에 자리 잡은 8을 제외한 나머지 왼쪽 리스트를 대상으로 이 과정을 반복한다.
 한 번의 반복 과정에 의해 가장 큰 레코드가 리스트의 오른쪽 끝으로 이동하게 된다. 이러한 반복 과정이 왼쪽 리스트가 정렬이 완료될 때까지 수행되며 전체 리스트가 정렬되는 과정은 아래 그림과 같다.

버블 정렬 과정


  • 버블 정렬의 알고리즘

버블 정렬의 알고리즘

 버블 정렬의 알고리즘은 그야 말로 간단하다. 먼저 하나의 스캔은 j = 0 부터 j = i - 1 까지 반복하는 루프로 구성되고 j 번째 요소와 j + 1 번째 요소를 비교하여 크기순으로 되어 있지 않으면 교환한다. i 는 하나의 스캔이 끝날 때마다 1씩 감소한다. 이런 스캔 과정이 n - 1 번 되풀이되면 정렬이 끝나게 된다.


  • 버블 정렬의 C언어 구현
버블 정렬 프로그램


  • 버블 정렬의 복잡도 분석
 버블 정렬의 비교 횟수와 이동 횟수를 계산하여 보면, 버블 정렬의 비교 횟수는 최상, 평균, 최악의 어떠한 경우에도 항상 일정하고 다음과 같다.

버블 정렬의 비교 횟수

 다음은 이동 횟수인데 최악의 이동 횟수는 입력 자료가 역순으로 정렬되어 있는 경우에 발생하고 그 횟수는 비교 연산의 횟수에 3을 곱한 값이다. 왜냐하면 하나의 SWAP함수(또는 매크로)가 3개의 이동을 포함하고 있기 때문이다. 최상의 경우는 입력 자료가 이미 정렬이 되어 있는 경우이다. 이런 경우에는 자료 이동이 한번도 발생하지 않는다. 평균적인 경우에는 자료이동이 0번에서 i번까지 같은 확률로 일어날 것이다. 따라서 이를 기반으로 계산하여 보면
의 알고리즘임을 알 수 있다.

 버블 정렬의 가장 큰 문제점은 순서에 맞지 않은 요소를 인접한 요소와 교환한다는 것이다. 하나의 요소가 가장 왼쪽에서 가장 오른쪽으로 이동하기 위해서는 배열에서 모든 다른 요소들과 교환되어야 한다. 특히 특정 요소가 최종 정렬 위치에 이미 있는 경우라도 교환되는 일이 일어난다. 일반적으로 자료의 교환(swap)작업이 자료의 이동(move)작업보다 더 복잡하기 때문에 버블 정렬은 그 단순성에도 불구하고 거의 쓰이지 않고 있다.

1. 컴파일

 프로그램 언어는 3개의 일반적인 방법에 의해서 구현될 수 있다. 한 극단적인 방법으로 프로그램은 컴퓨터에서 직접 실행될 수 있는 기계 언어로 번역될 수 있다. 이것을 컴파일러(Compiler) 구현이라 한다. 이 방법은 일단 번역 과정이 완료되면, 매우 빠르게 프로그램을 실행시킬 수 있다는 장점을 갖는다. C, COBOL, Ada와 같은 언어의 대부분 구현은 컴파일러에 의해서 이루어진다.

 컴파일러가 번역하는 언어를 원시 언어(source language)라고 한다. 컴파일 과정은 여러 단계로 이루어지는데, 이들 중 가장 중요한 단계들이 그림 1에 보여진다.

컴파일 과정


 어휘 분석기(lexical unit)는 원시 프로그램의 문자들을 어휘 단위로 모은다. 프로그램의 어휘 단위는 식별자, 특수어, 연산자, 구분자(punctuation)기호 등이다. 컴파일러에서 주석(comment)은 아무 소용이 없기 때문에, 어휘 분석기는 원시 프로그램에 포함된 주석을 무시한다.

 구문 분석기(syntax analyzer)는 어휘 분석기로부터 어휘 단위들을 가져오고, 이들을 사용하여 파스 트리(parse tree)라 불리는 계층적 구조를 생성한다. 이러한 파스 트리는 프로그램의 구문 구조를 표현한다. 대부분의 경우에 파스 트리 구조가 실제적으로 구성되지는 않고, 이 트리를 생성하는 데 필요한 정보가 생성되고 사용된다.

 중간 코드 생성기(intermediate code generator)는 다른 언어로 표현된 프로그램을 생성하는데, 이 프로그램은 원시 프로그램과 컴파일러의 최종 출력 프로그램(기계어 프로그램)의 중간 수준에 위치한다. 중간 언어는 때때로 어셈블리어와 매우 유사하며, 어떤 경우에는 실제로 어셈블리어이다. 다른 경우에 중간 코드는 어셈블리어 보다 약간 높은 수준에 있다. 의미 분석기(semantic analyzer)는 중간 코드 생성기의 필수적인 부분이다. 의미 분석기는 구문 분석 시에 탐지하는 것이 불가능한 것은 아닐지라도 타입 오류와 같은 어려운 오류를 검사한다.

 프로그램의 크기를 줄이거나 실행 속도를 보다 빠르게(또는 둘 다) 함으로써 프로그램을 향상시키는 최적화(optimization)는 보통 컴파일의 선택 사항이다. 사실, 어떠한 중요한 최적화도 수행할 수 없는 컴파일러도 있다. 이런 유형의 컴파일러는 번역된 프로그램의 실행 속도가 컴파일 속도보다 크게 중요하지 않은 상황에서 사용될 것이다. 이러한 상황의 예는 초급 프로그래머를 위한 컴퓨터 실습실이다. 대부분의 상업과 산업 현장에서는 실행 속도가 컴파일 속도보다 중요하고, 따라서 최적화를 일상적으로 수행하는 것이 보통 바람직하다. 많은 유형의 최적화가 기계 언어에서 수행하는 것이 어렵기 때문에, 대부분의 최적화는 중간 코드에서 이루어진다.

 코드 생성기(code generator)는 프로그램의 최적화된 중간 코드를 동등한 기계 언어 프로그램으로 변환한다.

 심볼 테이블은 컴파일 과정에서 데이터베이스로서 사용된다. 심볼 테이블의 주요 내용은 프로그램에서 사용자가 정의한 각 이름에 대한 타입과 속성 정보이다. 이러한 정보는 어휘 분석기와 구문 분석기에 의해서 심볼 테이블에 저장되고, 의미 분석기와 코드 생성기에 의해서 사용된다.

 위에서 설명하였듯이, 컴파일러가 생성한 기계 언어가 직접 하드웨어에서 실행 될 수 있을지라도, 기계 코드는 거의 항상 다른 코드와 함께 실행되어야 한다. 또한, 대부분의 사용자 프로그램은 운영체제로부터 프로그램을 요구한다. 이러한 프로그램 중에서 가장 일반적인 것은 입력과 출력을 위한 프로그램이다. 컴파일러는 사용자 프로그램에서 요구할 때 필요한 시스템 프로그램에 대한 호출을 생성한다. 컴파일러가 생성한 기계 언어 프로그램이 실행될 수 있기 전에, 요구된 시스템 프로그램이 운영체제로부터 찾아져서 사용자 프로그램에 연결되어야 한다. 링킹 연산(linking operation)은 사용자 프로그램에서 요구한 시스템 프로그램의 호출 위치에 그 시스템 프로그램의 시작 주소를 저장함으로써 사용자 프로그램을 시스템 프로그램에 연결한다. 사용자 코드와 시스템 코드는 함께 적재 모듈(load module), 또는 실행 가능 이미지(executable image) 불린다. 시스템 프로그램들을 수집하고 이들을 사용자 프로그램에 연결하는 과정을 링킹(linking)과 적재(loading)라고 부르며, 또는 때때로 단지 링킹이라고 부른다. 이 과정은 링커(linker)라고 부르는 시스템 프로그램에 의해서 수행된다.

 시스템 프로그램 외에도 사용자 프로그램은 보통 라이브러리에 존재하는 이미 컴파일된 다른 사용자 프로그램에 링킹되어야 한다. 따라서 링커는 주어진 프로그램을 시스템 프로그램에 링킹할 뿐만 아니라, 다른 사용자 프로그램에도 링킹할 수 있다.

 폰 노이만 구조 컴퓨터에서 기계 코드 프로그램의 실행은 인출-실행 사이클(fetch-execution cycle)이라 불리는 과정으로 이루어진다. 프로그램은 기억장소에 저장되어 있지만 CPU에서 실행된다. 실행될 각 명령어는 기억장소에서 프로세서로 옮겨져야 한다. 다음에 실행할 명령어의 주소는 프로그램 계수기(program counter)라 불리는 레지스터에 유지되어 있다. 인출-실행 사이클은 다음 알고리즘으로 간단히 기술될 수 있다.

          프로그램 계수기를 초기화한다.
          repeat forever
                    프로그램 계수기가 가리키는 명령어를 인출한다.
                    다음 명령어를 가리키기 위해 프로그램 계수기를 증가시킨다.
                    명령어를 해석한다.
                    명령어를 실행한다.
          end repeat

 위 과정의 명령어 해석 단계에서는 명령어에 어떤 연산이 명세되어 있는지를 결정하기 위해서 명령어를 조사한다. 실제 컴퓨터에서 stop 명령어가 거의 실행되지 않을지라도, 프로그램 실행은 stop 명령어를 만나면 종료된다. 제어는 사용자 프로그램을 실행시키기 위해서 운영체제로부터 그 사용자 프로그램에 전달되고, 사용자 프로그램의 실행이 완료되면 다시 운영체제로 전달된다. 주어진 시간에 한 개 이상의 사용자 프로그램이 기억장소에 존재할 수 있는 컴퓨터 시스템에서 이러한 과정은 훨씬 더 복잡해진다.

 명령어는 보통 실행을 위해서 프로세서에 옮기는 데 걸리는 시간보다 더 빠르게 실행될 수 있기 때문에 컴퓨터의 기억장소와 프로세서를 연결하는 속도는 보통 컴퓨터의 속도를 결정한다. 이러한 연결을 폰 노이만 병목(von Neumann bottleneck)이라 한다. 이것은 폰 노이만 구조 컴퓨터의 속도를 제한하는 주요 요소이다. 폰 노이만 병목은 병렬 컴퓨터의 연구와 개발을 위한 주요 동기중의 하나였다.

2. 순수 해석

 순수 해석(pure interpretation)은 구현 방법의 스텍트럼 상에서(컴파일과는 다른) 정반대의 위치에 속한다. 이 방법을 사용하여 프로그램은 어떠한 번역 과정 없이 인터프리터(interpreter)라 불리는 다른 프로그램에 의해서 해석(interpret)될 수 있다. 인터프리터 프로그램은 인출-실행 사이클이 기계 명령어가 아닌 고급 언어 프로그램을 다루는 기계의 소프트웨어 모의실험(simulation)으로서 동작한다. 이러한 소프트웨어 모의실험은 확실히 그 언어에 대한 가상 기계를 제공한다.

 순수 해석은 많은 원시 프로그램 수준의 디버깅 연산을 쉽게 구현할 수 있는 장점을 가진다. 이것은 모든 실행 시간 오류 메시지가 원시 수준 단위를 참조할 수 있기 때문이다. 예를 들면, 배열 인덱스가 범위를 벗어낫다는 것이 발견되면, 어류메시지는 원시 프로그램의 행과 배열 이름을 쉽게 나타낼 수 있다. 반면에, 이러한 방법은 실행 시간이 컴파일된 시스템의 경우보다 10배 내지 100배 정도 느리다는 심각한 단점을 갖는다. 이렇게 실행 속도가 느린 주요 요인은 기계 언어 명령어보다 훨씬 더 복잡한 고급 언어 문장을 해석한다는 데 있다(동일한 의미를 갖는 기계 코드의 명령어보다 문장수가 더 적을지라도). 더욱이, 문장이 반복 실행되는 회수와는 무관하게, 그 문장은 매번 해석되어야 한다. 그러므로 프로세서와 기억장소간의 연결보다는 문장 해석이 순수 인터프리터의 병목이다.

 순수 인터프리터의 다른 단점은 보통 더 많은 기억공간을 요구한다는 데 있다. 원시 프로그램 외에도 심볼 테이블이 해석하는 동안에 존재해야 한다. 더욱이, 원시 프로그램은 최소의 크기로 제공된 형태보다는 접근과 수정이 용이하도록 설계된 형태로 저장될 수 있다.

 1960년대의 단순한 초기 언어(APL, SNOBOL, LISP)들이 순수 해석으로 구현되었지만, 1980년대에는 이 방법이 고급 언어에 대해서 거의 사용되지 않았다. 그러나 최근에 순수 해석이 현재 널리 사용되고 있는 JavaScript와 PHP와 같은 웹 스크립트 언어에 의해서 다시 사용되고 있다.

 순수 인터프리터의 과정이 그림 2에서 보여진다.

순수 인터프리터의 과정


3. 혼합형 구현 시스템

 어떤 언어 구현 시스템은 컴파일러와 순수 인터프리터의 절충 형태이다. 즉, 이 시스템은 고급 언어 프로그램을 쉽게 해석하기 위해 설계된 중간 언어로 변역한다. 이 방법은 원시 언어 문장이 단지 한번만 해석되기 때문에 순수 해석보다 더 빠르다. 이러한 구현을 혼합형 구현 시스템(hybrid implementation system)이라 한다.

 혼합형 구현 시스템에서 사용된 처리 과정이 그림 3에 보여진다. 중간 언어 코드를 기계 코드로 번역하는 대신에 혼합형 구현 시스템은 그 중간 코드를 단순히 해석한다.

혼합형 구현 시스템의 과정

 Perl은 혼합형 시스템으로 구현되었다. 이 언어는 순수 해석 언어 sh와 awk로부터 발전되었으나, 해석 단계 전에 오류를 탐지하고 인터프리터를 단순하게 하기위해 부분적으로 번역된다.

 Java의 초기 구현은 모두 혼합 형태였다. 바이트 코드라 불리는 그 중간 코드 형태는 바이트 코드 인터프리터와 관련된 실행 시간 시스템을 가지고 있는 기계에 이식성을 제공한다. 이러한 바이트 코드 인터프리터와 관련된 실행 시간 시스템을 함께 Java 가상 기계(Java Virtual Machine)라 한다. 현재는 더 빠른실행을 위해서 Java 바이트 코드를 기계 코드로 번역하는 시스템이 존재한다. 그러나 Java애플릿(applet)은 항상 웹서버로부터 바이트 코드의 형태로 다운로드(download) 된다.

 때때로 구현자는 한 언어에 대해서 컴파일 구현과 인터프리터 구현 모두를 제공할 수 있다. 이러한 경우에 인터프리터는 프로그램을 개발하고 디버깅하는데 사용된다. 다음에, (상대적으로) 버그가 없는 상태에 이르면, 프로그램은 실행 속도를 향상시키기 위해서 컴파일 된다.

C Programming 시작하기 1 - 소개

Computer Language/C 2007. 8. 28. 23:40 Posted by AstinLen

1. C는?

 벨 연구소에서 1971년경부터 리치(D.M.Ritchie) 등에 의해서 설계 개발된 시스템 기술용의 프로그래밍 언어입니다. UNIX 오퍼레이팅 시스템의 기술에 사용할 것을 목적으로 설계한 언어로 UNIX OS의 대부분이 이 언어로 개발되었습니다. 컴퓨터의 구조에 밀착한 기초 기술이 가능한 것과 간결한 표기가 될 수 있는 것 등을 특징으로 하고 있습니다.

 시스템 기술용 언어의 경우에는 기억장치의 주소(address) 등과 같은 하드웨어 자원까지 기술의 대상으로 할 것을 요구하고 있는데, C 언어에서는 이러한 수준의 개념을 데이터 형이나 함수 등의 고수준 언어의 개념에 잘 대응하고 있습니다. 따라서 언어의 성격상 일반적인 범용의 언어와 거의 다를 바가 없습니다. 프로그램을 다른 종류의 컴퓨터에 이식하는 것도 용이하며, 범용 언어이기는 하지만 강력하고 고수준의 언어로 하는 것을 목표로 하고 있지 않습니다.

 C 언어는 프로그램 오류를 쉽게 발견하기 위한 기능은 부족하지만, 고수준 언어에서 자주 볼 수 있는 기술상의 제약이 적기 때문에 오히려 프로그래밍하기 쉬운 편리한 언어로 평가되며, 프로그램을 간결하게 쓰기 위하여 많은 연구를 한 언어입니다.

 C 언어의 기본 특징은 ASCII코드 체계로 영문 소문자 집합을 바탕으로 하고 있으며, 함수(function)의 정의문들의 집합으로 구성되어 있고, 분할 컴파일을 할 수 있어 함수 정의부 밖의 외부 변수를 정의함으로써 컴파일 단위가 다른 함수의 외부 변수를 참조할 수 있게 되어 있습니다. 또한 프로그램의 함수 기능에는 FORTRAN의 SUBROUTINE 기능과 FUNCTION 기능을 가지고 있으며, 함수 호출시 매개변수의 값만 넘겨주는 호출 방식을 따르고 있고, 자료의 주소를 자유롭게 조작할 수 있는 점들입니다.


2. C의 특징

  • 이식성
     C 언어는 다른 프로그램 언어보다 높은 호환성을 가지고 있고 C언어의 표준함수로만 작성된 프로그램은 어떤 기종의 컴퓨터에서도 정상적으로 컴파일 되고 실행될 수 있습니다. 예를 들면 소형 컴퓨터에서 작성된 프로그램이 대형 컴퓨터에서도 완벽하게 사용될 수 있는 것 입니다.

  • 다양성
     C 언어는 과학 계산용 프로그램뿐만 아니라 FA(공장 자동화), OA(사무 자동화), GUI(Graphics User Interface), 시스템 프로그램(system pr ogram), 응용 프로그램(application program) 등과 같이 컴퓨터의 모든 분야에서 사용할 수 있도록 설계된 효율적인 프로그램 언어입니다.

  • 유연성
     C 언어의 가장 큰 특징중의 하나는 소프트웨어의 부품화를 실현 할 수 있다는 것입니다. 소프트웨어의 부품화란 새로운 프로그램을 개발하기 위해 이미 작성된 프로그램 모듈들을 그대로 사용하는 곳을 의미합니다.
     C 언어를 부품과 같이 사용할 수 있는 대표적인 응용 소프트웨어로는 클리퍼, 폭스프로, 윈도우, 오토캐드 등이 있습니다. 또 다른 의미로는 기계어(어셈블리)에 준하면서 고급프로그래밍 언어로 집적된 표현을 할 수 있다는 것입니다.
     즉 저급 언어이면서 고급 언어의 성격을 가진 것을 말합니다.

  • 혼합성
     C 언어는 다른 프로그램 언어와 함께 혼합되어 사용될 수 있으며, 혼합 프로그램을 개발하는 프로그램의 혼합성을 극대화시키기는데 사용됩니다.
     C 언어와 함께 가장 많이 사용되는 프로그램 언어는 어셈블리이며 패키지 언어에는 클리퍼 등이 있습니다.

  • UNIX 시스템
     C 언어와 UNIX가 거의 동시에 개발되었으며 UNIX 시스템 자체가 C 언어로 대부분 작성되었기 때문에 최근에 UNIX와 같은 운영체제가 급속히 성장하고 있습니다. UNIX 시스템은 C 언어로 프로그램을 작성하고, 실행하는데 가장 적합한 환경으로 1980년대 이후 수퍼 미니 컴퓨터(super mini computer), 미니 컴퓨터(mini compiuter), 16비트 퍼스널 컴퓨터의 공통 운용 체제로 애용되고 있습니다. 널리 애용되고 있는 이유로 파일의 사용이 쉽고, 입출력(I/O)과 파일의 교체가 간단하며, 명령어(command)와 명령어가 파이프라인(pipeline)으로 연결되고, AT & T사와 정식 계약을 맺고 있어 원시 코드(source code)가 제공되기 때문입니다.
     UNIX 시스템의 C 컴파일러(compiler)는 'cc'로 UNIX 시스템 구조에서 가장자리에 있습니다. 'cc'는 C프리프로세서(preprocessor), 2 패스 컴파 일러(2-pass compiler), 어셈블러(assemler) 및 로더(loader:link,editor), 그리고 각각의 저수준 프로그램(low-level program)들을 호출합니다.
     C 프로그램의 개발은 UNIX 상에서 하는 것이 좋다라고 말하는데 그 이유는 UNIX사의 개발 툴 집단(development tools group)이 풍부하기 때문이다. 예를 들어 대표적인 툴들을 보면 프로그램 개발시에 유용한 명령어들(commands)과 디버거(debugger), yacc, lex, make, sccs 등이 있습니다.
     UNIX시스템에서 C가 특별한 언어이지만 그렇다고 해서 C 언어에만 국한되지 않는다는 것을 미리 생각해 두시기 바랍니다.

1. JDK(Java Development Kit) 설치

Java를 사용하기 위해서는 Java가 실행이 가능한 환경을 만들어 주어야 합니다.
Sun Microsystems 사에서 JDK의 다운로드 주소는 아래와 같습니다.

http://java.sun.com/javase/downloads/index.jsp

첫 화면

현재(07년 08월 28일)는 JDK 6 Update 2 가 최신버전입니다. Download를 선택합니다.

사용자 동의
다운로드

다운로드가 완료 되면 설치합니다.


2. Eclipse 설치

Eclipse는 Java 개발툴로서 무료프로그램입니다. (프리웨어)
설치없이 다운로드 후 압축 풀기 방식으로 사용하실 수 있습니다.

Eclipse를 다운로드하는 방법은 Eclipse 홈페이지를 접속하여, 프로그램을 다운로드합니다.
홈페이지는 아래와 같습니다.

http://www.eclipse.org

첫 화면

Download Eclipse를 선택 후 Eclipse Classic 를 다운로드 받습니다.

다운로드

다운로드가 완료 되면 원하는 위치에 압축을 해제 합니다.

1. Java는?

 네트워크상에서 쓸 수 있도록 Sun Microsystems 사에서 개발한 객체 지향 프로그래밍 언어입니다.

 1995년 5월에 발표, 1996년 1월부터 정식 버전을 배포하였습니다. C++를 바탕으로 언어 규격을 규정하였습니다. 버그의 원인이 되기 쉬운 기능, 예를 들면 지시자(pointer) 연산을 생략하였으며, C++에서는 사용이 끝난 객체(object)를 명시적으로 폐기하도록 프로그램에 기술하였으나 그 대신 자동 폐영역 회수(garbage collection) 기능을 추가하였습니다. 이와 같이 기억 장치 관리의 오류에서 기인하는 버그를 방지합니다.

 Java는 객체 클래스의 계승(inheri-tance) 관계를 실행할 때에 확정하는 동적 모델을 채용하였습니다. C++에서는 컴파일 시에 확정하기 때문에 상위 클래스에 새로운 기능을 추가하면 그 클래스와 계승 관계가 있는 모든 클래스를 재컴파일 해야 합니다. 자바에서는 클래스의 계승 관계를 실행할 때 확정하기 때문에, 하위의 클래스를 재컴파일 할 필요가 없습니다.

 자바로 작성한 프로그램의 원시 코드는 자바 컴파일러로 컴파일합니다. 자바 컴파일러는 바이트 코드라는 중간 코드를 생성합니다. 이 중간 코드를 자바 가상 머신이라는 소프트웨어로 해석해서 실행합니다. 이 소프트웨어를 설치한 컴퓨터라면 컴퓨터의 명령 집합 아키텍처나 운영 체계(OS)에 관계없이 같은 바이트 코드를 변경하지 않고 실행할 수 있습니다. 자바의 원시 코드를 고쳐 쓰거나 재컴파일 할 필요가 없습니다. 그렇기 때문에 자바는 기종이나 운영 체계와 무관한 응용 프로그램의 개발 도구로 각광받고 있습니다.

 자바 가상 머신의 실현 방법으로는 현재 3종류가 있습니다. 즉, 바이트 코드를 해석하여 축차적으로 실행하는 자바 해석기, 바이트 코드를 일괄적으로 2진 코드로 변환하고 실행하는 JIT 컴파일러, 바이트 코드를 고속으로 해석하여 실행하기 위한 자바 칩(마이크로프로세서)입니다.


2. Java의 특징

  • 간단(Simple)합니다.
     자바의 주된 특징은 기존의 C/C++ 언어의 문법을 기본적으로 따르고, C/C++ 언어가 갖는 전처리기, 포인터, 포인터 연산, 다중 상속, 연산자 중첩(overloading) 등 복잡하고 이해하기 난해한 특성들을 제거함으로써 기존의 프로그램 개발자들이 쉽고 간단하게 프로그램을 개발할 수 있도록 합니다.

  • 객체지향적(Object-Oriented)입니다.
     자바는 C++와는 달리 처음부터 객체지향 개념을 기반으로 하여 설계되었고, 객체지향 언어가 제공해 주어야 하는 추상화(Abstraction), 상속(Inheritance), 그리고 다형성(Polymorphism) 등과 같은 특성들을 모두 완벽하게 제공해 주고 있습니다. 또한, 자바의 이러한 객체지향적 특성은 분산 환경, 클라이언트/서버 기반 시스템이 갖는 요구사항도 만족시켜 줄 수 있습니다.

  • 높은 신뢰성(Reliability)을 가집니다.
     자바는 컴파일 시에 에러 검사를 철저하게 하고, 실행 시에 발생할 수 있는 에러에 대해서도 실행 시에 철저하게 검사를 수행함으로써 신뢰도가 높은 프로그램을 작성할 수 있도록 해 줍니다. 또한, C/C++ 프로그램 개발자들을 가장 혼란스럽게 하고, 프로그램의 치명적인 오류를 발생시킬 수 있는 포인터 및 포인터 연산을 자바에서는 사용하지 않게 함으로써, 포인터를 사용함으로써 프로그래머가 범할 수 있는 오류를 없앴다는 것입니다.

  • 보안성(Security)을 가집니다.
     자바는 분산환경에서 작동하도록 설계 되었습니다. 그러나, 자바는 자바 언어와 자바 런타임 시스템 내에 보안 기능이 내재되어 있기 때문에 보안성이 있는 프로그램을 개발할 수 있도록 해 줍니다. 이러한 특성은 자바 프로그램이 네트웍 환경에서 바이러스 등과 같은 프로그램이 파일 시스템을 파괴하려는 것을 막을 수 있도록 해 줍니다.

  • 아키텍쳐 중립적(Architecture-neutral)이고 이식성(Portable)이 높습니다.
     자바는 서로 다른 이종(Heterogeneous)의 네트워크 환경에서 분산 되어 실행될 수 있도록 설계되었습니다. 이와 같은 환경에서는 응용 프로그램들이 다양한 하드웨어 아키텍쳐 위에서 실행될 수 있어야만 합니다. 이를 위해 자바 컴파일러는 이종의 하드웨어 및 소프트웨어 플랫폼에서 효율적으로 코드를 전송하기 위해 설계된 아키텍쳐 중립적인 중간 코드인 바이트코드를 생성합니다. 이는 동일한 자바 프로그램의 자바 바이트코드가 자바 가상머신이 설치되어 있는 어떤 플랫폼에서도 실행될 수 있도록 하는 것입니다. 또한, 자바는 기본 언어 정의를 엄격하게 함으로써 효율적인 이식성을 제공해 주고 있습니다. 예를 들어, int 형과 같은 기본 데이터형의 크기를 플랫폼과 무관하게 일정하게 하고, 연산자의 기능을 확실하게 규정하고 있습니다. C 언어를 이용하여 int 형을 선언할 때, 도스에서는 16비트, 윈도우 95/98/NT 등 32비트 운영 체제 환경에서는 32비트, 유닉스에서는 32비트 등 그 플랫폼에 따라 크기가 다르지만, 자바에서는 플랫폼에 상관없이 32비트로 고정되도록 하였습니다. 이는 자바 프로그램이 실행되는 환경이 자바 가상머신으로 동일하기 때문입니다.

  • 높은 수행성능(High-performance)을 제공합니다.
     자바에서는 인터프리터가 런타임 환경을 검사할 필요 없이 실행될 수 있도록 구성하였기 때문에 뛰어난 성능을 제공해 줍니다. 쓰레기 수집기(garbage collector) 즉 메모리 관리자는 자동으로 낮은 우선순위의 백그라운드 스레드로 실행되어 메모리가 필요할 때에만 동작하도록 함으로써, 자바 가상머신에게 무리를 주지 않으면서 보다 나은 수행 성능을 제공할 수 있도록 해 줍니다. 또한, 방대한 양의 계산을 수행하는 프로그램은 계산이 많은 부분을 본래의 플랫폼에 해당하는 기계어 코드로 재작성하여 자바 프로그램과 인터페이스 할 수 있도록 하였습니다.

  • 인터프리터(Interpreter) 방식입니다.
     자바 언어로 작성된 자바 프로그램을 중간언어 형태인 자바 바이트코드로 컴파일하고, 이렇게 생성된 자바 바이트코드를 자바 인터프리터가 해석함으로써, 자바 인터프리터와 런타임 시스템이 이식(porting)된 모든 플랫폼에서 자바 바이트코드를 직접 실행할 수 있습니다.

  • 다중 스레드(Multi-thread)를 지원합니다.
     자바의 다중 스레드 기능은 동시에 많은 스레드를 실행시킬 수 있는 프로그램을 만들 수 있도록 해 줍니다. 자바는 동기화 메소드들을 기본적으로 키워드로 제공함으로써, 자바 언어 수준에서 다중 스레드를 지원해 줍니다. 자바 API에는 스레드를 지원해 주기 위한 Thread 클래스가 있으며, 자바 런타임 시스템에서는 모니터와 조건 잠금 함수를 제공해 줍니다.