2013년 7월 11일 목요일

C++ 언어 강의. 1 - 자료형과 변수

정작 C++ 언어를 강의하는 곳은 잘 없더군요 :P

C 언어도 모르시는 분들께: C++ 언어를 하기 위해서는 그 밑바탕이 되는 C 언어를 몰라도 됩니다. 왜냐하면 90% 이상이 C++ 언어에 그대로 왔기 때문이에요. 저는 그 모든 것을 설명할 겁니다. C++ 언어를 하기 위해서는 컴파일러가 필요합니다. 설치하고 와주세요. 오늘 강의는 컴파일러를 이용하지 않기 때문에 지루할 수도 있습니다.

C 언어를 잘 하시는 분들께: 순서가 좀 많이 이상하죠? 저는 원리 위주로 설명할 거에요. 이 부분은 사실상 C 언어와 동일합니다. 이미 다 알고 계실 거라 생각합니다.

C++ 언어를 잘 하시는 분들께: 이 강좌는 초반부에는 C++를 전혀 모르는 사람에게 초점을, C++를 알게 되면 reinterpret_cast 같은 C++ 언어에서만 나타나는 특징을 상세하게 공부할 예정합니다.


우리 컴퓨터는 숫자를 전부 2진수로 저장합니다. 사람이 숫자를 쓸 때는 그냥 쓰면 되죠. π = 3.1415926535897932384626... 하지만 컴퓨터는 저장할 수 있는 메모리에 한계가 있기 때문에 숫자를 더욱 더 엄격하게 나누어서 저장합니다. 우리가 3이라고 쓰면 그건 정수이고 3.14라고 쓰면 그건 유리수입니다. 그런데 컴퓨터는 정수 3을 쓴 자리에다 (정수가 아닌) 유리수인 3.14를 쓸 수는 없습니다. 왜냐하면 엄격하기 때문이지요.

이렇게 엄격한 컴퓨터를 따라 C++ 언어도 엄격합니다. 프로그램의 특성상 조건에 맞는 여러 변수가 필요한데, 실제로 필요한 것이 정수뿐이라면 그 변수를 애초부터 유리수라고 정의할 필요가 없습니다. 심지어 컴퓨터는 화면에 표시할 문자열도 변수로서 가지고 있어야지만 동작합니다. 이러한 정수, 실수, 문자열과 같은 것을 자료형이라고 합니다.

우리 C++ 언어에서는 정수를 int, 실수를 float 또는 double, 문자열을 string이라고 합니다(실수 자료형 중에서 float는 double보다 표현 범위가 좁습니다. π를 예로 들면 double에서는 14자리를 표현할 수 있고 float는 7자리까지만 정확하게 표현할 수 있습니다.).

C++ 언어에는 명령문이 있습니다. '이러이러한 것을 해라' 하고 명령하는 문입니다. C++ 언어는 다른 것과 이들을 구별하기 위해 모든 명령문의 끝에는 ;(세미콜론)을 붙이라는 규칙을 세웠습니다. 명령문 자체에는 ;이 없지만 명령문이 혼자 쓰였다면 반드시 끝에 ;을 붙여야 합니다. 또한 아무것도 없는 코드는 아무것도 하지 말라는 명령문이기 때문에,  
1: ;
는 '아무것도 하지 말고 넘어가시오'라는 뜻입니다. 이것은 나중에 빛을 발할 것입니다.

변수는 자료형으로 표현되는 값을 저장하는 것입니다. 우리는 그 값을 얼마든지 바꿀 수 있습니다(물론 예외사항이 있긴 합니다.). C++에서의 변수 선언은 이렇습니다:
1: <자료형> <변수이름>
여러 개의 변수를 한꺼번에 선언하고 싶으면
1: <자료형> <변수이름1>, <변수이름2>, ...
이런 식으로 입력하면 됩니다. 이들이 명령문이라서, 끝난 이후에는 반드시 ;을 붙여야 합니다. 이를테면 정수형 score을 선언하는 것은 다음과 같습니다:
1: int score;
정수를 선언하는 것이 당연하듯이 실수를 선언하는 것도:
1: double pi;
이렇게만 선언해 주면 됩니다. 이 때 pi에는 어떤 값이 들어갈까요? 아무 값도 들어가지 않습니다. 대부분의 컴파일러들은 0을 넣어줍니다. 하지만 Microsoft 컴파일러의 경우 모든 바이트를 204로 채우기 때문에 -92, 559,631,349,317,830, 736,831,783,200,707, 727,132,248,687,965, 119,994,463,780,864.000000이라는 괴상한 값이 나옵니다. 따라서 변수에는 적절한 초기화가 필요합니다. 변수는 선언과 동시에 초기화가 가능합니다:
1: double pi = 3.14159265358979;
이렇게 하면 실수 pi를 선언하는데 그 값을 3.14159265358979인 π 값으로 한다는 것입니다. 이제 우리는 알고 있는 자료형으로 여러 변수를 선언할 수 있습니다:
1:  int a, b, cplusplus = -1;
2: double pi = 3.14159265358979;


이 시간에서는 자료형과 변수의 개념과 변수의 선언 방법에 대해서 배웠습니다. 배운 것을 정리해 보겠습니다(빨간색으로 된 것을 이어붙입니다.).
엄격한 컴퓨터를 따라 C++ 언어도 엄격합니다. 정수, 실수, 문자열과 같은 것을 자료형이라고 합니다. C++ 언어에서는 정수를 int, 실수를 double이라고 합니다. 명령문이 '이러이러한 것을 해라' 하고 명령하는 문입니다. 명령문 자체에는 ;이 없지만 명령문이 혼자 쓰였다면 반드시 끝에 ;을 붙여야 합니다. 변수는 자료형으로 표현되는 값을 저장하는 것입니다. C++에서의 변수 선언:
1: <자료형> <변수이름>
변수에는 적절한 초기화가 필요합니다. 초기화:
1: double pi = 3.14159265358979;
이상으로 마치겠습니다. 궁금한 점이 있으시면 댓글을 달아 주세요. 수고하셨습니다.
많이많이 퍼뜨려주세요(물론 링크를요)!

2013년 3월 26일 화요일

마인크래프트 한글패치 1.5.1

여기에 있다구요오오

상위 트래픽 소스가 아니면 거들떠보지도 않는 검색엔진이 미워 죽겠음.
그래서 트래픽 올리기 위한 검색어 입력!

제발 무시해 주세요.
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치
마인크래프트 한글패치 1.5.1
마인크래프트 1.5.1 한글패치

2013년 3월 10일 일요일

NWC 구조 연구 - 개요

명심! 언제든지 바뀔 수 있는 문서입니다. 혹시 공동연구를 하실 분이나 아이디어 제공해 주실 분은 k2pa00@gmail.com으로 메일 보내주세요.

2013년 3월 10일자까지 문서

NWC는 비트플립이 전부 다더군요.

맨 뒤 4바이트는 여러 가지 상황에 따라서 수가 바뀝니다. 이 중 앞의 2자리는 (아직까지는) 불규칙합니다. 뒤의 2자리는 총 원소의 개수인 것 같은데... 음의 위치에 따라서도 달라집니다(높아질수록 1씩 줄어듦). 이 4자리의 숫자는 비교적(?) 불규칙하게 나타납니다. 그리고 앞의 규칙적인 부분까지는 다 정확하게 써도 이 부분이 틀리면 망합니다. 파일이 깨져버린단 말이에요.
정말 깊이 연구해야 하는 부분입니다. 따라서 저는 이 부분을 Checksum(체크섬)이라고 부르기로 했습니다. 높이나 이런 거에서 차이나는 걸 봐서 다 더한 값이라고 예상해서, sum(합)이라는 말을 붙였습니다. 아직까지 완전 불규칙한 앞의 2바이트를 Upper Checksum, 그나마 덜 불규칙한 뒤의 2바이트를 Lower Checksum이라고 부르겠습니다.

4분 온음표 노트는 60 26 XX 2F(가온다까지), 60 E6 XX 5E(가온다 초과)입니다. XX 부분은 바이트 플립 되어 있습니다. 가온바와 가온나는 NWC에서 나타내는 방법이 따로 있지만, 저는 읽는 게 목적이 아니라 쓰는 게 목적이고, 꼭 저 두 음을 그 방법으로 나타내지 않아도 잘 되었습니다. 그런 고로 나중으로 미루거나 하겠습니다.

오늘은 이상! 연구가 완전히 완료가 된 부분은 개요가 아닌 곳에 따로 쓰겠습니다.

P. S. 공동연구자 너무너무너무너무 필요해요! NWC 파일 구조에 관해 관심있는 분이라면 누구든 환영합니다.

2013년 2월 22일 금요일

마인크래프트 키파의 한글패치

룻트님 한글패치 오류 고쳐주려 하다가 아까워서 배포합니다.
제 한글패치는 한글패치 본연의 기능에만 신경썼습니다. 그래서 한글을 입력하는 부분은 룻트님 것보다 좋을지도 모르나, 기능은 정말 허접합니다. 다양한 기능을 원하시면 룻트님 한글패치를 사용하세요.

다운로드 (1.4.7)
다운로드 (1.5.1)

링크를 누르면 낯선 화면이 보입니다. 당황하지 마시고 파일(F)의 다운로드(S)를 눌러주세요. 다운로드가 바로 시작됩니다. rar 파일입니다. 절대로 알집으로 풀지 마세요. 제 윈컴(윈7) 기준으로 안 됩니다. WinRAR나 다른 좋은 압축 소프트웨어를 사용하세요.

수동 설치입니다. 저는 자동 설치같은 거 안 하구요, 자동 설치기 만들어주시려고 하시는 분들 정말 감사합니다. 그러나 이런 모드같은 거 배포할 때는 출처를 명확하게 알려주세요. 프로그래머에게 버그 리포트는 생명입니다. 버그가 엉뚱하게 설치기를 만든 사람에게 보고되는 어이없는 사례가 적지 않으니, 배포할 때는 꼭 출처를 밝혀주세요. 저뿐만 아니라 다른 프로그래머들이 써도 된다고 한 거 전부요. 출처는 kipa00.blogspot.com(이곳)이나 정 여의치 않으면 네이버 블로그(kipa00.blog.me)로 남기셔도 됩니다. 아! 네이버의 폐해란!

국민 대다수가 네이버를 쓰고 있다는 사실이 한심하군요. 물론 저도 씁니다만... 저도 한심하군요. 참... 아직까지 네이버를 끊지 못한다니...

2013년 2월 12일 화요일

세종대왕님이 정말로 존경스럽습니다.

우리는 그냥 평소에 이렇게 말하고 쓰고 읽고 (한글을) 듣고 하는데, 제가 실용적인 한글 압축 알고리즘을 만드려고 연구를 하던 도중에 놀라운 사실을 발견했습니다.

웬만한 일상한국어에서는 받침이 없는 글자가 전체의 60% 이상을 차지합니다.

덕분에 '받침 플래그를 추가해도 괜찮을 것 같다'는 생각이 들었습니다. 받침 플래그 1비트를 추가하면 오히려 압축이 더 될 것 같습니다.
그리고 메신저에서는 통신어를 잘 쓰니까, 모음 있나 없나 플래그도 추가하면 안... 되겠지요? 그건 좀 그렇네요. 왜냐하면 'ㅋㅋ'나 'ㄴㄴ', 'ㅌㅌ'등을 위해서 나머지 98%가 1비트씩 희생하면 안 되니까요.

근데 경어체를 실험 안 해 봤네요;; 반어체에서는 확실히 60% 이상이더라구요.

추신: 이 글귀를 포함해서, 여기 있는 글자들 중 받침이 없는 글자는 전체의 53.3%입니다. 경어체에서는 약간 줄어드는군요. 그래도 50% 이상이니 뭐...

2013년 2월 4일 월요일

NWC 구조 연구를 시작합니다.

그 어떤 곳에 찾아봐도 없어서, 제가 직접 연구하기로 했습니다.
NoteWorthy Composer(이하 NWC) 파일의 구조를 샅샅이 파헤치도록 하겠습니다.

제가 학교에서 30분간 파헤쳤는데 NWC의 스트링 구조를 알겠습니다. 정확하게 안 건 아니니 다른 데 쓰지 마시고 '그러려니' 하고 봐 주세요.
"ABCDEFG"라는 스트링은
1. 아스키 코드로 모두 변환한다. 41 42 43 44 45 46 47
2. +0x30 71 72 73 74 75 76 77 (이게 약간 애매하단 말이에요.)
3. 각각의 바이트의 비트 순서를 스왑한다. 8E 4E CE 2E AE 6E EE
이렇게 됩니다. 근데 널 문자도 없고, string의 길이를 어떻게 구하는지 몰라서 잘 모르겠습니다.

올리디버거를 사용할 수 있다면 작업 속도가 훨씬 빠를 텐데;; 기술이 없네요...