블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2346)N
Unity3D (577)
Programming (473)
Unreal (4)
Gamebryo (56)
Tip & Tech (188)N
협업 (35)N
3DS Max (3)
Game (12)
Utility (116)
Etc (92)
Link (31)
Portfolio (19)
Subject (90)
iOS,OSX (38)
Android (13)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (1)
Memories (20)
Interest (37)
Thinking (36)
한글 (26)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (19)
Exercise (3)
나만의 맛집 (2)
냥이 (9)
육아 (15)N
Total1,357,015
Today337
Yesterday138
Statistics Graph

달력

« » 2020.1
      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 29 30 31  

공지사항

태그목록

오늘은 .NET의 핵심 요소중 한 가지인 Intermediate Language(IL 혹은 MSIL 그리고 어색하지만 우리말로하면 중간언어)에 대해서 이야기 해보고자 한다.

Java는 알려진 바와 같이 Byte code로 컴파일 되어 실행 시 자바 가상머신을 통해 인터프리트 된다. .NET의 IL(Intermediate Language)은 Java의 Byte code와 비슷한 개념으로 생각하면 될 것이다.

그것이 전부냐고 묻는다면, 당연히 아니다.

.NET에서 프로그래머가 코드를 작성하고 컴파일하면, 그 결과로 IL 코드가 생성된다. IL코드는 JIT(Just-In-Time)컴파일러에 의해 Native 코드로 컴파일된다. (인터프리트 되는 것이 아니다.)

Java의 경우 Byte code를 인터프리트 하는 과정에서 발생하는 프로그램의 Performance Loss는 상당하다. 하지만, (MS측의 말에 따르면) .NET에서는 JIT컴파일러를 이용하여 컴파일하므로 Performance Loss의 상당부분을 축소시킬 수 있다고 한다.

IL사용의 또 다른 이점은 바로 객체지향 환경에서 언어 상호운용(Language Interoperability)을 가능하게 한다는 것이다. 즉 한 언어로 작성된 코드를 다른 언어에서도 이용할 수 있다는 것이다. (단, 이를 위해서는 몇 가지 방법론상의 제한적 요소가 필요하다.) 또한 IL을 통해 Platform의 독립성이 보장된다.

그럼 IL의 특징에 대해 좀 더 살펴보자.

객체지향적 프로그래밍

.NET에서는 20여년 가까이 사용되어온 객체지향적 프로그래밍을 효과적으로 사용하고 있다. 그 결과로 우리는 코드의 재사용, 다형성, 캡슐화등의 객체지향의 장점을 최대한 활용할 수 있다.

IL에서는 상속과 인터페이스를 지원한다.(모든 객체는 object 객체를 상속받는다.) .NET의 인터페이스는 기존의 COM 인터페이스와 유사한 개념으로 생각하면 될 것 이다. 그러나 더 이상 IUnknown와 GUID로 인해 골치를 썩힐 필요는 없다.(이 문제는 Assembly가 대신 해결해준다. 후에 자세히 설명하겠다.)

IL은 특히 “단일구현상속”과, “다중인터페이스상속”을 지원한다. (말이 좀 혼란스러울까?) 좀더 자세히 설명하자면, “단일구현상속”은 객체의 구현을 오직 한 객체에서만 상속 받을 수 있다는 것이다. 그리고 “다중인터페이스상속”이란 객체의 전체 구현이 아닌 인터페이스는 여러 개를 상속 받을 수 있음을 의미한다. (단지 글로써 이해 하는 것은 힘들겠지만, 이 연재를 통해 깊이 소개 될 것이므로 일단 개념으로 접어두기 바란다.)

Value 타입과 Reference 타입

IL에서 지원하는 데이터 타입은 크게 두 가지로 나눌 수 있다. 그것이 바로 Value 타입과 Reference타입이다.

각각의 특징을 간단히 요약하자면 다음과 같다.

 

Value 타입 Reference 타입
무엇이 저장되는가? 데이터 데이터가 위치하는 주소
메모리의 어느부분을 이용하는가? 일반적으로 스택(Stack) 일반적으로 힙(Heap)


Value 타입은 변수에 데이터가 직접적으로 저장되는 타입을 말하며, 일반적으로 스택에 저장된다. 데이터를 직접 액세스하므로 Reference 타입보다 속도가 빠르다.

Reference 타입은 C/C++의 포인터를 와 유사한 개념으로 이해하면 될 것이다.(물론 차이점은 있다.) Reference 타입은 주소를 저장하며, 일반적으로 Reference의 인스턴스는 힙에 저장된다.

강력한 타입 시스템의 지원

기존의 C/C++에서의 타입 캐스팅(Type Casting)은 편리하면서도 상당한 위험부담을 필요로 했다. 예를 들자면 상당한 Performance의 부담을 요구했으며 데이터 타입의 안정성을 깰수도 있었다.

하지만, .NET의 Managed Code는 이런 문제를 해결해 준다. CLR에 의해서 모든 형의 안정성이 보장된다. 물론 이것으로 인해 약간의 Performance를 손해 보는 것도 사실일지 모르나, 그 만큼 얻는 이득도 있다.
  1. CLR은 프로그램을 실행하기전에 실행 권한이라던가, 해당 코드가 실행중인 다른 프로그램에 피해를 주지 않는지 검사한다. 이것을 통해서 데이터 타입과 관련된 잘못된 코드는 실행할 수 없게 한다.
  2. 가비지 컬렉터를 이용함으로써 자동적인 메모리 자원관리를 지원한다. 즉 더 이상 사용되지 않는 데이터가 차지하고 있는 메모리 자원을 자동적으로 회수한다.
  3. 강력한 데이터 타입의 지원을 통하여 언어 상호운용(Language Interoperability)을 가능하게 한다.

마치면서

특별한 구현없이 연속되는 개념설명에 혹시 지쳤을지 모르겠다. 지금 이해가 되지 않는다면 일단은 지나쳐 버리는 것도 괜찮을 것 같다. 그냥 편안하게 읽어주길 바란다. 그리고 후에 C#에 대한 연재가 이어지고 그 때 다시 이 글을 보게 된다면 한층 도움이 될 것이다. 언제든지 질문이 있으면 이곳 의견게시에 올려주길 바라며 다음 시간에는 “언어 상호운용(Language Interoperability)”에 대해 이야기 해보도록 하겠다


Posted by blueasa
TAG MSIL

댓글을 달아 주세요

  1. 2012.03.09 05:58 cartomancie gratuit  댓글주소  수정/삭제  댓글쓰기

    내가 좋아하는 정말로 승리 정말로 ! 공개

웹에 가끔 질문을 올리시는 분들이 계셔서 모르시는 분들에게 도움이 될까 해서 올립니다. 아시다 시피 .NET은 COM 도 지원하지만 그냥 DLL을 직접 콜 하는 방식도 지원합니다. 이걸 PInvoke라고 하지요. 근데 이 PInvoke 이 사용하기가 조금 까다롭습니다. COM처럼 TLB가 있어서 상호간의 마샬이나 콜 방법을 도와 주는것이 있는것도 아니고, 따라서 자동으로 .NET wrapper을 만들어 주는 툴이 있는것도 아니고, 사용하는 사람이 직접 맞는 맵핑을 찾아야 하죠. 완전 시간 허비하며 이리저리 맞을때 까지 해봐야 하는게 일반적 입니다. 물론 spec을 보면 장황한 설명이 있습니다. win32의 경우는 특히 natvie 무슨 타입 형식이 .NET의 무슨 타입과 1:1 대응이 되며, 메모리 structure는 어찌 지정해야 되고 어쩌고 저쩌고. 그걸 다 외우면 기계적으로 맵핑이 다 될꺼 같은데... 아닙니다 . ㅡ.ㅡ.

 

하여간 그래서, 사람들이 모여서 그 정보를 모아 놓는 곳이 있습니다.

http://www.pinvoke.net 입니다.

 

여기 가셔서 찾으시는 win32 함수 이름을 맨위 search 박스에 넣고 찾으시면 거의 90% 찾으실수 있을 껍니다. 그 함수를 dllimport 하는 방법 부터, memory structure는 어떻게 해 줘야 하고 marshal 은 어떤 형식으로 해줘야 하는지 또 parameter로 사용되는 타입은 어떻게 지정해야 하는지 등등...

 

도움이 되셨으면 좋겠습니다.

출처 : http://blogs.msdn.com/b/heejaechang/archive/2008/09/22/c-windows-api.aspx

Posted by blueasa
TAG c#, WIN32API

댓글을 달아 주세요


출처 : http://leadersway.cafe24.com/blog/entry/텍스트박스에-한글만-영어만-숫자만-입력하기?category=3

텍스트박스에 한글만 입력하기

private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if((Char.IsPunctuation(e.KeyChar) || Char.IsDigit(e.KeyChar) || Char.IsLetter(e.KeyChar) || Char.IsSymbol(e.KeyChar)) && e.KeyChar != 8)
    {
        e.Handled = true;
    }
}

 

텍스트박스에 영어만 입력하기

private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(!(Char.IsLetter(e.KeyChar)) && e.KeyChar != 8)
    {
        e.Handled = true;
    }
}

 

private void textBox1_Leave(object sender, System.EventArgs e)
{
    Regex emailregex = new Regex(@"[a-zA-Z]");
    Boolean ismatch = emailregex.IsMatch(textBox1.Text);
    if (!ismatch)
    {
        MessageBox.Show("영문자만 입력해 주세요.");
    }
}

 

텍스트박스에 숫자만 입력하기

private void textBox1_KeyPress(object sender, System.Windows.Forms.KeyPressEventArgs e)
{
    if(!(Char.IsDigit(e.KeyChar)) && e.KeyChar != 8)
    {
        e.Handled = true;
    }
}

private void textBox1_Leave(object sender, System.EventArgs e)
{
    Regex emailregex = new Regex(@"[0-9]");
    Boolean ismatch = emailregex.IsMatch(textBox1.Text);
    if (!ismatch)
    {
        MessageBox.Show("숫자만 입력해 주세요.");
    }
}

 

음.. 이렇게 두번에 걸쳐 체크한 이유는 한글은 ProcessKey이기 때문에 KeyPress 이벤트가 일어나지 않기 때문입니다. 그렇기 때문에 텍스트박스에서 포커스가 벗어날때 정규식을 이용해 한번더 체크해줘야 합니다. 키값 8번은 백스페이스 값입니다.

 

자료출처 : C#개발자싸이트 http://www.sky.ph/

Posted by blueasa

댓글을 달아 주세요


* 오래된 문서이기는 하나, 잘 정리되어 있기 때문에 번역한번 해보았습니다.
 더 추가된 포맷팅에 대해서는 MSDN을 참조하세요!

원문 : http://blog.stevex.net/string-formatting-in-csharp/

String.Format()함수를 사용하는 .NET 문자열 포맷팅에 관한 빠른 참조(quick reference)를 찾을 수 없어서, 이 문서를 만들었습니다.(이 것 때문에 문자열 포맷팅 FAQ와 이상한 이런 만화까지 만들어졌습니다.)

.NET Framework을 가지고 처음 작업했을때, 한 가지가 저를 당황케 했습니다. sprintf()가 없다는 점입니다. sprintf()는출력버퍼, 포맷팅 문자열과 몇개 인자를 받아서 원하는 형식의 문자열로 만들어 주는 C 함수입니다. 예를 들어

char szError[256];
sprintf(szError, "Error %d occurred. \n", nError);

nError가 12라고 가정한다면, 위 코드는 szError  버퍼에  "Error 12 occurred." 문자열을 쓸것입니다. 이것은 C 프로그래밍의 기본이며 명확하고 사용하기 간단하기 때문에, STL에서 더 좋은 기능을 제공하고 있지만, 대부분의 C++ 프로그래머들이 아직도 이것을 사용하고 있습니다. STL에서 위와 같은 코드는

str << "Error " << nError << " occurred." << endl;

거나, 이와 비슷할 것입니다. 이것은 type-safe이고 sprintf보다 더 객체지향적 이나, 로컬라이즈하거나 코드를 읽기가 쉽지는 않습니다.

.NET Framework은  문자열을 아주 휼륭하게 처리하나, 익숙해지는데 시간이 걸립니다. .NET에서 sprintf와 거의 동등한 기능을 가진 것은 포맷 문자열과 인자를 받아 출력 문자열을 생성하는, 정적 String.Format 함수 입니다. (이것은 출력버퍼에 오버플로우를 발생시키지 않는 다는 점에서 sprintf보다 훨씬 개선된 것입니다.) 예를 들면 위와 비슷한 코드는

string errorString = String.Format("Error {0} occurred.", nError);

입니다. 메타데이터의 능력때문에 .NET 환경에서는 포맷팅할때 데이터타입이 무엇인지 알려주는 문자열을 필요로 하지 않고, 사용하기 원하는 곳에 위치만 시키면 됩니다. (일반적인 sprintf 버그는 잘못된 데이터 타입을 제공하는 것으로, %d대신에 %s를 사용하는것을 막을 수 없으며, 이것은 sprintf가 호출될때 프로그램을 멈추게 할 것이다.)

위 문자열안의 {0}은 nError의 값으로 대체되지만, 이진수로 지정해서 지정해서 사용하려 한다면? 또는 16진수와 같은 것을 사용하려 한다면? Framework은 이러한 모든것들을 지원하지만, 문자 포맷팅을 사용하는 String.Format 함수를 사용하지 않고, 지정된 타입을 사용한다는 것이 혼란스러워 보일 수 도 있습니다.

모든 객체가 문자열을 반활할때 ToString 메소드가 호출됩다. ToString 메소드는 문자열 인자들을 받을 수 있고 - String.Fromat을 호출한 후, "{0:##}"가 같은 포맷팅 문자열들이 위치에 전달된 후 어떻게 포맷팅 될지 알려줍니다.

중괄호 안의 텍스트는 {Index[, alignment][:formatString]} 입니다. 만약 alignment가 양수이면, 텍스트는 오른쪽 정렬되며, 텍스트가 양수보다 작다면 공백이 추가됩니다. 만약 음수라면 왼쪽 정렬됩니다.

문자열

정렬을 제외하고는 문자열에 어떤 포맷팅도 적용되지 않습니다. 정렬의 모든 인자들은 String.Format이 호출될때, 사용되고 표시됩니다.

 예시 결과 
 String.Format("->{0,10}<-", "Hello");  ->   Hello<-
 String.Format("->{0,-10}<-", "Hello");  ->Hello    <-

숫자

기본적인 숫자 포맷팅 지정자입니다.

지정자  타입  형식  결과(1.42일 경우)  결과(-12400일 경우) 
 c  통화  {0:c}  $1.42  -\12,400
 d  10진수  {0:d} System.FormatException  -12400
 e  지수  {0:e}  1.420000e+000  -1.240000e+004
 f  고정소수점  {0:f}  1.42  -12400.00
 g  일반  {0:g}  1.42  -12400
 n  천단위로 ","로 구분
 되는 숫자
 {0:n}  1.42  -12,400
 r  라운드트립  {0:r}  1.42  System.FormatException
 x  16진수  {0:x4}  System.FormatException  cf90

* 라운드트립 :
이 형식은 SingleDouble 형식에만 사용할 수 있습니다. 라운드트립 지정자는 문자열로 변환된 숫자 값이 같은 숫자 값으로 다시 구문 분석될 수 있도록 보장해 줍니다. 이 지정자를 사용하여 숫자 값 형식을 지정하면 Double에는15자리의 전체 자릿수를, Single에는 7자리의 전체 자릿수를 가진 일반 형식을 사용하여 숫자 값을 먼저 테스트합니다. 이 값이 같은 숫자 값으로 다시 구문 분석되면 일반 형식 지정자를 통해 형식이 지정됩니다. 그러나 이 값이 같은 숫자 값으로 다시 구문 분석되지 못하면, Double에는 17자리 전체 자릿수를, Single에는 9자리 전체 자릿수를 사용하여 이 값의 형식이 지정됩니다.전체 자릿수 지정자가 있더라도 무시됩니다. 이 지정자를 사용할 때는 라운드트립이 전체 자릿수보다 우선합니다. - MSDN

사용자정의 포맷팅 입니다.

 지정자 타입   예시  결과(1500.42일 경우) 설명 
 0  0 자리 표시자  {0:00.0000}  1500.4200  지정된 자릿수만큼 0을
 추가한다.
 #  10진수 자리 표시자  {0:(#).##}  (1500).42  
 .  소숫점  {0:0.0}  1500.4  
 '  천자리 구분 기호  {0:0,0}  1,500  반드시 두 0사이에 있
 어야 한다.
 '.  숫자 스케일링  {0:0,.}  2  1000을 기준으로, 해당
 숫자의 스케일을 알려
 준다. 예를 들면 1499
 는 1이고, 1500은 2이
 다.
 %  비율  {0:0%}  150042%  100을 곱하고 %기호를
 붙인다.
 e  지수 자리 표시자  {0:00e+0}  15e+2  많은 지수표현이 가능
 합니다.
 ;  그룹 구분자  하단 참조    

그룹구분자는 음수값을 괄호로 묶는것이 필요로 하는 통화 값 형식에 유용합니다. 이 통화 형식 예제는 문서의 하단에 있습니다.

날짜

날짜 포맷팅은 시스템의 국가별 설정에 따라 다릅니다. 아래 예는 저의 로컬 로케일 설정에 의한 것입니다.

 지정자 타입  예(System.DateTime.Now일 경우) 
 d  짧은 날짜  2009-11-02
 D  긴 날짜  2009년 11월 2일 월요일
 t  짧은 시간  오후 4:30
 T  긴 시간 오후 4:30:06
 f  전체 날짜 시간  2009년 11월 2일 월요일 오후 4:30
 F  긴 전체 날짜 시간  2009년 11월 2일 월요일 오후 4:30:06
 g  기본 날짜 시간  2009-11-02 오후 4:30
 G  긴 기본 날짜 시간  2009-11-02 오후 4:30:06
 M  월 날짜 패턴  11월 2일
 r  RFC1123 날짜 문자열  Mon, 02 Nov 2009 16:30:06 GMT
 s  정렬가능한 날짜 문자열  2009-11-02T16:30:06
 u  정렬가능한 유니버셜 날짜 시간 패턴,
 로컬타임
 2009-11-02 16:30:06Z
 U  정렬가능한 유니버셜 날짜 시간 패턴,
 GMT
 2009년 11월 2일 월요일 오전 7:30:06
 Y  년 월 패턴  2009년 11월

사용자 지정 날짜 포맷팅

 지정자 타입   예시 결과 
 dd  일  {0:dd}  02
 ddd  요일  {0:ddd}  월
 dddd  전체 요일  {0:dddd}  월요일
 f, ff, ...  초 유효자릿수  {0:fff}  366
 gg, ...  시대  {0:gg}  서기
 hh  2자리 시간  {0:hh}  04
 HH  2자리 시간, 24시간 형식  {0:HH}  16
 mm  00-59 분  {0:mm}  43
 MM  01-12 월  {0:MM}  11
 MMM  월 약어  {0:MMM}  11
 MMMM  월 이름  {0:MMMM}  11월
 ss  00-59 초  {0:ss}  47
 tt  AM, PM  {0:tt}  오후
 yy  2자리 년  {0:yy}  09
 yyyy  년  {0:yyyy}  2009
 zz 2자리  타임존 옵셋  {0:zz}  +09
 zzz  타임존 옵셋  {0:zzz}  +09:00
 :  구분자  {0:hh:mm:ss}  04:43:47
 /  구분자  {0:dd/MM/yyyy}  02-11-2009

열거형

 지정자  타입
 g  열거자 이름을 문자열로 가져올 수 있으면, 문자열로 그렇지
 않으면 정수로 보여줍니다.
 f  열거자 이름을 문자열로 보여줍니다.
 d  열거자 이름을 정수로 보여줍니다.
 x  열거자 이름을 8자리의 16진수로 보여줍니다.

유용한 예제들

String.Format("{0:$#,##0.00; ($#,##0.00); Zero}", value);

이것은 만약 1243.50을 전달하면, "$1,240.00"을 반환할 것입니다. 만약 -값이 전달된다면, 괄호안에 같은 형태의 결과값이 반활될 것입니다.("($1,240.00)") 만약 0이 전달된다면 "Zero"가 반환될 것입니다.

String.Format({0:(###) ###-####}", 8005551212);

이것은 "(800) 555-1212"를 반환할 것입니다.


Posted by blueasa

댓글을 달아 주세요

C# 관련 사이트

Programming/C# / 2010. 5. 20. 14:05

Posted by blueasa
TAG c#

댓글을 달아 주세요

C# 강좌 사이트

Programming/C# / 2010. 5. 14. 19:37

http://www.jabook.org/

http://www.hoonsbara.com/


Posted by blueasa

댓글을 달아 주세요






2. codeproject(코드프로젝트) http://www.codeproject.com/

각종 오픈 소스/라이브러리를 다운받을 수 있음



3. c-sharpcorner(시샾코너) http://www.c-sharpcorner.com/Default.aspx

각종 오픈 소스/라이브러리를 다운받을 수 있음



4. Devpia(데브피아) http://www.devpia.com/CSharp.MAEUL

기초 강좌, 예제소스, 그리고 활발한 Q&A가 이뤄지는 국내 커뮤니티 싸이트




기초 강좌, 예제소스, 그리고 활발한 Q&A가 이뤄지는 국내 커뮤니티 싸이트


 

출처 : http://youngik.tistory.com/entry/C-공부하기-도움되는-각종-Source-다운-라이브러리-참조-싸이트

Posted by blueasa

댓글을 달아 주세요