레이블이 좟소리인 게시물을 표시합니다. 모든 게시물 표시
레이블이 좟소리인 게시물을 표시합니다. 모든 게시물 표시

2010년 10월 27일 수요일

C# 공부한거 정리 #2

Collection

 

IEnumerable

IEnumerator - 내부 데이터 접근 Interface (Iterator)

-- Current

-- MoveNext()

-- Reset()

ICollection

-- int Count - 객체 수

-- bool IsSynchronized - 접근 동기화

-- object SyncRoot - 스레드에서의 동기화 객체 반환

-- void CopyTo - Collection -> Array

IList Property

- IsFixedSize - 고정 길이 리스트 체크

- IsReadOnly - 읽기전용 체크

- this[index] - 인덱서

IList Method

- Add(object) - 추가

- Clear() - 싹다제거

- Contains(object) - 존재 체크

- Indexof(object) - 위치반환

- Insert(index, object) - 데이터 삽입

- Remove(object) - 객체 제거

- Remove(index) - 그 위치 객체 제거

IDictionary Property

- IsFixedSize

- IsReadOnly

- Keys - 키 전부 나열 - 키는 유일해야 한다

- Values - 값 전부 나열

IDictionary Method (e.g. Hashtable)

- Add(key, value)

- Clear

- Contains(key) - 연관성 검사

- GetEnumerator() - 나열을 위해 인터페이스 반환

- Remove(key) - 키로 지움

IDictionaryEnumerator Property

- DictionaryEntry - 키, 값 반환

- object Key - 키 반환

- object Vaule - 값 반환

 

 

 

대표적 Collection

- ArrayList  - vector

- Hashtable  - map ( object, value )

- SortedList - key기준 정렬, key검색활용

- Queue - Enquere(), Dequeue()활용

- Stack

- NameValueCollection

---- System.Collections.Specialized

---- String, String 형 맵

 

 

 

 

Generic

- 초기의 C# : Object의 Upcasting을 활용하여 제너릭이 필요가 없었다.

- 제너릭 도입 이유 : 형식 안정성, Object : 캐스팅 낭비 없앰, Value : Boxing/UnBoxing 부하가 없음

 

Collection의 Generic변환

ArrayList -> List<T>

Hashtable -> Dictionary<T>

SortedList -> SortedDictionary<T>, SortedDictionary<K, V>

Stack -> Stack<T>

Queue -> Queue<T>

 

Exception

finally : 예외처리 여부와 상관없이 무조건 실행되는 문장

 

Stream

- I/O stream

- File stream

---- File, Directory - static ( 객체 생성할수 없다 )

---- FileInfo, DirectoryInfo -  객체 생성 활용 가능

FileInfo fi = new FileInfo(@"c:\test\a.txt"");

fi.CopyTo(@"c:\test\b.txt\");

 

File Class (public sealed class ), using System.IO

File.Copy(src, dest, overwritted여부(true/false))

bool exist = File.Exists(src);

DateTime dt = File.GetCreationTime(src);

 

 

 

- File Class

OpenRead(src);

OpenText(src);

OpenWrite(src); 등등

접근 방식

StreamReader r = new StreamReader (fs, System.Text.Encoding.Default);  // 문자스트림 변환

r.BaseStream.Seek(0, SeekOrigin.Begin); // 커서 위치를 첫부분으로

r.Peek() == -1 // EOF check

r.ReadLine() -> 파일스트림에서 Line단위 읽기

r.Write(byte[], 0, byte[].Length)

 

r.Flush();

r.Close() -> 스트림 닫기

 

SeekOrigin 열거형 상수 - Begin, Current, End

 

- Directory Class

 디랙터리 생성, 이동, 삭제등을 위한 Class

- Path class

파일 디렉토리 경로 확장, 변경 수정 클래스

 

 

- BuffedStream

Default : 4096 Bytes

 

- MemoryStream

메모리 대상 Stream

 

- BinaryReader, BinaryWriter

데이터 타입의 크기만큼 데이터를 저장 & 읽을때 사용하는 스트림 ( FileStream의 데이터 단위 스트림 )

 

- TextReader, TextWriter

문자 스트림 입출력관장 최상위 추상 클래스

 

- StringReader & StringWriter

public class StringReader : TextReader

public class StringWriter : TextWriter

 

- StreamReader & StreamWriter

ByteStream->CharacterStream

 

 

 

 

 

 

 

 

 

 

C# 공부한거 정리 #1

C/C++ 호환성을 위해 사용

pointer - unsafe, fixed

struct - stack에 memory allocation

 

Garbage Collector - heap 관리

 

Type

- Value type(Built-in type)

- Reference Type : Class Object

- readonly 추가 (const 비슷함)

 

전달법

- Call by Value (Value Copy)

- Call by Reference (ref, out)

 

Class 추가 기능

Access Identifer 추가

- internal

- protected internal

Property 추가 (set, get) - set 인자 value

sealed - 상속금지

Overriding-

-- new public void Method() 활용법

-- base : 상위접근

Polymorphism

-- abstract // overlide

-- Interface

-- Upcasting (객체의 묵시적 캐스팅)

 

Casting

-- Object 형? - 모든 object가 가지는 최상위 class

-- Boxing : value -> ref 변환 // UnBoxing

 

Delegate

-- 활용? 함수포인터 // 쓰레드/이벤트 제어 --> 캡슐화

 

계약적 다형성 (Contract)

-- Interface활용 ( 빌더 패턴과 유사? )

 

배열 생성법

int[] name = new int [10];

배열 선언후에는 하나씩 할당하는 방법이외에 다른 방법은 없다.

int[] ref = ref2; (참조값이 할당됨 유의)

 

-- value array

-- object array - 메모리 할당 필요

 

다차원 배열

int[,] myarray = new int[4,3];

 

가변 배열 (Jagged Array)

int[][] jagarray = new int[3][]; // matrix 표현 불가능

jagarray[0] = new int[10]; 하부열 할당필요

 

배열의 property

Length, Rank(차원의 수)

배열 지원 함수 -> System.Array [ICloneable, IList, ICollection, IEnumerable]

복사 방법 Copy(), Clone() [ 일부, 전체 복사 ]

 

foreach

- Array, Collection에서 활용 ( foreach(int i in array)

- 읽기전용 / 검색전용 제어문 ( Iterator )

 

Indexer

public object this[int index]{ get{} set{} }

 

문자열

string - 수정 불가 -> 대체안 : StringBuilder - 문자열 조작의 cost time을 기하급수적으로 줄여준다.

 

 

 

C/C++ 차이점

묵시적 캐스팅 - 무조건 에러

if에 조건식이 없거나 true, false 결과값이 없다 - 무조건 에러

다중 상속 불가 - interface를 활용한 샛길

함수포인터 활용 - delegate

 

C++의 STL? -> System.Collections

C++의 RTTI? -> System.Reflaction

C++의 Console IO? -> System.Console

 

 

2009년 8월 3일 월요일

개인적으로 헷갈렸던 C문법 정리 - 1

1. char* a = "Hello!";
/
2. char a[] = "Hello!";

두 선언법의 차이점.

char* a = "Hello!";
1. const char* a와 유사하다.
2. stack에 미리 자리 잡은 "Hello!"에 대한 주소를 가리킴.
3. a가 가리키는 주소내의 멤버변수에 대해 임의변경이 불가능함.
4. a가 다른 주소를 가리킬수 있도록 변경할 수 있음.
ex) a = "World!"와 같은 방식으로도 변경가능.
5. 단, 임의의 배열에 접근 시키는 경우에는 멤버 변수에 접근 가능.

char a[] = "Hello!";
1. stack내에 초기화 할 문자의 갯수만큼 메모리를 잡고, 문자열 상수 "Hello!"를 선언된 배열 a에복사함.
2. a가 가리키는 주소를 임의로 변경할수 없음.
3. 그러나 a가 가리키는 주소내의 멤버변수는 임의로 변경이 가능함.
4.
char a[] = "Hello!";
char* const b = a;
와 같은 방식은 b와 a의 sizeof값(char[7], char*)만 다를뿐 같은 역할을 하는 변수가 된다.


왜 이 문자열 상수에 대한 문법이 개인적으로 헷갈렸냐면
1. 문자열이 저장되는 메모리가 어딘지에 대한 인식부족
         (string constant와 array of character이 가지는 의미)
2. []연산자와 *연산자가 실제 연산 활용에 있어서는 같다고 배웠지만,
    선언때는 다르게 쓰인다는걸 인식을 못했음.

문자열 상수가 data영역에 저장된다는걸 제대로 인식한다면 헷갈리지 않을 문제였음.


복학을 대비해서 돌머리가 된 머리를 좀 유연하게 살릴겸 해서 C, C++에서 개인적으로 헷갈렸던 문법만 한번 훑어보며 정리해가기로 했습니다.

보면서 도움이 되도 좋고... 안되도 딸딸이 블로그니까 상관업코...



번외편

const char a[] = "Hello";

Hello는 data영역에서 stack으로 복사되고
stack에 있어서 지역변수로 선언한 경우에는 함수종료시에 소멸됨.
저장되는 데이터 영역만 stack에 있고 또다른 문자열 상수의 선언방법이 되겠습니다.
메모리는 두번이나 쓰겠지만요...

static const char a[] = "Hello";

같은 data영역에 저장되는데 가리키는 위치만 다른 방법이 되겠습니다.
이런걸 메모리 낭비라고들 말하죠 ....

#include <stdio.h>

int main(){

char c[] = "sxaxfg";
char* b;
char* const a=c;
static const char d[]="Hello!";

b = "Hsax";
b = "ocama";
b = "Hello!";

a[0] = 'o';
puts(c);

printf("%d, %d\n",sizeof(a),sizeof(c));

printf("%x, %x, %x\n", "Hello!", d, b);

return 0;
}


위와 같은 예제를 돌려보고 이해하려고 해보면 도움이 될지도 모릅니다.

2009년 7월 7일 화요일

티맥스 시연회

결국

 

주제 : 호환

 

보여줬던거

 

교양강좌 + 티맥스 OS랑 스카우터라는게 있었다는 실체를 확인시켜줌

 

 

 

 

제가 뭐때문에 이걸 5시까지 보고 있었는지 모르겠습니다.

 

시연회 직접 간 사람들도 이런것만 보고 들으려고 간건 아닐거 같은데요.....

 

Tmax Window 11을 내겠다고 발표한게 이번에 Tmax Window 9를 내고나서 정부지원을 받겠다는걸 의미하는게 아닐까 싶어서 진짜 씁쓸합니다....

팈ㅋㅋㅋ맼ㅋㅋㅋ슼ㅋㅋㅋㅋ

1. 윈도우7은 아직 써보지 않았습니다.

 

2. 애국심을 자극합니다. 무슨 미국이 존나 사악한 나라라서 타파해야한다는 정의의 사자 컨셉임?

 

3. 포샵질한 스크린샷을 아직까지 써먹는 이유는 뭐냐

 

4. 보통 MS나 블리자드같은데 컨퍼런스는 말 별로없고 시연부터 들어가는데

  티맥스는 박모사장이 말로 다 때우려고만 함

 

 영업직인가? 찾아돌면서 OS사세요 이러려고 그러나

 

5. 오라클하고 MS에 피해망상 있나?

   SI깡패새끼가 왜 남의 독과점에 대해서는 인정을 못하나

 

6. 마지막으로

   사본-마지막으로

   사본-사본-마지막으로

 

   교장선생님 훈수가 차라리 덜졸린다

 

7. 내년도에 예상한다는거 애드립으로 꺼낸말인거 같은데 튀맥스 개발자분들 죽어나겠네 또..

 

8. 왜 Tmax Windows 9임? 버젼이 왜 최초부터 9야....... 내년에 발표하는게 11이라며

 

9. 학생들도 PPT발표할때는 연습을 수없이 하고 가거든영?

 

10. 일하다가 사원들이 이혼할 지경까지 가고 쓰러지고 이런건 연구원들의 성실한 이미지보다 회사에서 연구원의 피를 말려버렸다는 이미지가 강하지 ㅡㅡ; 저거 진짜 2005년도부터 우려먹네효 ^^ㅋ

 

이게 회사냐 아오지탄광이냐

 

11. 쓸데없는 API, FILE이런 용어설명으로 때운시간이 얼마냐....

 

12. 시연 이전에 반석만 존나 깔고 지겨워 죽겠음

 

13. 시연컴퓨터 세대 중에 두 대는 XP였고 한대는 티맥스OS였는데 세개다 이상하게 시작전에 전부 치워버렸다면서요? 왜 치웠습니까..

 

14. 사람들이 원하는건 공개 강연이 아니고 공개 시연이라는걸 파악을 못하고 있음.

     컨퍼런스를 진행하더라도 시연 이후에 강연을 했어야 했다.

 

15. 차라리 김대승 상무 설명전에 박대연회장이 5분이내에 PPT를 끝냈으면 김대승 상무의 설명이 재미있을건데 (그것도 기술자입장으로서) 왜 일반인들도 많이 온 자리에 김대승 상무는 이렇게 기술적인 얘기만 계속하고 있고, 박대연회장은 김대승 상무가 나중에 할 얘기인데 어물거리면서 쓸데없이 설명해서 가면 갈수록 최악의 시연회를 진행하고 있는거임?

 

16. 진짜 사람들이 웃음을 자아내는 진행을 하려고 했다면

    일단 시연을 먼저 한다음에 2부 과정으로 김대승 상무의 설명을 해서 관심있는 사람만 듣도록 했어야 했다. 모르는 사람은 그냥 시간 아까운 얘기잖아... 들을 필요도 전혀 없고

 

17. 내가 지금 실시간으로 시연회를 보고 있지만 정말 쓸데없다.

 

18. 지네들 하소연들으려고 시연회보고있는거 아니다. 동정심 유발 정책으로 팔아먹으려고 하지마라 -_-

 

19. 쿱횽 명대사 : 다른거 다 필요없고 지금까지 말한거 되는것만 시연해주세요

 

20. 내가 아이두게임 가서도 느낀건데 ~~제공이 된다 ~~제공이 될것이다가 아니고 일단 당장 되는것부터 얘기를 하라고... 미래에 대한 떡밥에 아무리 현실미가 있더라도 구현 뒤에 언급을 해야지 설레발만 존나 치네

 

-------시연 시작!---------------------------

 

1. 티맥스 미디어 플레이어

 

작고 효율적이고 티맥스 OS에 맞게 만들어서 다른 플레이어보다 더 효율적이라면서

 

끊김

 

잘 돌아가는걸로 만족함. 그건 KMP도 한다 미친놈들아...

 

2. 마우스포인터가 반대방향인건 정말 획기적이군요?

 

3. IE6과의 호환 축하합니다... 블로그에 슬쩍 티맥스 OS까는 글이 보였는데..

 

4. 스타가 언제부터 800*600이었음?

   로딩시간이 2분 좀 넘게걸리는거 같은데 ?????????

   저게 전설의 화이트 스크린이었구나

 

5. 도대체 스타를 왜 지금 호환을 하려고 했는지 모르겠음

   아무리 국민 게임이라지만 10년전 게임이야 저게....

  스타 존나 끊곀ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ 리플레잌ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

  커서가 두개얔ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

 

이걸로 OS 데모가 끝이라니

 

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

 

21. 민주주의랑 대조시켜서 MS의 독점을 까겠다는건지 말겠다는건지 모르겠네요..

 

22. 내가 이걸 왜 1시간 가까이 보고 있었지? 진짜 의미없다.............

 

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

 

오늘 시연회 동영상으로 보면서요 아직 스카우터 같은거 안보긴 했지만 저도 일하고 지겨워지니까 여기서 끊으려고요

 

이 대화록을 마지막으로 끝내겠습니다.

 

[15:14] <사라다v6> 야
[15:14] <사라다v6> 비밀 은행나무침대은 얘들아 Enchant
[15:14] <사라다v6> @doax 사실상 개발팀은 개발종료를 선언했습니다. RTM 이 만들어지고 있고 곧 OEM 벤더로 들어가게 되면 사실상 카운트 다운에 들어가게 되는 것이죠. 심각한 문제가 생기지 않으면 출시는 예정대로 10월 쯤 할거 같습니다.
[15:14] <사라다v6> 저대로 사실상 개발종료래
[15:14] <비밀>  ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
[15:14] <Enchant> ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
[15:14] <은행나무침대> ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
[15:14] <은행나무침대> 시발
[15:14] <은행나무침대> ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
[15:14] <은행나무침대> 오 씨발 세상엨ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ


저 안정성으로 RTM이 나올수있나....

 

저대로 출시하면 관공서이외에는 사고자 하는 곳 한군데도 없을거 같은데.........

 

그런데 나같아도 개인 생활이 완전 파탄나고 그랬으면 아무리 위에서 쪼아도 더이상 하기 싫겠다 시발...

 

 

2009년 6월 22일 월요일

Duff's device

C사용자가 데이터 복사를 구현하는데에 있어 속도를 최적화한 기법

 

오리지널 버젼

 

do {

*to  = *from++; // to는 single memory-mapped output register

} while (--count > 0);

 

와 같은 소스를

n=(count+7)/8;
switch(count%8){
case 0: do{ *to = *from++;
case 7:  *to = *from++;
case 6:  *to = *from++;
case 5:  *to = *from++;
case 4:  *to = *from++;
case 3:  *to = *from++;
case 2:  *to = *from++;
case 1:  *to = *from++;
 }while(--n>0);
}

다음과 같은 방법으로 사용

소스를 switch,do~while를 이용하여 조건문 실행을 최소화하여 접근속도를 빠르게 하여서 실행속도의 최적화를 얻게 된다.

 

최초 duff's device가 나왔을때는 switch문을 count를 위해 사용하는 괴악한 방법때문에 이게 과연 표준 C 문법이 맞느냐는 논란이 일었으나 결국 어떤 컴파일러에서도 지원하는걸 확인하고.. 여튼 별 문제없이 쓸수 있다는 결론이 나옴

C를 어셈블리처럼 쓴 기법임.

 

Stroustrup's version

 

mystrcpy나 mystrrev 등을 구현하고자 할때 속도에서 이득을 얻고자 한다면

to를 single memory-mapped output register로서 생각하지말고 *to++ = *from++; 등으로 사용하면 된다.

근데... strcpy나 배열일반복사 생각하고 그렇게 쓸거면 차라리 그냥 memcpy쓰는게 나음...........

원래 라이브러리 함수 그냥 쓰는게 속도면에서는 당연히 무적일 허슬

 

stroustrup 버젼으로 구현해서 속도에서 최대한으로 이득을 얻을수 있는건 strrev처럼 이레귤러적인 복사방법에 한정되겠습니다.

 

애초에 copy에 한정된 기법이라 더 이상의 활용용도를 모르겠는데 더프 디바이스의 활용용도에 대해서 잘 아시는 분들 예시 좀 알려주셨으면 합니다!


추가 : http://ideathinking.com/cpptips/y2k2/duffs_device.html 더프 디바이스에 대한 활용 예시 + 실험

 

Binary-tree

저장법

1. Linked List

예시)

struct __TREENODE{

  __TREENODE *left;

  __TREENODE *right;

};

2. Array

root를 Array내의 0번째 node라고 가정한다.

left child의 경우 parent node를 i라고 했을때 2i + 1

right child의 경우 parent node를 i라고 했을때 2i + 2...

 

순환법

1. Pre-Order Traversal (Depth-first traversal)

parent -> L-node -> R-node 순으로 접근하여 모든 subtrees에 방문하는방법

 

order(NODE* node){

   //자기 노드에 접근

  order(node->left);

  order(node->right);
}

 

2. In-Order Traversal (Symmetric traversal)

L-node -> parent -> R-node 순으로 접근하여 모든 subtrees에 방문하는 방법

 

order(NODE* node){

  order(node->left);

//자기 노드에 접근

  order(node->right);
}

 

3. Post-Order Traversal

L-node -> R-node -> parent 순으로 접근하여 모든 subtrees에 방문하는 방법

 

order(NODE* node){

  order(node->left);

  order(node->right);

//자기 노드에 접근
}

 

4. Level-Order Traversal (Breadth-first traversal)

Root Node를 시작으로 인접한 모든 Node를 순서대로 방문한다.

Level이 낮은 순서부터 Level이 깊은 순서대로 순차적으로 방문

 

기본적으로 Search를 위한 접근법이라 설계법은 생략(치졸한 변명이지만 못하겠다는건 아니고..)

 

과제기계로 활동하던 중에 정리해보았음.

 

2006년 12월 11일 월요일

あめつち

あめつちほしそら やまかはみねたに
くもぎりむるこけ ひといぬうへすゑ
ゆわさるおふせよ えのえをなれゐて

天 地 星 空  山 川 峰 谷
雲 霧 室 苔 人 犬 上 末
硫黄 猿 生ふ 為よ 榎の 枝を 馴れ 居て

歴史的仮名遣

アサヒナさま、ありかとうこさいます



................
문어 정말..........

아로하우타

色は匂へど 散りぬるを
我が世誰ぞ 常ならむ
有為の奥山 今日越えて
浅き夢見じ 酔ひもせず

이로와니오에도 치리누루오
와가요다레조 츠네나라무
우에노오쿠야마 쿄오코에떼
아사기유메미지 요이모세즈