<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0">
 <title type="html">소소리 바람</title>
 <id>http://sosori.com/atom</id>
 <link rel="alternate" type="text/html" hreflang="ko" href="http://sosori.com/"/>
 <subtitle type="html"></subtitle>
 <updated>2010-07-30T15:53:55+09:00</updated>
 <generator>Textcube.com 2.0 Garnet</generator>
 <entry>
  <title type="html">멤버 함수를 쓰레드 함수로 만들기</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/137"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/137" thr:count="0"/>
  <category term="Programming Language"/>
  <category term="C/C++"/>
  <category term="Programming"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/137</id>
  <updated>2010-07-29T19:44:12+09:00</updated>
  <published>2010-07-29T19:44:12+09:00</published>
  <summary type="html"> 오늘은 간단한 C++ 프로그래밍 기법에 대해 하나 써볼까 합니다. &amp;nbsp; 간단한 기교를 부려볼 겸 클래스의 멤버함수를 쓰레드 함수로 작성하는 방법을 배워 보도록 하겠습니다. (간단히 쓰레드 사용법도 배우고 일석이조! 야호! ) &amp;nbsp; 아직까진 그런 적은 없지만, 쓰레드를 돌릴 때 간간히 멤버함수를 쓰레드 함수로 제작하고플 때가 있더군요. 혹, 그런 분들을 위해 알려 드리겠습니다. &amp;nbsp; &amp;nbsp;class TestClass { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;INT B; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; VOID TestFunction( INT A ) { B = A }; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //이 함수를 쓰레드로 돌리고자 합니다. &amp;nbsp; &amp;nbsp;&amp;nbsp; VOID Start(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; //이 함수에서 TestFunction을 호출하지요. &amp;nbsp; }; &amp;nbsp; &amp;nbsp;Start() 멤버 함수에서 TestFunction()을 쓰레드로 돌리고자 한다고 해보죠. &amp;nbsp; &amp;nbsp;VOID TestClass ::Start() { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &amp;amp;TestFunction, NULL, NULL, NULL ); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // ........ 무엇가의 작업을 하고. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WaitForSingleObject( hThread, INFINITE ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CloseHandle( hThread ); } &amp;nbsp;&amp;nbsp; 물론 안됩니다. 쓰레드로 돌아갈 &amp;nbsp;함수는 정적으로 선언되어야 하며 정적 함수여야 하죠. 따라서, &amp;nbsp; &amp;nbsp;class TestClass { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; static VOID WINAPI TestFunction( INT A ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 이제 원래 의도대로 이 함수를 정적 함수로 제작합니다. &amp;nbsp; &amp;nbsp;&amp;nbsp; VOID Start(); &amp;nbsp; }; &amp;nbsp; 역시 물론 안됩니다. 직접 닥쳐보시면 알겠지만, 우리가 돌리고자 했던 TestFunction 함수에서는 B라는 비정적 멤버를 참조하고 있습니다. &amp;nbsp; 결국은 다른 방법을 찾아야 합니다. &amp;nbsp; &amp;nbsp;class TestClass { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; VOID TestFunction( INT A ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp;//다시 원래대로 돌리고 &amp;nbsp; &amp;nbsp; &amp;nbsp;static VOID WINAPI TestFunctionThread( LPVOID ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;//대신 쓰레드가 돌아갈 정적 함수를 만듭니다. &amp;nbsp; &amp;nbsp;&amp;nbsp; VOID Start(); &amp;nbsp; }; &amp;nbsp; VOID Start() { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &amp;amp;TestFunctionThread, this, NULL, NULL ); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // ........ 무엇가의 작업을 하고. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WaitForSingleObject( hThread, INFINITE ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CloseHandle( hThread ); &amp;nbsp; } &amp;nbsp; VOID WINAPI TestFunctionThread( LPVOID p ) { &amp;nbsp; &amp;nbsp; &amp;nbsp; ( &amp;nbsp;(TestClass* ) p )-&amp;gt;TestFunction( 3 ); } &amp;nbsp; &amp;nbsp; 자, 위 예를 통해 해결했습니다. 포인터. 즉 동적 호출을 통해서 정적 멤버 함수를 호출하였습니다. &amp;nbsp; TestFunction의 인자 값도 동적으로 주고 싶다면,&amp;nbsp; &amp;nbsp; &amp;nbsp;struct Arg { &amp;nbsp; &amp;nbsp; &amp;nbsp; TestClass* p; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; INT A; }; &amp;nbsp; VOID Start() { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Arg arg = { this, 3 }; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; HANDLE hThread = ( HANDLE ) __beginthread( NULL, 0, &amp;amp;TestFunctionThread, &amp;amp;arg, NULL, NULL ); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // ........ 무엇가의 작업을 하고. &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;WaitForSingleObject( hThread, INFINITE ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;CloseHandle( hThread ); &amp;nbsp; } &amp;nbsp; VOID WINAPI TestFunctionThread( LPVOID p ) { &amp;nbsp; &amp;nbsp; &amp;nbsp; Arg* pArg = ( Arg* ) p; &amp;nbsp; &amp;nbsp; &amp;nbsp; pArg-&amp;gt;p-&amp;gt;TestFunction( p-&amp;gt;A );&amp;nbsp; &amp;nbsp; &amp;nbsp; }&amp;nbsp; &amp;nbsp; &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/137&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">Visual C++ 유용한 팁 정리</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/136"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/136" thr:count="1" thr:updated="2010-05-01T20:15:31+09:00"/>
  <category term="Programming Language"/>
  <category term="MFC"/>
  <category term="VC++"/>
  <category term="&#xD301;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/136</id>
  <updated>2010-03-31T14:13:50+09:00</updated>
  <published>2010-03-31T14:13:50+09:00</published>
  <summary type="html"> &amp;lt;Visual C++의 유용한 단축키&amp;gt; * Ctrl+F3 : 현재 커서가 있는 위치의 단어가 나오는 다음 위치를 찾아줍니다. Ctrl+Shift+F3을 누르면 이전 걸 찾아주죠. * Ctrl+H : replace입니다. 특히 일정부분안의 변수 이름을 변경하거나 할 때 범위를 선택한 다음에 Ctrl+H를 누르면 편하죠. * Ctrl+], Ctrl+E : 괄호 짝을 맞춰줍니다. {위에서 누르면 짝이 맞는 }를 찾아주지요. * Ctrl+L : 한줄을 잘라냅니다. -&amp;gt; 클립보드로 * Ctrl+Shift+L : 한줄을 지웁니다. * Ctrl+J, K : #ifdef ... #endif 쌍을 찾는데 사용합니다. * 그외 Ctrl을 누르고 커서나 Delete, Backspace를 누르면 단어 단위로 동작을 하게 됩니다. * Alt+F8 : 인덴트 정리. 일정 범위를 선택하고 누르면 라인 앞부분의 공백을 자동으로 조정해줍니다. * CTRL+SHIFT+T : 커서 위치의 단어와 앞 단어가 서로 교체 됩니다. * ALT+SHIFT+T : 커서 위치의 한줄과 윗줄이 서로 교환됩니다. * Shift + F9 : 디버그 모드에서 추가하고픈 변수나 등등 앞에 커서를 위치 시킨후 Shift+F9를 누르면 Watch Window에 자동으로 추가. * Ctrl + Alt + T , Ctrl + Spacebar : 멤버목록 팝업창이 나타납니다 (참고로 대소문에 관계없습니다.) * Ctrl + Shift + U : 소문자를 대문자로 바꾸고 싶을때 블럭 지정을 한다음 이 키를 누르면 소문자가 대문자로 둔갑. * Ctrl + U : 대문자를 소문자로 변경 * Ctrl + Shift + 8 : Tab은 ^모양으로 공백문자는 .로 변경, 다시 누르면 설정이 해제 &amp;lt;ALT+F4로 종료안되게 하려면&amp;gt; BOOL MyApp::PreTranslateMessage(MSG* pMsg) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if(pMsg-&amp;gt;message == WM_SYSKEYDOWN &amp;amp;&amp;amp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pMsg-&amp;gt;wParam == VK_F4) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return TRUE; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } } 이 함수를 오버라이드 하여서 집어넣으면 됩니다. &amp;nbsp; &amp;lt;제일 짧은, 파일 크기 알아내는 함수&amp;gt; 일단 제가 본 방법들을 열거해 보겠습니다. &amp;nbsp; &amp;nbsp; &amp;nbsp; 1] 파일을 열고, 파일 끝으로 위치를 옮겨서 그 위치값을 읽는다. &amp;nbsp; &amp;nbsp; &amp;nbsp; 2] 파일을 fopen()이 아닌 open()으로 열어서 핸들을 얻은 다음 그것을 이용해서 filelength()함수로 파일 크기를 구한다. 간단하니 결론만 말씀드리죠. 저는 다음과 같이 파일 크기를 구합니다. &amp;nbsp; &amp;nbsp; &amp;nbsp; fileSize = filelength( fileno(fp) ); fp는 FILE *fp; 로 정의된 파일 포인터입니다. 물론 fopen()으로 파일을 연 상태에만 가능합니다. 그러나 파일 크기를 구한다는 것이 DIR프로그램이 아닌 이상 파일을 열고나서 구하는 거 아니겠습니까? &amp;lt;클래스 이름 등록방법&amp;gt; PreCreateWindow(CREATESTRUCT&amp;amp; cs)에서 cs.lpszClass를 변경해주면 될 것 같은데 잘되지 않는 경우가 있습니다. 이부분에서 사용자들이 헤매는 경우가 많이 있죠. 다음의 코드를 활용하시면 잘되실 겁니다. BOOL CTestDlg::PreCreateWindow(CREATESTRUCT&amp;amp; cs) { &amp;nbsp; &amp;nbsp;&amp;nbsp; if(!CWnd::PreCreateWindow(cs)) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return FALSE; &amp;nbsp; &amp;nbsp;&amp;nbsp; HINSTANCE hInst=AfxGetInstanceHandle(); &amp;nbsp; &amp;nbsp;&amp;nbsp; WNDCLASS wc; &amp;nbsp; &amp;nbsp;&amp;nbsp; ::GetClassInfo(hInst, cs.lpszClass, &amp;amp;wc); &amp;nbsp; &amp;nbsp;&amp;nbsp; wc.lpszClassName=cs.lpszClass=&amp;quot;MyClass&amp;quot;; &amp;nbsp; &amp;nbsp;&amp;nbsp; return AfxRegisterClass(&amp;amp;wc); } &amp;lt;외국 리소스를 한글 리소스로 수정하기&amp;gt; 1. 간단하게 고치기 영국인가 에서 만든 소스를 분석하다가 리소스를 볼려고 누르니 언어가 다르다고 안나오더군요 계속 고민하다가 이럴 때는 rc화일에서 원래 코드 //***************************************************** #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) #ifdef _WIN32 LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US #pragma code_page(1252) #endif //_WIN32 //***************************************************** 한국말로 수정한뒤 코드 //****************************************************** #if !defined(AFX_RESOURCE_DLL)||defined(AFX_TARG_KOR) #ifdef _WIN32 LANGUAGE LANG_KOREAN, SUBLANG_DEFAULT #pragma code_page(949) #endif//_WIN32 //****************************************************** 이렇게 수정해주니 코드가 나오더군요. 물론 다아시겠지만 열기에서 rc화일을 text로 열어서 수정해주셔야겠지요 2. 근본적 해결방법 다 아시겠지만 VC++은 다국어 리소스를 지원합니다. 외국에서 만든 샘플 예제를 Down받아서 리소스를 오픈할때 현재 시스템의 코드 페이지와 다르면 오픈되지를 않습니다. 지원하지 않는 코드 페이지 때문에 리소스가 제대로 오픈되지 않는다면 해당하는 코드 페이지의 .nls(National Language Support)파일을 시스템에 복사해 넣어주면 됩니다. 해당 nls파일은 Win95/98 CD에 있고 이파일(예:cp_1252.nls)을 windows system 폴더안에 복사한 후 레지스트리(\HKEY_LOCAL_MACHINE\System\CurrentControlSet\control\Nls\Codepage)에 수동으로 등록시켜 주면 됩니다. &amp;lt;F10 키를 처리하기&amp;gt; 도스시절 프로그램에서 F10 키는 주로 풀다운 메뉴를 띄우는데 사용됩니다. 그래서 우리는 F10 으로 메뉴를 뛰우는데 익숙하죠. 윈도에서도 마찬가지로 F10 키가 메뉴를 활성화시키는데 사용되죠. F10 키가 메뉴를 활성화 하는 것을 막고 나의 고유 기능을 실행하게 할려면 어떻게 해야 하죠? 몇가지 방법이 있는데... 1.- SetWindowsHookEx() 의 사용 키보드의 행동을 바꾸기 위해서 SetWindowsHookEx 함수를 사용하는 것입니다.우선 키보드 훅(Hook)을 작성하고 쓰레드 전반에 이 훅을 설치하는 것이죠.코딩이 좀 까다롭지만..오버헤드가 별루 없기 때문에 ..가장 좋은 제안이 될것입니다. 2.- PreProcessMessage() 와 WM_SYSKEYDOWN 테스트 메시지 선처리기인 PreProcessMessage 에서 WM_SYSKEYDOWN 메시지가 발생했을때 F10 키인지 확인하는 것입니다.그러나 매번 조사해야 하기 때문에 (모든 키에 대해서..) 많은 오버헤드를 발생시켜 속도저하를 가져옵니다. 3.- F10 키에 대한 억셀레이터 테이블 작성 추천할만한 다른 좋은 방법입니다. 그러나 잘 안먹힐때가 있어서. 4.- OnSysKeyDown() 핸들러에서 F10 테스트 문서화되어 있는 방법이죠...그런데 ...이해할수 없는건.. MFC 에서는 F10 키에 대한 SysKeyDown 메시지를 SDI View 에 보내지 않습니다. 문제의 소지가 되죠. &amp;lt;ESC키로부터 Dialog 사라짐을 방지&amp;gt; ESC키로부터 Dialog 사라짐을 방지하려면 // 멤버 변수 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; BOOL m_bClose // 생성자 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_bClose = FALSE; // OnClose void CKeyDlg::OnClose() { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; m_bClose = TRUE; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CDialog::OnClose(); } // WindowProc LRESULT CKeyDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( message == WM_COMMAND &amp;amp;&amp;amp; wParam == WM_DESTROY ) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if( m_bClose == FALSE ) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return NULL; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // esc키로 부터 다이얼로그 사라짐을 방지 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 요길 FALSE(NULL)로 막아주면 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // (정상적으로는 아래 return 값이 1로 됨) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 다음에 message WM_DESTROY, WM_NCDESTROY가 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 날아오지 않아 종료 되지 않음 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return CDialog::WindowProc(message, wParam, lParam); } /// 참고 // dialog에서 esc 또는 close 버튼은 &amp;nbsp;message - 111, wParam - 2 가 날아옴 // return 값이 TRUE 이면 // message - 2에 이어 message -82가 날아옴 //#define WM_COMMAND &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0111 //#define WM_DESTROY &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0002 //#define WM_NCDESTROY &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0082 //#define WM_CLOSE &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;0x0010 /* Enter 키 */ 버튼 중에 Property에 Default라고 체크가 된 것이 있을 것입니다. 버튼중 하나만이 이 속성을 가질 수 있는데 Enter키를 치면 이 버튼이 실행됩니다. Default로 IDOK버튼이 먹게 되지요. 해서 다른 버튼에 이속성을 주거나 IDOK버튼의 &amp;nbsp;함수를 고치세요. &amp;lt;fscanf()에서 쓸데 없는 값 읽지않고 버리기&amp;gt; 화일명: aaa.dat 자료: 1 2.0 3 이럴경우 자료를 fscanf()로 읽어 들일 때 불필요한 자료가 있을 수 있습니다. 만약 위의 데이터를 읽어 들인다면 -&amp;gt; 실제로 2.0은 필요 없는 자료라 가정하고 int a, b; float dummy; FILE* fp; if((fp = fopen(&amp;quot;aaa.txt&amp;quot;, &amp;quot;r&amp;quot;))== NULL) &amp;nbsp;&amp;nbsp; return; fscanf(&amp;quot;%d %f %d&amp;quot;, &amp;amp;a, &amp;amp;dummy, &amp;amp;b); fclose(fp); 일반적으로 필요없는 2.0도 dummy라고 읽어 들인다음 버립니다. 이런 쓸데가 없는 데이터를 읽어 들이면 시간도 낭비고... 에구 코드도 복잡하고.... 이럴 경우 *를 사용하시면 아주 좋죠... ^^; fscanf(&amp;quot;%d %*f %d&amp;quot;, &amp;amp;a, &amp;amp;b); 요렇게 바꾸면 실수형 자료가 나오면 그냥 넘어 가요... 각각의 데이터 자료형만 맞추어 주면 그냥 안읽고 넘어간 다음에 그 다음 데이터를 읽지요 자신이 만든 데이터라면 이런 경우가 없겠지만 남이 만든 데이터를 읽어 올 경우에 자기에게 불필요한 데이터가 생길 경우 일일이 다 읽어서 버린다면 넘 짜증 나겠지요 ^^; &amp;lt;Toggle 기능 구현하기&amp;gt; 버튼을 누를 경우 서로 토글되는 기능을 구현 하겠습니다. static int rwflg = 1; rwflg = !rwflg;//가장 중요 if(rwflg) { &amp;nbsp; &amp;nbsp; &amp;nbsp; // 버튼을 누를 경우 두번째 실행. } else { &amp;nbsp; &amp;nbsp; &amp;nbsp; //버튼을 누를 경우 처음 실행 } &amp;lt;한글 윈도우에서 일본어 프로그램 빌드하기&amp;gt; 일단. 리소스는 당연히 일본어 코드로 변환되어 있어야 합니다. 한글 윈도우에서 보면 코드가 깨져 보이겠지요? 코드 변환 방법은 Microsoft Word 같은 걸 이용하셔도 되고, 아니면 프로그램을 만드셔도 되구요.. 가능하면 리소스 작업은 일본어 윈도우에서 하시기를 권합니다. Copy&amp;amp;Paste 로 했는데도, 일부코드가 깨어지는 문제가 있더라구요.. 정확히 이유는 모르겠지만, 리소스의 Text 를 붙여넣는 작업은 가능한한 일본어 윈도우에서 하시기를 권합니다. 그리고 빌드하실 프로젝트의 리소스 파일(*.rc 파일) 에는 한국어가 있으면 절대로 안됩니다!! 테스트를 위해서 몇개의 다이얼로그만 일본어로 바꿨는데 빌드가 안되더군요.. 반드시 전체 리소스 파일에는 영어 아니면 일본어 코드만 존재 해야 합니다. 그리고 Resource file (rc 파일들)의 내용을 다음과 같이 바꾸시면 됩니다. 모든 부분을 바꾸어야 하는지는 확실치 않지만, 일단 이렇게 바꾸면 빌드랑 실행에 문제는 없습니다.. 1. #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_KOR) 를 &amp;nbsp; &amp;nbsp; #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_JPN) 으로... 2. LANGUAGE 18, 1 를 &amp;nbsp; &amp;nbsp; LANGUAGE 17, 1 로... 3. #pragma code_page(949) 를 &amp;nbsp; &amp;nbsp; #pragma code_page(932) 로... 4. l.kor\\afxres.rc 를 &amp;nbsp; &amp;nbsp; l.jpn\\afxres.rc 로.. 이상입니다.. ^^.. 도움이 됐을까요?? 그리고 주의하실 점은 Font 입니다.. 일본의 폰트에 맞추어 크기랑 이름을 정해줘야만 하지요.. &amp;lt;#과 ##&amp;gt; &amp;#039;##&amp;#039;에 대안 질문이 나온 김에 &amp;#039;#&amp;#039;과 &amp;#039;##&amp;#039; 대해 이야기를 한번 해볼까 합니다. 먼저 #부터 시작하겠습니다. #은 C/C++에서 많이 나오는 기호죠. #include 랄지, #define 이랄지. 그런데, #이 다른 용도로 쓰이는 경우가 있습니다. 다음과 같은 코드가 있습니다. #include &amp;lt;stdio.h&amp;gt; #define STRING(a) printf(a) void main(){ &amp;nbsp; &amp;nbsp; STRING(trowind); } 매크로를 아시는 분이라면 위에 코드가 어떻게 변환되는지 아실 겁니다. STRING(trowind) 부분이 printf(trowind)로 바뀌겠죠. (이 변환은 preprocessor에서 담당합니다. 자세한 내용은 &amp;#039;Preprocessor&amp;#039; 또는 &amp;#039;전처리기&amp;#039;에대한 자료를 참고하세요.) 이건 명백히 컴파일 에러입니다. trowind라는 변수가 없으니까요. 그럼 이제 STRING() 매크로 함수를 다음과 같이 바꿔보겠습니다. #define STRING(a) printf(#a) 바꾼거라고는 &amp;#039;a&amp;#039; 앞에 #를 붙인 것 밖에 없습니다. 그러면 위의 STRING(trowind) 는 다음과 같이 바뀝니다. printf(&amp;quot;trowind&amp;quot;) 즉 #의 용도는 매크로에서 치환되는 문자열에 큰따옴표를 붙여주는 것입니다. 이걸 잘 이용하면 다음과 같은 기능을 구현할 수 있죠. #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdlib.h&amp;gt; // MFC에도 ASSERT란 매크로가 있기 때문에 MY_ASSERT로 합니다. #defien MY_ASSERT(a) if ( !a ) { printf(&amp;quot;Error : &amp;quot;); printf(#a); } void main() { &amp;nbsp; &amp;nbsp; int a = 0; &amp;nbsp; &amp;nbsp; int b = 1; &amp;nbsp; &amp;nbsp; MY_ASSERT(a &amp;gt; b) } (결과는 직접 확인해 보시기 바랍니다.) ##은 #과는 다르게 작동합니다. ##은 주어진 문자열을 그대로 바꿔줍니다. 예를 들어보죠. 다음과 갈은 매크로가 있습니다. #define RUNTIME_CLASS(class_name) class##class_name; 그럼 다음과 갈이 됩니다. RUNTIME_CLASS(CMyDocument) -&amp;gt; classCMyDocument ##은 그 사용 예를 찾기가 쉽진 않죠. 하지만, MFC에서는 이 ##을 기가막히게 잘 사용합니다. &amp;nbsp;MFC로 애플리케이션을 만들 때 기본적으로 만들어지는 클래스 중에 View나 Document 클래스에 보면 DECLARE_DYNCREATE, IMPLEMENT_CYNCREATE 매크로가 있습니다. 이 매크로를 한번 분석해 보세요. &amp;lt;드라이브 포맷하기&amp;gt; MSDN에는 설명이 하나도 없네요.. DWORD WINAPI SHFormatDrive(HWND hwnd, UINT drive, UINT fmtID, UINT option) 이런 형식입니다..드라이브는 ID가 0=A, 1=B,2=C.... fmtID는 -1이구여.. option은 0 - 빠른포맷 1 - 전체포맷 2 - 시스템 디스크 작성 &amp;lt;에디트박스에서 커서를 임의의 위치에&amp;gt; 음.. 에디트 박스에서 커서를 뒤쪽이나.. 임의의 위치에 놓을 수 있는 방법을 물어 보시는 분께 도움될 자료입니다. 1. 커서를 맨 끝에 SetSel(-1, -1); 2. 커서를 임의의 위치에 SetSel(n, n); ====================================== 1. 응용할 멤버 함수 ====================================== 에디트 박스의 멤버 함수중에서 커서를 임의의 위치에 놓을 처리를 하는 함수는 SetSel( ... ) 과 ReplaceSel( ... ) 입니다. 두 함수는 많이 사용되기 때문에 아시고 계시리라 믿~~습니다. &amp;nbsp; ex) 에디트 박스의 멤버 변수를 다음과 같이 정의된 상태에서 예를 들어 가면서 설명을 드립니다. &amp;nbsp; &amp;nbsp; &amp;nbsp; CEdit &amp;nbsp; 변수 m_editMyBox; &amp;nbsp; &amp;nbsp; &amp;nbsp; CString 변수 m_strMyBox; ====================================== 2. 커서를 맨 뒤쪽에 놓기 ====================================== &amp;nbsp; 커서를 맨 뒤쪽에 놓는 방법은 의외로 간단 합니다. &amp;nbsp;&amp;nbsp; UpdateData( TRUE ); &amp;nbsp; //--&amp;gt; 전체를 선택 &amp;nbsp; m_editMyBox.SetSel( 0, -1 ); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; //--&amp;gt; 현재의 데이터로 다시 치환 &amp;nbsp; m_editMyBox.ReplaceSel( m_strMyBox ); &amp;nbsp; //--&amp;gt; 포커스를 에디트 박스로 설정 &amp;nbsp; m_editMyBox.SetFocus(); 이렇게 처리하시면 커서가 데이터의 제일 끝에 놓일 겁니다. ====================================== 3. 커서를 임의의 자리에 놓기 ====================================== 방법은 마찬가지로..SetSel(..) 과 ReplaceSel(...)을 이용하는 것인데요.. 어떤 형태로 응용할 수 있냐 하면.. &amp;nbsp; SetSel( 시작 위치, 끝 위치, ..?? 안살펴 봤음..세번째 인자)에서 보면, 시작 위치를 처음(0)으로 하고 끝 위치를 커서가 놓이고자 하는 위치로 지정한 후에, 현재의 데이터를 처음부터 커서가 놓이고자 하는 위치까지 다른 버퍼에 복사한 후에, ReplaceSel로 복사 합니다. 소스 코드를 보시면 더 쉬우실 겁니다. UpdateData( TRUE ); //--&amp;gt; 커서가 놓일 위치까지 복사할 임시 버퍼(크기는??) char cDataBuf[100]; //--&amp;gt; 쓰레기 값을 방지하기 위해.. 초기화 for( int i=0; i&amp;lt;100; i++ ) &amp;nbsp; &amp;nbsp;cDataBuf[i] = NULL; //--- 6번째에 커서를 위치하고 싶을 경우... for( i=0; i&amp;lt;6; i++ ) &amp;nbsp; &amp;nbsp; &amp;nbsp; cDataBuf[i] = m_strMyBox[i]; //****보충 설명.. CString 형의 데이터 같은 경우에서**** 데이터를 원할때는 버퍼 형태로 사용을 하셔도 됩니다. 음.. 무슨 말이냐 하면.. 제가 CString 형으로 선언된 멤버 변수 m_strMyBox의 데이터를 임시 버퍼에 복사하는 과정에서 m_strMyBox[i]라고 사용을 했는데.. m_strMyBox는 에디트 박스의 멤버 변수이거든요. 위와 같은 방법을 복사를 하셔도 되고.. 다른 방법도 있겠죠.. //--&amp;gt; 원하는 위치만큼 지정 &amp;nbsp; &amp;nbsp;&amp;nbsp; m_editTest.SetSel( 0, 6 ); //--&amp;gt; 바꾸면 되겠죠.. 복사된 내용으로.. &amp;nbsp; &amp;nbsp;&amp;nbsp; m_editTest.ReplaceSel( cDataBuf ); //--&amp;gt; 포커스를 놓으면.. 끝.. &amp;nbsp; &amp;nbsp;&amp;nbsp; m_editTest.SetFocus(); 이렇게 처리하면.. 에디트 박스에서 제일 끝이나 임의의 자리에 커서를 놓을 수 있군요.. &amp;lt;릴리즈 버젼 실행시 런타임 에러 찾아내기&amp;gt; 릴리즈 버젼 실행시 에러가 났을 경우..참 곤란했죠. 물론 고수님들께서야 이미 알고계시겠지만.. 나름대로 엄청 가슴이 아팠습니다. 디버그모드는 괜찮은데..릴리즈는 에러를 때리구..어디서 나는지조차 모르겠구...그때 쓸만한 잼있는 방법입니다.(물론 모르는 분에 한해서..^^) Step 1. 프로젝트 세팅 들어가면.. Link라는 탭 선택해서..보면 Generate Mapfile이라구 있을꺼랍니다. 고걸 선택해서 샥 돌려보면..map파일이 release디렉토리에 생기죠. Step 2. 그리구 나선..에러를 만들어 돌려보고, 어느 주소에서 에러가 났는지 캡춰 그리구서 map파일에 있는 주소랑 매치해 보는겁니다. 그럼 어느 함수에서 에러가 났는지 알 수 있죠~ &amp;lt;모든 Top Level Windows 에게 메세지 보내기&amp;gt; SendMessage 아시져? 거기에서 HWND 인자에 HWND_BROADCAST을 넣으면,모든 윈도우에게 메세지가 간답니다.. &amp;lt;일반적인 윈도 소멸 순서&amp;gt; MFC framework에서, 사용자가 frame 윈도를 닫게되면, 윈도는 기본적으로 OnClose 핸들을 call 한다. OnClose 내부에서는 DestroyWindow를 호출한다. 가장 마지막으로 호출되는 함수는 OnNcDestroy이다. 이 함수는 약간의 정리를 하는 함수로 윈도를 정리하기 위하여 기본적으로 불려지는 함수 이다. OnNcDestroy함수 내부에서는 PostNcDestroy함수를 호출한다. afx_msg OnClose( ) Framework은 CWnd나 application을 종료 시키기 위해서 이 함수를 마치 시그날처럼 호출한다. 내부의 기본적인 구현은 DestroyWindow를 호출한다. virtual BOOL DestroyWindow( ) Destroy Window 함수는 &amp;nbsp; 1) &amp;nbsp;CWnd내부에 있는 윈도를 destroy 한다. &amp;nbsp; 2) &amp;nbsp;또한 윈도를 해제하고 입력 포커스를 제거하기 위한 적절한 message를 윈도에게 보낸다. &amp;nbsp; 3) &amp;nbsp;윈도의 메뉴 제거 &amp;nbsp; &amp;nbsp; 4) &amp;nbsp;application queue를 비운다. &amp;nbsp; 5) &amp;nbsp;timer를 제거 &amp;nbsp; 6) &amp;nbsp;clipboard의 소유주 제거 &amp;nbsp; 7) &amp;nbsp;Clipboard-viewer chain을 끊는다. ( CWnd가 viewer chain의 맨 위에 있을 경우 ) &amp;nbsp; 8) &amp;nbsp;WM_DESTROY( OnDestroy )와 WM_NCDESTROY( OnNcDestroy ) 메시지를 윈도에게 보낸다. 하지만 아직 CWnd 객체는 destroy하지 않는다. 이 함수를 오버라이드 하더라도 이 함수를 호출하지 않아도 된다. ( 왜냐면 시스템이 알아서 호출을 해주니까..) 뭐 굳이 하고 싶다면 해도 된다. 만약 내부에 자식 윈도가 있더라도 걱정하지 말자 자식들을 먼저 destroy한 다음에 자신이 죽으니까.... afx_msg void OnDestroy() Framework이 CWnd에게 현재 CWnd가 소멸되고 있는 중이라고 알려 주기위하여 호출 한다. OnDestroy함수는 CWnd 함수가 화면에서 사라진 다음에 호출된다. OnDestroy is called first for the CWnd being destroyed, then for the child windows of CWnd as they are destroyed. It can be assumed that all child windows still exist while OnDestroy runs. afx_msg void OnNcDestroy() Client가 아닌 &amp;nbsp;영역이 destroy될 때 Frame work에 의하여 불려지는 함수이다. 윈도가 소멸될때 마지막으로 불려지는 함수이다. 기본적으로 약간의 정리를 한후, PostNcDestroy 함수를 호출한다. 대게는 이 함수를 오버라이드 하지 않지만 만약 하게되면 내부에서 상위 클래스의 OnNcDestroy를 호출해야만 한다. 그렇지 않으며녀 내부적으로 윈도를 위해 할당된 메모리가 free되지 못한다. virtual void PostNcDestroy() 윈도가 소멸된 후 OnNcDestroy함수에 의하여 불려지는 기본함수이다. 사용자들이 상속받아 만든 클래스의 정리를 위한 코드를 삽입하면 된다. ( ex. delete this; ) 위의 함수를 그냥 대충 보지 않고 세심히 본 사람이라면 이제 자신이 삽입하기를 원하는 코드를 어느부분에 삽입을 해야되는지 알 수 있을 것이다. 그럼 아래의 예를 통하여 알아보자. 먼저 View class에서는 3가지 소멸 핸들러를 제공한다. 다음을 보자. BOOL CAniView::DestroyWindow() { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // TODO: Add your specialized code here and/or call the base class &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return CView::DestroyWindow(); } void CAniView::OnDestroy() { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CView::OnDestroy(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TODO: Add your message handler code here } void CAniView::PostNcDestroy() { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // TODO: Add your specialized code here and/or call the base class &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; CView::PostNcDestroy(); } 위에 나열 된 순서가 바로 view가 닫힐 때 불려지는 순서이다. &amp;nbsp; 우리가 유심히 살펴 보아야할 부분은 TODO의 위치이다. 과연 어떤 이유에서 각각의 TODO의 위치가 결정 되는가? 만약 &amp;nbsp;윈도가 없어지기 전에 작업을 해야할 일이 있다면 &amp;nbsp; 4번 중에 코드를 삽입하자. 또한 윈도가 사라진 다음에 작업을 해야 한다면 22번 줄에 삽입을 한다. delete this 함수를 사용한다면 25번째 줄에 삽입하자. view에서는 제공되지 않지만 &amp;nbsp;OnClose 함수도 TODO의 위치를 잠시 보자. void CAboutDlg::OnClose() { &amp;nbsp; &amp;nbsp; &amp;nbsp; // TODO: Add your message handler code here and/or call default &amp;nbsp; &amp;nbsp; &amp;nbsp; CDialog::OnClose(); } &amp;lt;프로파일링[profiling]&amp;gt; 끝날때까지 어느 부분에서 어느 정도의 시간이 걸렸는지를 알 수가 있습니다.. 기타.. 다른 기능도 많이 있구요.. &amp;nbsp; 여러기능중에 function timing만 써봤거든요.. output 창에 나온 결과를 간단히 써보면.. program Statistics ------------------ &amp;nbsp; &amp;nbsp; Command line at 2001 Jan 15 08:51: &amp;quot;D:\myProg\TestApp\PropertyTest\Debug\PropertyTest&amp;quot; &amp;nbsp; &amp;nbsp; Total time: 2848.924 millisecond &amp;nbsp; &amp;nbsp; Time outside of functions: 11.820 millisecond &amp;nbsp; &amp;nbsp; Call depth: 15 &amp;nbsp; &amp;nbsp; Total functions: 141 &amp;nbsp; &amp;nbsp; Total hits: 1868 &amp;nbsp; &amp;nbsp; Function coverage: 51.8% &amp;nbsp; &amp;nbsp; Overhead Calculated 6 &amp;nbsp; &amp;nbsp; Overhead Average 6 Module Statistics for propertytest.exe -------------------------------------- &amp;nbsp; &amp;nbsp; Time in module: 2837.104 millisecond &amp;nbsp; &amp;nbsp; Percent of time in module: 100.0% &amp;nbsp; &amp;nbsp; Functions in module: 141 &amp;nbsp; &amp;nbsp; Hits in module: 1868 &amp;nbsp; &amp;nbsp; Module function coverage: 51.8% &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Func &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;Func+Child &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Hit &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time &amp;nbsp; % &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Time &amp;nbsp; &amp;nbsp; &amp;nbsp;% &amp;nbsp; &amp;nbsp; &amp;nbsp;Count &amp;nbsp;Function --------------------------------------------------------- &amp;nbsp; &amp;nbsp; 2599.647 &amp;nbsp;91.6 &amp;nbsp; &amp;nbsp; 2716.741 &amp;nbsp;95.8 &amp;nbsp; &amp;nbsp; &amp;nbsp; 44 CWinThread::PumpMessage(void) (mfc42d.dll) &amp;nbsp; &amp;nbsp;&amp;nbsp; 130.907 &amp;nbsp; 4.6 &amp;nbsp; &amp;nbsp; &amp;nbsp;131.192 &amp;nbsp; 4.6 &amp;nbsp; &amp;nbsp; &amp;nbsp;207 CWnd::DefWindowProcA(unsigned int,unsigned int,long) (mfc42d.dll) &amp;nbsp; &amp;nbsp; &amp;nbsp; 58.981 &amp;nbsp; 2.1 &amp;nbsp; &amp;nbsp; 2835.973 100.0 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;1 CDialog::DoModal(void) (mfc42d.dll) 어느 함수가 시간이 젤 많이 걸린지 나오죠.. ^^;; 프로그램짜다가 나중에 한번 돌려보면.. 어느 부분에서 퍼포먼스가 떨어지는지 확인할 수 있겠죠.. 잡설은 고만하고.. Project 메뉴 Setting에서 Link 탭을 선택하면.. Enable Profiling 에 체크하시고.. Rebuild All 하신 후에.. Build메뉴 젤 아래에 Profile해주시면.. 선택창이 뜨는데.. 선택하시고 프로그램 실행한후에.. 종료하면 output창에 결과가 나옵니다.. Windows 2000에서 profile 메뉴가 활성화되지 안된다는 분이 계시는데 해결 방법은 다음과 같습니다. Visual Studio가 설치될 때 Profile과 관련된 레지스트리 정보를 HKEY_CURRENT_USER 아래에 써넣습니다. 그래서 Visual Studio를 설치할 때 사용했던 계정으로 로그인하지 않으면 profile이 활성화되지 않습니다. 이를 해결하려면 VC를 설치할 때 접속했던 계정으로 로그인을 하던가, 아니면 레지스트리에 값을 써넣어주면 됩니다. text editor를 이용하여 a.reg라는 파일을 만들고 다음의 내용을 넣어줍니다. a.reg의 내용 REGEDIT4 [HKEY_LOCAL_MACHINE\Software\Microsoft\DevStudio\6.0\General] &amp;quot;ProfilerInstalled&amp;quot;=dword:1 이 파일을 더블클릭하면 레지스트리에 값이 써넣어지고 VC에 profile 메뉴가 활성화됩니다. 이 정보는 MSDN에서 Q224382로 찾아보시면 됩니다. &amp;lt;해상도 변경하기&amp;gt; 말 그대로 프로그래밍 상에서 현재의 해상도를 원하는데로 변경할 수 있습니다. 전역함수로 ChangeDisplaySettings 라는 함수가 있더군요. 암데서나 불러 쓸수 있죠. &amp;nbsp; 이전 해상도를 보관했다가 다시 복귀할 수 있도록 해보겠습니다. 현재의 해상도를 얻어오는 함수는 GetSystemMetrics 입니다. 먼저 현재의 해상도를 저장할 변수를 선언합니다. class CMainFrame : public CMDIFrameWnd { &amp;nbsp; &amp;nbsp; &amp;nbsp; /// 생략 &amp;nbsp; &amp;nbsp; &amp;nbsp; // Attributes &amp;nbsp; public: &amp;nbsp; &amp;nbsp; &amp;nbsp; int screenY; &amp;nbsp; &amp;nbsp; &amp;nbsp; int screenX; &amp;nbsp; &amp;nbsp; &amp;nbsp; /// 생략 } 초기화는 요렇게.. // 현재 해상도 보관 screenX = GetSystemMetrics(SM_CXSCREEN) ; screenY = GetSystemMetrics(SM_CYSCREEN) ; 인자로 받은 해상도로 변경하는 함수를 만듭니다. void CMainFrame::ChangeDisplay(int Width, int Height) { &amp;nbsp; &amp;nbsp; DEVMODE mode ; &amp;nbsp; &amp;nbsp; mode.dmBitsPerPel = 16; &amp;nbsp; // 16비트 칼라로 변경 &amp;nbsp; &amp;nbsp; mode.dmPelsWidth &amp;nbsp;= Width; &amp;nbsp; &amp;nbsp; mode.dmPelsHeight = Height; &amp;nbsp; &amp;nbsp; mode.dmFields &amp;nbsp; &amp;nbsp; = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT; &amp;nbsp; &amp;nbsp; ChangeDisplaySettings(&amp;amp;mode, CDS_FULLSCREEN ); &amp;nbsp; &amp;nbsp; ShowWindow( SW_SHOWMAXIMIZED ); } 전 16비트 칼라로만 변경하도록 했는데, 저것두 인자로 받아서 처리하면 원하는 칼라로 바꿀수 있겠죠??? 그리구 원하는 곳에서 함수를 호출~~~ &amp;nbsp; &amp;nbsp; // 1024 x 768 로 변경 &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ((CMainFrame*)AfxGetMainWnd())-&amp;gt;ChangeDisplay(1024, 768) ; &amp;nbsp; &amp;nbsp; 프로그램이 종료할때 이전 해상도로 복귀하도록 해야 겠죠? 이건 DestroyWindow() 에서 처리하면 됩니다. BOOL CMainFrame::DestroyWindow() { &amp;nbsp; &amp;nbsp; if(screenX != GetSystemMetrics(SM_CXSCREEN) || &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; screenY != GetSystemMetrics(SM_CYSCREEN)) &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ChangeDisplay(screenX, screenY) ; &amp;nbsp; &amp;nbsp; return CFrameWnd::DestroyWindow(); } 이전 해상도를 저장해뒀으니까 그걸로 다시 복귀한거죠. 암튼, 위에서처럼 작업하면 원하는 해상도로 변경시켜서 작업할 수 있죠. 참, 도움말을 뒤져보니깐 윈도우 메시지중에 WM_DISPLAYCHANGE 라는게 있더군요. 근데 이 메시지는 클래스위저드에 들어있질 않네요. 99999999WM_DISPLAYCHANGE 메세지는 직접 호출할 수는 없을 겁니다. 다만 OS가 화면 해상도가 변경되었을 때 모든 Window에게로 보내주는 Message일 겁니다. 해상도 복원시에 변수로 해상도를 가지고 있다가 복원할 필요 없이 그냥 &amp;nbsp; &amp;nbsp; ChangeDisplaySettings(NULL, 0); 이라고만 하면 화면 복원 됩니다. 이 함수는 해상도 변경만 하지 디스플레이 등록정보 자체를 바꾸진 않기 때문에 위 방식대로 함수를 호출하면 디스플레이 등록정보에 있는 해상도로 그대로 바꿔주기 때문에 더 안정적입니다. 원하는 해상도를 모니터가 받아줄수 있는지 테스트 하시고 바꿔야죠. 그 부분이 빠졌군요. EnumDisplaySettings를 이용하시면 됩니다. &amp;lt; 화면 지우기&amp;gt; 1) OnDraw 와 InvalidateRect 이용 VC++ 에는 Basic의 CLS 명령과 같은 간단히 화면을 지우는 명령이 없습니다. 이때문에 다음과 간은 방법을 사용합니다. 예를 들면 CDC::Rectangle(x1,y1,x2,y2); 으로 사각형을 그린후 안을 배경색으로 모두 채우면 지운 것과 같은 효과를 내게 됩니다. windows는 외관상 화면에 문자출력이 되어 있어도 내부적으로는 모두 이미지를 그리기 때문에 이 명령으로 화면을 지울수가 있습니다. OnDraw 함수와 InvalidateRect 함수를 사용하는 것으로도 간단하게 화면을 지울수 있습니다. 1 OnDraw 함수에 if문을 나누어 놓아서 아무 것도 표시하지 않는 기능을 넣습니다. 2 CWnd::GetclientRect 함수에서 클라이언트 영역 크기를 알아 낸다. 3 그 크기를 파라미터로 하여 InvalidateRect 함수를 실행하면 됩니다. 그럼 좀더 자세히 알아 보기로 하겠습니다. CRect myRECT; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// x1,y1,x2,y2 정보를 지정하는 오브젝트를 확보 GetClientRect(&amp;amp;myRECT); &amp;nbsp;// 클라이언트 영역의 x1,y1,x2,y2를 myRECT에 설정. InvalidateRect(&amp;amp;myRECT); // 이 사각형 영역을 다시 그리기 설정 이 처리는 클라이언트 영역 전체의 크기를 myRECT에 설정하여 그 myRECT에서 나타내는 범위를 다시 그리고 있습니다. 혹시 부분적으로 다시 그리기를 한다면, myRECT.SelRect(0,0,200,200);//클라이언트 영역의 (0,0,)-(200,200)을 지정 9InvalidateRect(&amp;amp;myRECT);//그 사각형 영역을 다시 그리기 지정. 과 같이 하면 되구요, 더욱이 &amp;quot;클라이언트 영역만&amp;quot;을 지우려고 할때에는 사전에 크기를 알아 놓지 않더라도 다음과 같이 아주 간단하 방법으로 지울수 있습니다. InvalidateRect(NULL); 2) ExtTextOut 이용 제가 알고 있기론 화면 지우는 방법 중에서 가장 빠른 걸로 알고 있습니다. 처음은 똑같습니다. CRect mRect; GetClientRect(&amp;amp;mRect); 이 다음 InvalidateRect가 아닌.. ExtTextOut을 씁니다. &amp;nbsp; 텍스트의 백그라운드 색깔을 칠하고 싶은 화면색깔로 정하고, 빈문자열을 쓰라는 겁니다. 즉(파라미터로 CDC *pDC를 받는다는 가정하에) pDC-&amp;gt;SetBkColor(필요한 색깔); pDC-&amp;gt;ExtTextOut(mRect.left, mRect.top, ETO_OPAQUE, &amp;amp;mRect, &amp;quot;&amp;quot;, 0, NULL); 이렇게 빈문자열을 죽~ 라이팅하면 문자열의 배경색으로만 칠해집니다. 말하자면 화면을 지우는 효과이죠. 디폴트를 사용하시겠다면 SetBkColor는 사용하지 않아도 됩니다. 화면을 단일색으로 지우는데는 그 이상 빠른 방법이 없죠. MFC의 CDC::FillSolidRect도 내부 소스를 보면 ExtTextOut을 사용합니다. 다만 ExtTextOut으로 사각형을 칠했을 때는 DC의 배경색이 바뀐다는 사실을 잊으면 안됩니다. 3) PatBlt 이용 WM_PAINT에서 CPaintDC dc(this); CRect rect; GetClientRect(rect); dc.PatBlt(0, 0, rect.Width(), rect.Height(), WHITENESS); - the end of this article - [출처] [본문스크랩] VC++ 유용한 Tip|작성자 choies1 &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/136&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">MFC에서의 멀티쓰레드(Multithread)</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/135"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/135" thr:count="0"/>
  <category term="Programming Language"/>
  <category term="MFC"/>
  <category term="Multithread"/>
  <category term="&#xBA40;&#xD2F0;&#xC4F0;&#xB808;&#xB4DC;"/>
  <category term="&#xC4F0;&#xB808;&#xB4DC;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/135</id>
  <updated>2010-03-30T15:08:28+09:00</updated>
  <published>2010-03-30T15:08:28+09:00</published>
  <summary type="html"> MFC에서의 Multithread &amp;nbsp; OS는 구분하지 않지만 MFC는 사용자 편의를 위하여 두 가지 형태로 지원 &amp;nbsp; 1. &amp;nbsp; &amp;nbsp; Worker thread 2. &amp;nbsp; &amp;nbsp; User Interface thread &amp;nbsp; Worker thread &amp;nbsp; ::AfxBeginThread() 함수를 이용 &amp;nbsp; CWinThread* ::AfxBeginThread( &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; AFX_THREADPROC pfnThreadProc, &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; LPVOID pParam, &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int nPriority = THREAD_PRIORITY_NORMAL, // 기본적으로 주 Process와 동일 &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; UINT nStackSize = 0, &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; DWORD dwCreateFlags = 0, &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 0 또는 CREATE_SUSPENDED &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL ); &amp;nbsp; 우선 Thread를 이용할 함수를 먼저 정의한다 &amp;nbsp; UINT ThreadFunc(LPVOID pParam) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int option = (int)pParam; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; … } &amp;nbsp; 만약 인자가 많은 경우에는 &amp;nbsp; typedef struct tagPARAMS { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ... } PARAMS; &amp;nbsp; 와 같이 한 후에 &amp;nbsp; PARAMS *pParams = new PARAMS; CWinThread *pThread = ::AfxBeginThread(ThreadFunc, &amp;amp;pParams); &amp;nbsp; 와 같이 하고 &amp;nbsp; UINT ThreadFunc(LPVOID pParam) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; PARAMS *pThreadParams = (PARAMS *)pParam; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; ... &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; delete pThreadParams; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return 0; } &amp;nbsp; 와 같이 사용하면 된다. &amp;nbsp; Thread를 잠시 중지시키고 싶을 때는 주 Process에서 &amp;nbsp; pThread-&amp;gt;SuspendThread(); &amp;nbsp; 다시 돌리고 싶을 때는 주 Process에서 &amp;nbsp; pThread-&amp;gt;ResumeThread(); &amp;nbsp; 와 같이 하면 된다.(Thread 자신이 호출할 수는 없다.) 또는 경우에 따라서는 &amp;nbsp; Sleep(2000); &amp;nbsp; 과 같이 사용할 수도 있는데 이 경우는 제어권을 다른 Process에 넘겨 주게 된다. &amp;nbsp; Sleep(0); &amp;nbsp; 와 같이 할 경우에는 우선 순위가 높거나 같은 Process에 넘겨 주고 우선 순위가 높거나 같은 Process가 없을 경우에는 아무 일도 생기지 않는다. &amp;nbsp; Thread를 종료시키고 싶을 때는 TerminateThread() 함수를 사용하면 되는데 이 경우 Thread 함수가 내부 정리를 하지 못할 수가 있기 때문에 다음과 같은 방법이 많이 사용된다. &amp;nbsp; static BOOL bContinue = TRUE; CWinThread *pThread = ::AfxBeginThread(ThreadFunc, &amp;amp;bContinue); … &amp;nbsp; UINT ThreadPrintNum(LPVOID pParam) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; BOOL *pbContinue = (BOOL *)pParam; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; while ( *pbContinue ) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; … &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return 0; } &amp;nbsp; 와 같이 하고 bContinue 값을 FALSE로 하면 Thread 함수가 종료된다. &amp;nbsp; Thread가 완전히 종료된 것을 확신해야 하는 경우에는 &amp;nbsp; if ( ::WaitForSingleObject(pThread-&amp;gt;m_hThread, INFINITE) ) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 이곳은쓰레드가확실히종료된상태임 } &amp;nbsp; 와 같이 하면 된다. Thread가 죽어 버려서 먹통이 되는 경우까지 대비하려면 &amp;nbsp; DWORD result; result = ::WaitForSingleObject(pThread-&amp;gt;m_hThread, 1000); &amp;nbsp; // 1초기다림 if ( result == WAIT_OBJECT_0 ) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 이곳은쓰레드가확실히종료된상태임 } else if ( result == WAIT_TIMEOUT ) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // 1초가지나도쓰레드가종료되지않은상태 } &amp;nbsp; 이 방법을 사용해야 한다. 어떤 Thread가 현재 실행 중인지 알고 싶을 때는 &amp;nbsp; if ( ::WaitForSingleObject(pThread-&amp;gt;m_hThread, 0 ) == WAIT_TIMEOUT ) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // pThread 실행중 } else { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // pThread가실행중이아님 } &amp;nbsp; 와 같이 하면 된다. &amp;nbsp; User Interface Thread &amp;nbsp; User interface thread는 그 자체로 윈도우와 메시지 루프를 가지고 있다. &amp;nbsp; class CUIThread : public CWinThread { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; DECLARE_DYNCREATE(CUIThread) &amp;nbsp; public: &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; virtual BOOL InitInstance(); }; &amp;nbsp; 이 User interface thread는 독자의 윈도우도 가질 수 있다. 일반적으로 전용 Dialog를 띄워 Thread를 처리하는 경우가 많으므로 이 User Dialog를 CMyDialog라고 이름 지었다고 가정하면 &amp;nbsp; IMPLEMENT_DYNCREATE(CUIThread, CWinThread) &amp;nbsp; BOOL CUIThread::InitInstance() { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pMainWnd = new CMyDialog; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pMainWnd-&amp;gt;ShowWindow(SW_SHOW); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pMainWnd-&amp;gt;UpdateWindow(); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return TRUE; } &amp;nbsp; 와 같이 CMyDialog를 Thread로 띄울 수 있다. 그 다음 &amp;nbsp; CWinThread *pThread = ::AfxBeginThread(RUNTIME_CLASS(CUIThread)); &amp;nbsp; 와 같이 하면 MFC가 알아서 CUIThread를 생성해서 그 포인터를 pThread에 넘겨 준다. &amp;nbsp; 아래 예제에는 CMyDialog를 띄우고 주 Process는 사용자의 입력을 기다린다. Dialog의 Design 및 생성은 별도로 이야기하지 않는다. 아래 예제를 사용하기 위해서는 CMyDialog를 만들고 ID를 IDD_MYDIALOG라고 가정하면 CMyDialog의 생성자에 다음과 같이 추가해야 제대로 동작한다. &amp;nbsp; CMyDialog::CMyDialog(CWnd* pParent /*=NULL*/) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; : CDialog(CMyDialog::IDD, pParent) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Create(IDD_MYDIALOG, NULL); } &amp;nbsp; 이제 완전히 별도로 동작하는(Thread로 동작하는) 윈도우를 하나 가지는 것이다. 만약 이것을 Dialog가 아닌 FrameWnd라고 해도 거의 똑같다. 다만 위에서도 언급했듯이 Thread를 이용할 때는 Dialog가 더 일반적일 것이다. Worker thread에 비해 훨씬 더 많은 기능을 하는 것을 알게 되었을 것이다. &amp;nbsp; 나머지 것들은 위의 Worker Thread에 있는 내용과 동일하다. &amp;nbsp; 만약 여러 개의 CUIThread 를 여러 개 만들려고 한다면 &amp;nbsp; CWinThread *pThread[5]; for ( int i = 0; i &amp;lt; 5; i++ ) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pThread[i] = ::AfxBeginThread(RUNTIME_CLASS(CUIThread)); &amp;nbsp; 와 같이 하면 5개의 Thread가 생성된다. &amp;nbsp; Program Execution Priority(프로그램 실행 우선순위) &amp;nbsp; Thread는 0~31까지의 priority를 가질 수 있다. &amp;nbsp; 프로그램의 priority는 &amp;nbsp; BOOL SetPriorityClass(HANDLE hProcess, DWORD dwPriorityClass); &amp;nbsp; 함수를 이용해서 조정할 수 있다. 첫 번째 인자 hProcess는 ::AfxGetInstanceHandle()로 얻으면 된다. &amp;nbsp; dwPriorityClass Execution Priority Description DLE_PRIORITY_CLASS CPU가 IDLE일 때만 사용 가능 ORMAL_PRIORITY_CLASS 보통 IGH_PRIORITY_CLASS 높은 우선 순위 EALTIME_PRIORITY_CLASS 최상위의 우선순위 Thread Execution Priority(쓰레드 실행 우선순위) &amp;nbsp; ::AfxBeginThread() 함수의 nPriority를 통해서 설정하거나 CWinThread::SetThreadPriority 를 사용해 설정할 수 있다. &amp;nbsp; BOOL SetThreadPriority(HANDLE hThread, int nPriority); &amp;nbsp; nPriority Execution Priority Description HREAD_PRIORITY_IDLE REALTIME_PRIORITY_CLASS의 경우 16, 그 외에는 1 HREAD_PRIORITY_LOWEST 프로세스의 우선순위보다 2단계 낮은 우선순위를 가진다 HREAD_PRIORITY_BELOW_NORMAL 프로세스의 우선순위보다 1단계 낮은 우선순위를 가진다 HREAD_PRIORITY_NORMAL 프로세스의 우선순위가 같은 우선순위 HREAD_PRIORITY_ABOVE_NORMAL 프로세스의 우선순위보다 1단계 높은 우선순위를 가진다 HREAD_PRIORITY_HIGHEST 프로세스의 우선순위보다 2단계 높은 우선순위를 가진다 HREAD_PRIORITY_CRITICAL REALTIME_PRIORITY_CLAS의 경우 31 그 외에는 16 프로그래머가 우선순위를 조정해도 Windows Scheduler가 상황에 맞게 조정하기 때문에 우선순위는 생각하고 조금 다를 수 있다. &amp;nbsp; Thread &amp;amp; Memory &amp;nbsp; 각 Thread의 지역 변수는 모두 별도로 Stack을 만들고 Local Variable들을 관리하기 때문에 위의 &amp;nbsp; CWinThread *pThread[5]; for ( int i = 0; i &amp;lt; 5; i++ ) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pThread[i] = ::AfxBeginThread(RUNTIME_CLASS(CUIThread)); &amp;nbsp; 와 같은 경우에도 각 Thread가 다른 Thread를 침범하는 일은 없다. &amp;nbsp; 이 쯤에서 끝났나 싶겠지만… 아직 갈 길이 멀다. Critical section, Mutex, Semaphore 같은 것들은 다음에… &amp;nbsp; Multithreading synchronization(멀티쓰레드의 동기화) =&amp;gt; http://blog.naver.com/xtelite/50023359879 &amp;nbsp; 프로그램 Worker thread &amp;nbsp; #include &amp;quot;stdafx.h&amp;quot; #include &amp;quot;console.h&amp;quot; &amp;nbsp; #include &amp;lt;iostream&amp;gt; &amp;nbsp; using namespace std; &amp;nbsp; #ifdef _DEBUG #define new DEBUG_NEW #endif &amp;nbsp; // The one and only application object CWinApp theApp; &amp;nbsp; using namespace std; &amp;nbsp; UINT ThreadPrintNum(LPVOID pParam); &amp;nbsp; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int nRetCode = 0; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // initialize MFC and print and error on failure &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; _tprintf(_T(&amp;quot;Fatal Error: MFC initialization failed\n&amp;quot;)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return 1; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; static BOOL bContinue = TRUE; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; CWinThread *pThread = ::AfxBeginThread(ThreadPrintNum, &amp;amp;bContinue); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int count = 0; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; while ( count &amp;lt; 1000 ) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; count++; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Sleep(1000); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; pThread-&amp;gt;SuspendThread(); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;Thread suspended. Waiting for 2 seconds&amp;quot; &amp;lt;&amp;lt; endl; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Sleep(2000); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;Thread resumed&amp;quot; &amp;lt;&amp;lt; endl; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; pThread-&amp;gt;ResumeThread(); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;Quit thread&amp;quot; &amp;lt;&amp;lt; endl; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; bContinue = FALSE; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; Sleep(100); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return nRetCode; } &amp;nbsp; // 쓰레드함수 UINT ThreadPrintNum(LPVOID pParam) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; BOOL *pbContinue = (BOOL *)pParam; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int count = 0; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; while ( *pbContinue ) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; count++; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; cout &amp;lt;&amp;lt; &amp;quot;Exit thread&amp;quot; &amp;lt;&amp;lt; endl; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return 0; } &amp;nbsp; User interface thread &amp;nbsp; #include &amp;quot;stdafx.h&amp;quot; #include &amp;quot;console.h&amp;quot; &amp;nbsp; #include &amp;quot;MyDialog.h&amp;quot; &amp;nbsp; #include &amp;lt;cstdlib&amp;gt; &amp;nbsp; using namespace std; &amp;nbsp; #ifdef _DEBUG #define new DEBUG_NEW #endif &amp;nbsp; // The one and only application object CWinApp theApp; &amp;nbsp; using namespace std; &amp;nbsp; class CUIThread : public CWinThread { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; DECLARE_DYNCREATE(CUIThread) &amp;nbsp; public: &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; virtual BOOL InitInstance(); }; &amp;nbsp; IMPLEMENT_DYNCREATE(CUIThread, CWinThread) &amp;nbsp; BOOL CUIThread::InitInstance() { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pMainWnd = new CMyDialog; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pMainWnd-&amp;gt;ShowWindow(SW_SHOW); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; m_pMainWnd-&amp;gt;UpdateWindow(); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return TRUE; } &amp;nbsp; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; int nRetCode = 0; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; // initialize MFC and print and error on failure &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; { &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; _tprintf(_T(&amp;quot;Fatal Error: MFC initialization failed\n&amp;quot;)); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return 1; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; } &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; CWinThread *pThread = ::AfxBeginThread(RUNTIME_CLASS(CUIThread)); &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; system(&amp;quot;pause&amp;quot;); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; return nRetCode; } 출처 : &amp;quot;http://system.tistory.com/entry/멀티-쓰레딩&amp;quot; &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/135&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">[취업] LIG 넥스원 합격 수기</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/134"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/134" thr:count="3" thr:updated="2010-07-03T12:40:28+09:00"/>
  <category term="Hot Issue"/>
  <category term="LIG"/>
  <category term="LIG&#xB125;&#xC2A4;&#xC6D0;"/>
  <category term="&#xB125;&#xC2A4;&#xC6D0;"/>
  <category term="&#xC218;&#xAE30;"/>
  <category term="&#xCDE8;&#xC5C5;"/>
  <category term="&#xD569;&#xACA9;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/134</id>
  <updated>2010-03-19T22:16:43+09:00</updated>
  <published>2010-03-19T22:16:43+09:00</published>
  <summary type="html"> LIG넥스원에 합격을 하고, 연수를 받고 그리고 현장에 배치를 받아서 &amp;nbsp; 이리저리 정신없이 돌아다닌게 벌써 2달이 되었네요. &amp;nbsp; 말이 두달이지 그 기간동안에 정말 많은 일들이 있었습니다. 느낌은 거의 한 반년쯤 일한 느낌이랄까..ㅋ &amp;nbsp; 오늘은 구미 공장에 출장을 내려왔는데... 생각보다 일이 일찍 끝났네요.... &amp;nbsp; 숙소에서 계속 빈둥거리다가 갑자기 생각나서 저번 이노텍에 이어서 수기 하나 더 남깁니다. &amp;nbsp; 얼마전에 수시채용이 있었죠? 자료를 원하시는 분, 면접에 관해 조언을 구하시는 분들이 방명록이나 &amp;nbsp; 메일을 남기셨었는데요... 이번 수기가 그 다음 분들을 위해 도움이 되었으면 좋겠네요... ^^;;; &amp;nbsp; 자 그럼 시작합니다. &amp;nbsp; 일단 뉴스에도 보도되었었던 내용이지만 회사들 중 일부는 신입사원 채용에 임직원들의 추천을 &amp;nbsp; 적극 활용합니다. 이는 LIG넥스원도 마찬가지 입니다. 추천을 해주는 직원이 누구냐에 따라서 조금씩 &amp;nbsp; 영향력이 다르긴 합니다만, 일단 추천을 받는다면 서류라도 통과할 가능성이 조금 높아집니다. &amp;nbsp; LIG넥스원의 경우 서류에서부터 경쟁률이 워낙 높기 때문에 서류만 통과하더라도 일단 한 고비는 &amp;nbsp; 넘긴겁니다. 따라서 지인 중에 기존에 LIG넥스원에 다니는 사람이 있다면 추천을 부탁해보시구요.... &amp;nbsp; 이도저도 아니라면 역시 자소서에 목숨 걸어 봅시다. &amp;nbsp; LIG넥스원의 경우 자소서에서 스펙을 보는지 어떤지는 잘 모르겠습니다. 그런데 입사 후 연수원에서 &amp;nbsp; 알아본 결과 학벌이면 학벌, 영어면 영어, 학점이면 학점.. 무엇하나 뒤쳐지는 사람이 없더군요... &amp;nbsp; 제가 뭐가 잘 보여서 합격했나 싶을 정도였으니.... ㅋㅋㅋㅋㅋㅋ &amp;nbsp; 어쨌든, 연구직 신입사원의 경우 학부 출신이 없는 것은 아니나 거의 없다고 할 정도구요. 대부분 &amp;nbsp; 석사 이상입니다. &amp;nbsp; 자소서를 적으실 때는 홈페이지를 많이 보세요. 무기를 만드는 회사다 보니 모든 사업과 개발 제품을 &amp;nbsp; 공개하지 않습니다. 홈페이지에 나와있는 것들이 일반 사람들이 회사를 접할 수 있는 전부입니다. &amp;nbsp; 홈페이지에 나온 개발 무기들, 그리고 시연 동영상들 참고하셔서 내가 무슨 일을 할 수 있겠다라는 &amp;nbsp; 장점을 위주로 자소서에 적으시면 됩니다. 저같은 경우에는 석사때 영상처리를 전공했었는데요, &amp;nbsp; 감시정찰 분야에서 현재 개발되고 있는 제품을 조사했고, 이 제품을 앞으로 어떻게 만들면 좋겠다라는 &amp;nbsp; 언급과 그 때 내가 어떤 부분을 담당하면 잘 할 수 있다는 점을 강조했습니다. &amp;nbsp; 실제 면접에서도 이런 부분들을 집중적으로 물어보셨구요... &amp;nbsp; 어쨌든 이 회사는 실무적인 능력, 그리고 인생의 다양한 경험 이런것을 중요시 여기는 듯 합니다. &amp;nbsp; 그 부분을 부각하여서 작성하세요. &amp;nbsp; 일단 서류 통과하면 그 뒤에는 경쟁률이 5대 1정도라고 합니다. 하지만 안심하기도 어렵지요. &amp;nbsp; 다들 만만치 않은 사람들이니.... ^^;;; &amp;nbsp; 인적성 검사는 다른 회사에서 보는 시험들이랑 비슷해요. 두산 인적성때 봤던 기계 이해 평가도 있구요 &amp;nbsp; 규칙성 따져서 신호등 따라다니는 묘한 평가도 있습니다. &amp;nbsp; 다만 이 평가들은 하위 몇퍼센트의 인원을 걸러내는 용도로만 사용된다고 하네요. &amp;nbsp; 그냥 평균만 하시면 어렵지 않게 통과 되는 듯 합니다. &amp;nbsp; 학부 졸업자 분들은 인적성 끝나면 전공시험 치르구요, &amp;nbsp; 석박사 분들은 그냥 집에 돌아가시면 됩니다. 대신 1차 면접을 치르지요. &amp;nbsp; 즉, 채용 프로세스가 학부랑 석박사랑 다르게 진행됩니다. &amp;nbsp; 학부 : 서류 -&amp;gt; 인적성-&amp;gt; 전공시험 -&amp;gt; 2차면접 -&amp;gt; 신체검사 석박사 : 서류 -&amp;gt; 인적성 -&amp;gt; 1차면접 -&amp;gt; 2차면접 -&amp;gt; 신체검사 &amp;nbsp; 석박사는 면접 2번을 치르는 겁니다. ㅎㅎㅎ &amp;nbsp; 1차는 실무면접입니다. 2차는 인성면접이구요... 그런데 말이 그렇지..... &amp;nbsp; 사실은 그냥 실무면접 두번 본다고 생각하시면 되겠네요. &amp;nbsp; 인성관련 질문 하나도 못받았습니다. 전부 전공에 관련된 질문만 받았지. &amp;nbsp; 아까 위에서도 언급했지만, 자소서에 작성된 내용을 위주로 해서 전공 관련 질문을 합니다. &amp;nbsp; 이것저것 잘 한다고 말하지 마세요. 특정 한 분야를 정해서 그 분야에 대해서는 자신있다고 말하는게 &amp;nbsp; 유리합니다. 면접관님들이 판단했을 때, 이 사람은 여기에 배치하면 좋겠구나라는 생각이 떠오를 정도가 &amp;nbsp; 되어야 합니다. 그렇지 않으면 여기저기서 공격아닌 공격이 들어옵니다. &amp;nbsp; 예를 들어 이 사람은 통신쪽 연구센터에 적합하겠구나라는 생각이 들면 통신연구센터 팀장님이 &amp;nbsp; 주로 질문을 하실겁니다. 그런 느낌이 없다면 여기저기서 질문을 복합적으로 하시겠죠... ^^;; &amp;nbsp; 1차 면접은 팀장님급에서 진행을 하실테고... 2차면접은 각 연구센터의 센터장님급에서 참석을 &amp;nbsp; 하실겁니다. 다만 센터장님들도 전부 엔지니어인지라.. 질문이 거기서 거기라는게 문제죠 ㅋㅋ &amp;nbsp; 한번에 5명 정도 참석한거 같은데... 최종 2명 정도가 합격을 했던 것 같습니다. &amp;nbsp; 신체검사는 LG계열사에서 하는 신체검사 장소랑 동일하니깐요... 뭐 특이할 거 없구요.... &amp;nbsp; 제가 작성하면서 예전 생각에 조금 겁은 줬지만... 막상 들어와서 보면 다들 똑같아요... ^^;;; &amp;nbsp; 실력도 비슷비슷 해 보이구요.. 저만의 착각일지는 모르겠지만... ㅋㅋㅋ &amp;nbsp; 저도 내세울 것 없는 스펙인데 합격했으니... 모두들 자신감을 갖고 지원해보셨으면 합니다. ㅎㅎ &amp;nbsp; LIG넥스원이 세간에는 공기업이나 다름 없다, 정년이 보장된다, 매일 칼퇴근 한다, 이런 소문이 &amp;nbsp; 떠돌긴 합니다. 그런 소문 100퍼센트 믿지는 마세요... &amp;nbsp; 여기도 분명 사기업 중에 하나입니다. 그 연봉 거저 주는건 아니예요. &amp;nbsp; 뭐~ 삼성이나 엘지, 현대 이런데보다는 업무 강도가 확실히 강하지는 않습니다. 1/2 수준 정도?? &amp;nbsp; 그렇다고 매일 칼퇴근하고 놀고 먹는 회사는 아닙니다. 요새는 방산쪽도 경쟁이 심하거든요.. &amp;nbsp; 다만, 복리후생 확실히 챙겨주고 인간적인 회사라는 점에는 깊이 동감합니다. &amp;nbsp; 사원들 형편 이렇게 하나하나 챙겨주고 거리감 없이 생활하는 회사는 국내에 많지 않을거라고 봅니다. &amp;nbsp; 제 이후에 지원하고 도전하고자 하시는 분들께 조금이나마 도움이 되었으면 하며.... &amp;nbsp; 그리고 꼭 회사에서 뵙길 바라겠습니다. ㅎㅎㅎ &amp;nbsp; ================================================================================= &amp;nbsp; ps. 혹시라도 궁금한 점이 있으시면 방명록 남겨놓으세요 ㅋㅋ &amp;nbsp; 보안에 위배되지 않는 정도라면 알려드릴 수 있습니다. 질문하셨는데 제가 답변 안하는건 &amp;nbsp; 보안 사항이기 때문에 그런 겁니다. 하는 일이 일인지라 업무상 말하기 곤란한 부분도 있거든요. &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/134&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">흑체복사와 양자론</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/133"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/133" thr:count="1" thr:updated="2010-02-19T01:03:12+09:00"/>
  <category term="Working Memory"/>
  <category term="&#xAD11;&#xD559;"/>
  <category term="&#xBB3C;&#xB9AC;"/>
  <category term="&#xC591;&#xC790;&#xB860;"/>
  <category term="&#xD50C;&#xB791;&#xD06C;"/>
  <category term="&#xD50C;&#xB791;&#xD06C; &#xBC95;&#xCE59;"/>
  <category term="&#xD751;&#xCCB4;"/>
  <category term="&#xD751;&#xCCB4;&#xBCF5;&#xC0AC;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/133</id>
  <updated>2010-02-17T17:53:03+09:00</updated>
  <published>2010-02-17T17:53:03+09:00</published>
  <summary type="html">흑체 복사와 양자론 막스 플랑크(Max Plank, 1858-1947)는 일생 동안 현대물리학에 중요한 수많은 업적을 이룩했다. 그중에서도 1889년 크리스마스 무렵에 발표된 이른바 &amp;#039;양자가설&amp;#039;은 양자역학의 새 장을 여는 획기적인 것으로 그의 명성을 느높이는 가장 중요한 역할을 했다. 양자가설은 한마디로 &amp;#039;빛의 에너지가 연속적이 아니다&amp;#039;는 것인데, 이는 원래 &amp;#039;흑체복사&amp;#039;라고 불렸던 고전적인 현상을 설명하기 위해 제안됐다. 플랑크의 양자가설을 이해하기 위해 우선 흑체복사와 빛의 성질에 관한 것부터 살펴보도록 하자. (1)빛은 물결치는 파동 파동은 수면에 돌을 던졌을 때 퍼져나가는 물결과 같은 움직이다. 이러한 운동은 파도처럼 생긴 사인 또는 코사인 함수를 이용해서 수식으로 표현할 수 있다. 우리 눈으로 그 파형을 직접 볼 수는 없지만 소리, 빛 등도 마찬가지로 사인 또는 코사인 함수로 표현된다(소리는 음파, 빛은 광파라고 한다). 빛이 파동인지 입자인지는 오랫동안 과학자들 사이에 논쟁의 대상이 돼왔다. 한동안 빛은 입자로 생각돼 오다가, 파동에서만 볼 수 있는 현상들이 관찰되자 파동으로 인정됐다. 후에 아인슈타인이 광량자설을 발표해 빛이 파동과 입자의 이중적인 성질이 있음을 밝혔지만, 플랑크가 빛을 연구하던 1800년대 말에는 파동의 성질을 가진 것으로 생각됐다. 파동에서 물결 모양 한 개의 길이를 파장이라고 하는데, 우리가 볼 수 있는 가시광선에서 빨간색의 파장은 6백50nm(나노미터, 1nm=10^-9m)정도이고 보라색은 4백20nm정도 된다. 파장은 공간상에서 물결 한개의 길이를 의미하고, 이 파장이 1초 동안 만들어지는 개수가 진동수다. 진동수는 파동의 진행 속도를 파장으로 나누면 된다. 파장이 길면 진동수는 작고, 파장이 짧으면 진동수는 크다. 빛의 전파속도는 모든 파장에서 일정하다. 실제로 빛의 전파속도는 초속 30만km인데, 이때 보라색의 진동수는 7.14×1015, 빨간색은 4.61×1015라는 천문학적인 큰 수가 된다. (2)스펙트럼은 온도에 관계 태양은 연한 노란 색을 띠고 있는데 태양빛을 프리즘에 통과시키면, 여러 가지 색으로 나누어 진다. 이렇게 한가지 색으로 보이는 광원의 빛이 여러 가지 색으로 나누어진 것을 스펙트럼이라고 한다. 태양빛의 스펙트럼을 보면, 빨간색부터 보라색까지 무지개를 이루는 색 띠가 나타난다. 여기에는 우리 눈에는 보이지 않지만 적외선, 자외선 등의 띠도 있다. 이러한 스펙트럼을 연속 스펙트럼이라고 한다. 백열 전구로부터 나오는 빛도 마찬가지로 연속 스펙트럼이다. 그러나 광원의 빛을 성능이 좋은 분광기로 스펙트럼을 만들어 자세히 관찰하면 스펙트럼 띠의 곳곳에 가는 선이 나타나는 것을 볼 수 있다. 광원이 무엇이냐에 따라서 선의 숫자와 배열이 달라진다. 예를 들어 나트륨을 태워서 나오는 빛의 스펙트럼은 몇 개의 노란색 선으로 이루어져 있다. 19세기말까지 과학자들은 여러가지 물질을 태운 스펙트럼을 연구해 물질마다 고유한 스펙트럼선이 나나탄다는 것을 알아냈다. 한편 이 스펙트럼은 온도에 따라서도 달라진다. 철을 뜨겁게 달구는 과정을 예로 들면, 온도가 낮을 때 철은 거의 검은색으로 보인다. 이때의 철은 가시광선 영역의 빛을 거의 내지 않는다는 것을 알 수 있다. 그런데 온도가 올라감에 따라 철은 빨갛게 되다가 점점 노란색에 가까워진다. 이 과정에서 철이 내는 빛의 스펙트럼을 보면, 철이 붉어 보일 때는 스펙트럼의 여러 색 중에서 붉은색이 가장 강하고, 온도가 올라가면서 다른 색의 강도도 점차 강해지는 것을 알 수 있다. 즉 온도에 따라 스펙트럼 띠에서 가장 강한 색이 결정된다. 그러므로 눈에 보이는 색깔을 보면 철이 어느 온도에 이르렀는지를 대강 알 수 있다. 실제로 1800년대에는 철을 제련할 때 달아오른 철의 색깔을 보고 온도를 알아내 공정을 조절했다. (3) 빛의 파장은 온도에 반비례 빈(Wien, 1864-1928)은 철의 제련 연구를 위해 세워진 독일의 연구소에서 일하고 있었다. 빈은 1893년, 겨우 25세라는 젊은 나이에, 물체가 내는 빛의 스펙트럼에서 가장 강한 빛의 파장은 그 때의 온도에 반비례한다는 법칙을 발표했다. 즉 어떤 온도에서든지 물체는 여러가지 파장의 빛을 내지만, 전체의 색은 가장 강한 빛의 파장으로 결정되며, 가장 강한 빛의 파장은 물체에 상관없이 온도에 의해 결정된다는 주장이다. 온도가 아주 낮을 때는 가장 강한 빛의 파장이 적외선 영역에 있으므로 우리 눈에 보이지 않는다. 온도가 올라감에 따라 강한 빛의 파장이 점차 짧은 쪽으로 옮겨가면서 노란색이 강해지게 된다. 더 온도가 높아지면, 파란색 쪽으로 옮겨가겠지만, 철은 그 전에 녹아버린다. 빈의 이론이 철의 온도에 따라 색이 변화하는 것을 설명하기는 했지만, 정말 그 이론이 확실히 맞는 것으로 인정받으려면, 엄격한 실험으로 증명돼야 했다. 앞서 언급했듯이 스펙트럼은 온도에 영향을 받지만, 다른 한편으로 빛이 나오는 물체에 의해서도 영향을 받는다. 빈의 이론은 온도의 영향만을 지적했으므로, 실제는 정확히 맞아 떨어지지 않았다. 그래서 가정된 것이 광원의 성질에 영향을 받지 않고 온도에만 영향을 받은 이상적인 물체인 흑체였다. (4)모든 빛을 흡수하는 흑체 모든 물질은 자신이 온도가 높을 때는 빛을 내고 낮을 때는 흡수하는 성질이 있다. 그런데 각 물질은 자신이 온도가 높을 때 방출하는 빛을 온도가 낮을 때 다시 흡수하는 성질이 있다. 예를 들어 나트륨을 태우면 몇 개의 노란 선이 나온다. 그런데 백열전구의 빛을 차가운 나트륨 기체에 통과시키면, 스펙트럼에서 나트륨의 노란 선만 까맣게 빠져있다. 같은 파장의 빛을 나트륨 기체가 흡수해버린 것이다. 이렇게 모든 물질이 자신이 뜨거울 때 내는 빛을 차가울 때 흡수하는 성질에 착안한 과학자들은 만일 차가울 때 모든 파장의 빛을 흡수하는 물체가 있다면, 이 물체는 뜨거워졌을 때 다시 모든 파장의 빛을 골고루 내놓을 것이라고 생각했다. 모든 파장의 빛을 흡수한다는 것은 그 물체가 아주 까맣다는 것을 의미하므로 과학자들은 우선 검은 빛을 띠는 물질로 결과가 정말 그러한지 실험했다. 그러나 검은색의 물질들이라고 해도 결과는 예상과 맞아떨어지지 않았다. 빈은 이때 아주 기발한 착상을 했다. 속이 비어 있는 상자에 아주 작은 구멍을 뚫으면 이 상자에 들어간 빛은 상자 내부에서 이리저리 반사되겠지만, 이 빛이 들어온 구멍을 다시 찾아서 나올 확률은 굉장히 적다. 즉 흡수된 빛이 나오지 못하는 상황을 만들어낼 수 있다. 빈은 실제의 물질 대신 검은 상자(흑체)를 생각해냄으로써 그의 이론을 실험해 볼 수 있게 됐다. 실험 결과 상자의 재료가 무엇이든 상관없이 상자의 온도를 올릴 때, 상자의 구멍에서 나오는 빛의 스펙트럼에서 가장 강한 빛의 파장은 빈의 예측과 정확하게 들어맞았다. (5) 짧은 파장은 빈, 긴 파장은 레일리 스펙트럼에서 온도에 따라 가장 강한 빛의 파장을 예측할 수 있게 되자 과학자들은 스펙트럼 전체의 모양을 예측할 수 있는 이론을 찾기 시작했다. 빈은 여기서도 뛰어난 공헌을 했다. 스펙트럼 중 파장이 짧은 쪽, 즉 보라색과 파란색을 아주 잘 예측하는 공식을 생각해낸 것이다. 빈은 검은 상자 속을 채우고 있는 빛의 에너지가 상자 속에서 움직이는 기체 분자의 에너지의 모양과 비슷할 것이라는 가정에서 하나의 식을 제안했는데, 이 식은 짧은 파장의 빛에 대해서는 잘 맞았다. 그러나 긴파장의 빛에서는 식이 잘 맞지 않았다. 그러자 이번에는 레일리(Rayleigh, 1842-1919)가 긴 파장 쪽을 설명하는 식을 제안했다. 레일리는 빛이 파동이라는 성질을 이용해 물결 모양 한 개마다 어떤 일정량의 에너지를 갖는다는 가정에서 출발했다. 그런데 이 식은 파장이 긴 붉은색 빛은 잘 설명했지만, 빈이 설명한 가장 강한 빛의 파장을 예측하지 못하고, 짧은 파장의 빛의 분포도 설명하지 못했다. 그리고 빛의 파장이 짧아지면서 상자를 채울 수 있는 물결 모양의 개수가 점점 많아지는데, 그러면 점점 많은 에너지가 필요하게 된다. 그런데 상자 속에 있는 에너지가 그렇게 무한정 많다고 생각하는 것은 무리였다. (6) 양자가설로 흑체복사 해결 이렇게 흑체복사의 문제가 풀리지 않고 있을 때, 1899년 12월 플랑크는 새로운 제안을 했다. 플랑크는 빛의 에너지가 연속적인 값이 아니라 어떤 단위값의 정수배인 특정한 값만 갖는다는 가정을 세웠다. 즉 각 빛은 진동수에 비례(파장에 반비례)하는 에너지만 주고 받을 수 있다고 가정했다. 플랑크는 이때의 비례상수를 h로 두었는데, 후에 이를 플랑크 상수라고 부르게 됐다. 플랑크의 가정대로 에너지가 h의 정수배로 묶여서 전달된다면 파장이 짧을 수록(진동수가 많을수록) 많은 에너지가 필요하다는 뜻이 되고 이것은 레일리의 식과 비슷하게 된다. 그런데 플랑크는 에너지가 클수록 그러한 빛이 존재할 확률이 적다는 가정을 추가했다. 때문에 레일리의 식에서 도출됐던 파장이 짧아지면 에너지가 무한정 많아지는 모순을 해결할 수 있었다. 이렇게 해서 만들어진 플랑크의 식은 모든 파장의 빛에 대해 잘 맞았고, 드디어 흑체복사의 문제가 풀리게 됐다. 흑체복사에 관한 공로로 빈은 1911년, 플랑크는 1918년에 각각 노벨 물리학상을 받았다. 흑체복사에 관한 공로만 따진다면, 빈의 공로가 플랑크보다 더 크다고 할 수도 있다. 그런데 놀라운 이야기는 그 다음부터 시작됐다. 플랑크가 제안한 &amp;quot;진동수에 비례하는 값의 에너지만 가능하다&amp;quot;는 생각은 플랑크 자신도 &amp;#039;운좋게 선택된 공식&amp;#039;이라고 할만큼 뚜렷한 물리학적인 근거가 없었다. 플랑크 자신도 이미 알려져 있는 물리학에서 그러한 공식을 사용할 수 있는 근거를 찾아내고자 많은 노력을 기울였다. (7) 에너지는 불연속이다 그런데 이 말을 조금만 더 생각해보자. 진동수를 f 또는 ν(&amp;#039;뉴&amp;#039;라고 읽음)로 많이 표현하는데 플랑크의 말에 따르면, 진동수가 ν인 빛의 에너지는 hν, 2hν, 3hν, 4hν, 등의 값만 가질 수 있다는 말이 된다. 이것은 마치 hν만큼 에너지를 가진 덩어리가 한개, 두개, 세개, 네개가 있는 것과 같은 결과가 된다. 이것은 두 가지 의미에서 중요하다. 우선 에너지가 연속적인 값을 갖지 않는다는 것이 당시로서는 납득될 수 없는 일이었다. 둘째로 이 말은 1905년에 발표된 아인슈타인의 광량자설과 잘 들어맞는다. 우선 에너지의 값이 불연속이라는 생각은 많은 학자들을 당황하게 했다. 빛이 파동이라고 볼 때, 그 에너지가 불연속이어야 하는 이유를 찾을 수 없기 때문이었다. 그런데 빛이 작은 에너지 덩어리들의 모임이라고 생각하면 불연속이라는 개념이 이상하지 않다. 이렇게 해서 빛이 입자이기도 하고 파동이기도 하다는 개념이 성립할 수 있었던 것이다. 즉 입자와 파동이라는 단어 자체가 맨눈으로 관찰되는 거시적인 대상들을 다루면서 만들어진 단어인데, 아주 작은 미시적 대상들을 다룰 때는 이러한 구별 자체가 의미가 없어진다. 미시적인 세계에서는 빛이 어떤 현상은 입자의 성질로, 어떤 현상은 파동의 성질로 관측되는 것이다. 이러한 빛의 입자-파동 이중성은 플랑크와 아인슈타인 이후 여러학자들에 의해 확인됐고 양자물리학의 기본 개념으로 자리잡았다. (8) 양자역학의 꽃이 피다 빛이 입자-파동 양면성을 지니고 있다고 알려지면서 자연계의 대상들을 다시 돌아보게 됐다. 예를 들어 전자는 질량이 작은 음전하를 가진 입자다. 1923년 프랑스의 드 브로이(de Broglie, 1892-1960)는 지금까지 입자로 생각되던 전자가 파동의 성질을 가지고 있다는 이론을 제안했다. 이렇게 입자로 생각되던 물질이 파동(이것을 물질파라고 한다)이라는 주장은 실험결과로 확인됐음에도 불구하고 많은 과학자들을 고민하게 만들었다. 그때까지 생각해오던 고전 물리학에서 쉽게 납득이 가지 않는 가설들에 기초한 것이기 때문이었다. 많은 학자들이 일관성 있게 이러한 현상들을 설명하려고 다양하게 시도했다. 1925년 슈뢰딩거(Schrodinger, 1887-1962, 1933년 노벨상 수상)와 하이젠베르크(Heisenberg, 1901-1976, 1932년 노벨상 수상) 두 사람은 각각 독립적으로 물질파를 설명하는 이론체계를 발표했다. 두 사람이 사용한 수학적 방법은 아주 달랐지만, 설명하는 물리적 현상은 같았다. 원자 또는 그보다 작은 미지의 세계에서 왜 파동-입자의 이중성이 중요하고, 양자화된 불연속적인 에너지를 갖는지가 완전히 설명된 것이다. 이는 불연속적인 값, 혹은 작은 덩어리라는 뜻의 양자(量子)라는 대상을 다룬다고 해서 양자역학이라 부른다. 한편 물질의 파동성을 다룬다는 의미에서 파동역학으로 불리기도 한다. 원자의 내부와 그와 관련된 문제가 풀리면서 물리학은 새로운 문을 열었다. 마치 뉴턴의 만유인력 법칙과 운동 법칙들이 우리 눈에 보이는 거시적 세계의 모든 운동을 일목요연하게 설명하는 것처럼 원자와 그보다 더 작은 입자들의 미시적 세계를 체계적으로 다루는 것이 가능하게 됐다. 양자역학의 탄생은 현대에 실현된 물질에 대한 깊은 이해에 절대 적인 공헌을 했다. 원자력의 이해와 이용이 한 예이며, 각종 가전 제품과 컴퓨터에 중요한 반도체의 이용도 양자역학으로 가능해졌다. 그 자신도 확신하지 못한 채 도입했던 플랑크의 양자가설은 양자역학이라는 새로운 과학세계를 열어준 출발점이었던 것이다.&lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/133&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">[취업] LG이노텍 지원 수기</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/132"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/132" thr:count="2" thr:updated="2010-03-19T21:45:20+09:00"/>
  <category term="Hot Issue"/>
  <category term="LG&#xC774;&#xB178;&#xD14D;"/>
  <category term="&#xC5D8;&#xC9C0;&#xC774;&#xB178;&#xD14D;"/>
  <category term="&#xC774;&#xB178;&#xD14D;"/>
  <category term="&#xCDE8;&#xC5C5;"/>
  <category term="&#xD6C4;&#xAE30;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/132</id>
  <updated>2010-02-14T00:15:12+09:00</updated>
  <published>2010-02-14T00:15:12+09:00</published>
  <summary type="html"> 어느덧 신입사원으로 입사해서 좌충우돌 헤매고 돌아다닌지도 한달이 넘는 시간이 흘렀네요. &amp;nbsp; 작년 9월부터 시작해서 2010년이 되고 취업 준비생 딱지를 떼버리기까지 과정을 돌이켜서 &amp;nbsp; 생각해보면 참 많은 분들의 도움을 받았습니다. &amp;nbsp; 전부터 취업에 뛰어드는 후배들을 위해 나도 작은 도움을 주고 싶다 생각하고 있었는데.... &amp;nbsp; 설 연휴를 맞아 조금(?) 시간이 생긴 관계로 오늘 생각나는데로 적어 보려고 합니다. &amp;nbsp; 얼마전 저에게 쪽지로 면접 후기를 달라고 하셨던 분이 있었는데... &amp;nbsp; 사실 그 이후로 너무 정신이 없이 바빠서... 제대로 도움도 드리질 못했습니다. &amp;nbsp; 그 분께도 죄송한 마음을 담아서... 그리고 그 이후에 또 도움이 필요한 분들을 위해 정리 해놓을께요 ^^; &amp;nbsp; 일단 오늘 첫번째로 떠들어볼 회사는 LG 이노텍입니다. &amp;nbsp; 사실 제가 비록 합격만 하고 가진 않았지만... 짧은 시간에 정말 정이 많이 들어서 포기하기 쉽지가 &amp;nbsp; 않았던 회사가 바로 LG 이노텍이었습니다. &amp;nbsp; 잘 알지도 못했던 회사에서 정말 가고 싶은 회사가 되기 까지는 인사과 직원들의 친절함과 &amp;nbsp; 회사의 비젼이 가장 큰 영향을 미쳤다고 할 수 있겠죠.... ^^;; &amp;nbsp; 일단 이노텍 역시 엘지 계열사인 관계로 채용 프로세스는 엘지 그룹의 과정을 그대로 따릅니다. &amp;nbsp; 취업 준비 초기에는 무턱대고 일단 공채 소식만 듣고 무작정 자소서를 써내려가기 시작했습니다. &amp;nbsp; 그리고 다른데 썼던 자소서 무작정 급한 마음에 이리저리 긁어 붙여서 짜깁기하기가 다반사였죠. &amp;nbsp; 하지만 초반에 줄줄이 낙방을 해보고 나서야 이래서는 안된다는 사실을 깨달았습니다. &amp;nbsp; 그리고 철저히 분석하기 시작한 첫번째 회사가 바로 엘지 이노텍이였죠... ^^ &amp;nbsp; 자소서를 쓰기 전에 회사의 홈페이지를 철저히 분석하기 시작했습니다. &amp;nbsp; 인재상은 기본이구요, 회사가 만드는 제품이 뭔지... 그 중에서도 요즘 밀고 있는 주력상품은 뭔지... &amp;nbsp; 주요 고객은 누구이고, 최근 성장세나 매출액은 어떠한지... 그리고 제품들에 단점은 없는지.... &amp;nbsp; 그리고 가장 중요한 점.. 내가 이 회사에 입사하면 어느 부서에서 일하고 싶고, &amp;nbsp; 그 부서에서 내가 어떠한 일을 해줄 수 있는지... 이걸 찾아낼 수 있다면 이미 절반은 입사 된겁니다. &amp;nbsp; 그 부분을 찾아서 자소서에 명확하게 명시하세요. &amp;nbsp; 수많은 사람들의 자소서 가운데에서 나를 가장 눈에 띄게 할 수 있는 방법은 내가 이 회사에 해줄 수 &amp;nbsp; 있는 일이 어떤것인지 강하게 어필하는 방법 뿐입니다. 그러면 일단 선발 되겠죠? &amp;nbsp; 그 다음에는 모두가 알고 있는.. 바로 그 RPST입니다. Right People을 뽑기 위한 단계인건데요... &amp;nbsp; 사실 제가 볼 때는 정답은 없는 것 같습니다. 제 주변에 RPST를 본 모든 사람들이 하는 말이 있죠. &amp;nbsp; 다중이가 된 기분이라고... 맞습니다. 이거 원래 이런 시험인듯 합니다. &amp;nbsp; 제가 해드리고 싶은 조언은 일단 회사의 인재상이니 이런거 다 잊으세요.. 그냥 자신의 모습을 사전에 &amp;nbsp; 명확하게 설정하세요. 그래야 솔직해지고 일관성있는 답변이 가능해집니다. &amp;nbsp; 힌트를 드리자면, 내가 경쟁을 좋아하는지... 누굴 만났을 때 어떤 식으로 친해지는지.... &amp;nbsp; 사람들 가운데에 있을 때 리더십이 있는지 혹은 관심의 대상이 되는지... 등등.... &amp;nbsp; 여러가지 에피소드를 중심으로 나를 파악하고 어느정도 가이드 라인이 잡힌다면 그 기준을 중심으로 &amp;nbsp; 답변을 하세요.. 그렇지 않으면 이리저리 휘둘리다가 신뢰도 떨어지는 답변을 늘어놓기 십상입니다. &amp;nbsp; 여기까지 통과된다면...... &amp;nbsp; 그 다음은 대망의 면접이죠. 여기까지 온다면 대략 경쟁률로 따지면 3~4 대 1정도가 되지 싶습니다. &amp;nbsp; 저같은 경우에는 안산 연구소에서 1차 면접과 2차면접을 모두 다 치렀습니다. &amp;nbsp; 1차 면접은 크게 영어 면접과 전공 면접으로 나눌 수 있습니다. 그리고 학부생과 석박사 면접으로 &amp;nbsp; 나뉘기도 하지요. 저는 석사 졸업 예정자로 면접을 치렀기 때문에 학부생들 면접은 잘 모르겠네요... &amp;nbsp; 다만 방에서 문제를 주고 준비할 시간을 준 뒤 프리젠테이션을 한다는 소식을 들었습니다. &amp;nbsp; 석사 면접은 그거와는 다르게 사전에 피피티를 작성해서 보내라고 합니다. &amp;nbsp; 간단한 자기 소개와 전공 분야 그리고 경험에 대해서요.... 기간은 5분정도 주는데요..... &amp;nbsp; 시간을 측정하긴 합니다만 중간에 억지로 끊고 그러진 않아요... 주어진 시간을 잘 조절하면서 &amp;nbsp; 준비하면 좋을 듯 합니다. 1차 면접은 전공 면접이기 때문에 면접관님들이 대체로 실무에 관계된 분이 &amp;nbsp; 들어오게 됩니다. 연구위원 한 분정도.. 그리고 팀장급, 그리고 그 아래에 실무진들, 그리고 추가로 &amp;nbsp; 인사과에서 한분 정도가 들어오시게 되는데요..... &amp;nbsp; 자소서에 적었던 프로젝트 위주로 질문을 하십니다. 그렇다고 너무 세부적인 내용을 물어보진 않더군요 &amp;nbsp; 과연 이 사람이 실제로 이 프로젝트에 참여를 했고, 어느정도 일을 했는가를 보는거 같았습니다. &amp;nbsp; 저같은 경우에도 프로젝트 경험을 물으시며 무슨 툴을 썼는지, 얼마나 사용할 수 있는지, &amp;nbsp; 진행 도중에 어려운 점은 없었는지... 그리고 그 문제를 어떻게 해결했는지 등등을 여쭤보셨습니다. &amp;nbsp; 아~ 그리고 이노텍의 경우 1차 면접 전에 희망자에 한해서 한 페이지짜리 제안서 공모전을 접수 &amp;nbsp; 받습니다. 엘지 이노텍에서 현재 개발 중인 제품의 개선할 점이나 신규로 만들어 볼만한 제품을 &amp;nbsp; 한장짜리 피피티로 제안서를 작성해서 내라는 건데요... 희망자에 한해서 하라고는 하지만.... &amp;nbsp; 사실 구직자 입장에서 쉽게 흘려듣긴 쉽지 않죠... 저도 며칠 궁리 끝에 제안서를 냈었습니다. &amp;nbsp; 그리고 1차 면접 이후에 결과가 나오기 전에 테크노 컨퍼런스 라는 행사를 개최합니다. &amp;nbsp; 물론 참석 여부는 자유입니다. 하지만 저는 참석했고, 정말 만족스러운 하루를 보낼 수 있었습니다. &amp;nbsp; 호텔에서 개최되는 행사라 그런지 굉장히 고급스럽고 격식있는 분위기에서 진행되구요, &amp;nbsp; 무엇보다도 이노텍이란 회사에 대해서 잘 알 수 있는 기회입니다. 가고 싶다는 생각도 많이 들게하구요. &amp;nbsp; 지금까지는 면접자의 입장에서 질문만 받아왔지만, 여기서만큼은 면접관이었던 분께 &amp;nbsp; 회사에 대한 궁금증을 풀 수 있습니다. 뭐~ 여기서 회사에 대한 열정을 표현하는 것도 좋겠죠? &amp;nbsp; 어차피 이 분들이 2차 면접때 면접관으로 그대로 들어오시니... ㅋㅋㅋㅋ &amp;nbsp; 2차 면접은 굉장히 편안한 분위기 속에서 치러집니다. &amp;nbsp; 앉아 계신 면접관 분들도 분위기를 편안하게 해주려고 노력하십니다. &amp;nbsp; 전공에 대한 질문 보다는 엘지 이노텍이 요즘 중요시 여기는 4대 DNA에 맞는 인물을 고르기 위해 &amp;nbsp; 그것에 맞는 질문을 던집니다. 이 때 대답은 꼭 예를 들어서 설명해주길 원하십니다. &amp;nbsp; 열정적인 인물이라고 생각하는가? 그렇다면 그것을 알 수 있는 예는? &amp;nbsp; 엔지니어로서 중요한 덕목으로 기발한 아이디어라고 대답했는데... &amp;nbsp; 기발한 아이디어로 무엇을 이룩한 적이 있는가? &amp;nbsp; 등등 에피소드 중심의 물고 물어지는 질문들이 계속됩니다. &amp;nbsp; 거짓말은 이야기 하는 도중에 들통나게 되어 있습니다. 솔직하게 인생을 되돌아보며 굵직했던 &amp;nbsp; 사건들 꼭 이야기 하고 싶은 이야기들 준비하면 좋을 듯 합니다. &amp;nbsp; 저는 혼자 들어갔고, 40분정도 이야기를 나눈 듯 하네요... 다른 분들은 3명정도씩 들어가던데... &amp;nbsp; 어찌된 영문인지 모르겠습니다. &amp;nbsp; 이노텍 정말 사람을 중요시 여기는 회사인듯 합니다. 메일로 질문하면 그날 안으로 폰으로 전화를 &amp;nbsp; 주시더라구요... 다들 친절하시고 불편한점은 바로바로 고쳐주십니다. &amp;nbsp; 시스템의 미비한 점을 사람이 친절로 메꿔주는 그런 인간미 넘치는 회사였습니다. &amp;nbsp; 비록 가지는 않았지만 좋은 이미지는 지금까지도 이어지네요.... ^^ &amp;nbsp; 쓰다보니 길어지긴 했습니다만 지원하시는 분들 좋은 결과 있길 바라겠습니다. &amp;nbsp; &amp;nbsp; &amp;nbsp; 이 다음에 또 기회가 될 때는 만도에 대한 후기도 쓰도록 할께요... ㅎㅎㅎ &amp;nbsp; 그리고 이어서 제가 지금 다니고 있는 LIG 넥스원에 대한 이야기도 생생하게 적도록 하겠습니다. &amp;nbsp; 굿 럭~!!! &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/132&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">좌충우돌 구미 공장 견학기</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/131"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/131" thr:count="2" thr:updated="2010-02-13T23:39:51+09:00"/>
  <category term="Diary"/>
  <category term="LIG&#xB125;&#xC2A4;&#xC6D0;"/>
  <category term="&#xACAC;&#xD559;&#xAE30;"/>
  <category term="&#xACF5;&#xC7A5;"/>
  <category term="&#xAD6C;&#xBBF8;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/131</id>
  <updated>2010-01-30T00:38:38+09:00</updated>
  <published>2010-01-30T00:38:38+09:00</published>
  <summary type="html"> 2일간의 일정으로 구미 공장에 다녀왔다. &amp;nbsp; 타이틀은 거창하게 출장이었는데... 신입이다보니 역시 그냥 견학 정도로 만족해야 할 것 같다. &amp;nbsp; 같은 파트 분들 이번에 많이 인사도 드렸고, &amp;nbsp; 내가 하게될 일들 설명도 듣고, 장비들도 직접 만져보고 도면도 익히고 하다보니 &amp;nbsp; 아~~ 뭔가 실감이 난다.... ^^;;; &amp;nbsp; 공장은 연구소쪽이랑은 분위기가 완전히 다르다. &amp;nbsp; 다들 작업복 입고 분주하게 돌아다니는 모습.... 게다가 근무시간과 휴식시간이 칼같이 분리되어 있다. &amp;nbsp; 일하다가 적당히 쉬고 싶으면 커피한잔 하면서 쉬는 연구소랑은 전혀 다른 듯... -_-;;; &amp;nbsp; 뭔가 굉장히 조직적이고 일사분란함을 느낄 수 있었다. 게다가 엄청 넓고 사람도 엄청 많고~~ ^^ &amp;nbsp; 하지만 사람들은 굉장히 여유롭다. 연구소 보다 스트레스는 덜 한건지..... ㅎㅎ &amp;nbsp; 퇴근도 거의 칼 퇴근.... 저녁먹고 공장 내려가봤는데.... 몇명 빼놓고는 전부 다 집에로 ㄱㄱㅆ &amp;nbsp; 24시간 가동하는 라인이 있는 것도 아니고... 한꺼번에 몇천대씩 생산해나는 기계가 있는 것도 아니니.. &amp;nbsp; 뭐 여유로울 것 같긴 하다 ㅎㅎㅎㅎ &amp;nbsp; 나름 재미도 있고, 힘들어도 하고 싶다는 생각이 드는 일인 것 같다. &amp;nbsp; 아.... 다행이다..... 즐기면서 할 수 있는 일을 찾은 것 같아서.... 히힛 &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/131&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">두근두근 첫 출근~♡</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/130"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/130" thr:count="0"/>
  <category term="Diary"/>
  <category term="&#xB125;&#xC2A4;&#xC6D0;"/>
  <category term="&#xCD9C;&#xADFC;"/>
  <category term="&#xD68C;&#xC0AC;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/130</id>
  <updated>2010-01-24T22:26:24+09:00</updated>
  <published>2010-01-24T22:25:56+09:00</published>
  <summary type="html"> 사실 회사 생활은 처음이다. &amp;nbsp; 유일한 경험이라고 한다면 연수원에서 지난 2주간 받았던 교육이 전부랄까? &amp;nbsp; 마치 육군 훈련소에서 교육을 모두 다 마치고, &amp;nbsp; 자대에서 데려가기를 기다리는 그런 심정인거 같다.... &amp;nbsp; 내가 배치받을 부서는? 그리고 내가 하게될 일은? &amp;nbsp; 그 일을 함께하게될 사람들은??? &amp;nbsp; 모든게 궁금하고 어색하고 그래서 약간의 두려움이 있긴 하지만..... &amp;nbsp; 왠지 기다려지는..... 두근두근거림...... 정말 오랫만인듯..... ^^ &amp;nbsp; 오늘 백화점에 들렀다가 세일 마지막 날이라는 말에 &amp;nbsp; 출퇴근하면서 필요할 것 같은 가방을 하나 질렀다. &amp;nbsp; 이렇게 비싼 가방 학생때는 갖고 싶어 하지도 않았고 사지도 않았었는데..... &amp;nbsp; 왠지 사회생활 시작한다니깐 하나쯤은 갖고 싶어졌나보다..... 후후;;;;; &amp;nbsp; 그래... 내일은 너와 함께 새롭게 출발하는거야... ㅋㅋㅋ &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/130&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">신입사원 연수 그리고 임시퇴소</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/129"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/129" thr:count="2" thr:updated="2010-01-24T22:22:35+09:00"/>
  <category term="Diary"/>
  <category term="&#xAC70;&#xC810;&#xBCD1;&#xC6D0;"/>
  <category term="&#xC2E0;&#xC785;&#xC0AC;&#xC6D0;"/>
  <category term="&#xC2E0;&#xC885;&#xD50C;&#xB8E8;"/>
  <category term="&#xC5F0;&#xC218;&#xC6D0;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/129</id>
  <updated>2010-01-18T01:03:19+09:00</updated>
  <published>2010-01-18T01:03:19+09:00</published>
  <summary type="html"> LIG 넥스원에 최종합격 통보를 받고, &amp;nbsp; 11일 드디어 연수원에 입소식을 거치며 신입사원 타이틀을 달았다. &amp;nbsp; 그리고 일주일의 교육....... &amp;nbsp; 사실 처음 입소하기 전에는 이 많은 교육들이 다 필요할까... 재미 없을 거 같기도하고... &amp;nbsp; 귀찮다는 생각도 들긴 했었다. &amp;nbsp; 그런데 막상 입소하고 나서 사람들을 만나고 활동을 진행해 나가면서 나도 모르게 점점 &amp;nbsp; 빠져들고 말았다. 회사에 대해 알고 사람에 대해 알아가면서 정이 들었나 보다. &amp;nbsp; 그래도 건강관리는 잘해놨어야 하는건데..... &amp;nbsp; 연수 첫주의 마지막날 야간행군 30km를 거치면서 몸에 고장이 났다. 감기 몸살....... 두둥.... -_- &amp;nbsp; 사실 며칠 전부터 몸이 안좋았었는데... 행군을 가지 말았어야 할 것을... 내가 우겨서 참석한게 &amp;nbsp; 화근이었나보다.... 쩝 &amp;nbsp; 감기약을 먹어도 열이 떨어지지가 않아서 응급실에 주사를 맞으러 갔는데.... &amp;nbsp; 체온이 39.8도란다... 발열이 있으니 신종플루일 가능성이 있으니 타미플루 복용하고 &amp;nbsp; 거첨병원가서 확진검사를 받으라는데.... 아~~ 하늘이 노래진다...... &amp;nbsp; 역시 걱정했던데로 퇴소 조치가 내려졌고..... &amp;nbsp; 지금 이 시간.... 난 집에 있다. ㅠ.ㅠ &amp;nbsp; 오후에는 백병원에 다녀왔다. &amp;nbsp; 확진검사 받으러.... 신종플루의 기세가 한층 누그러들었다고 생각했는데, &amp;nbsp; 병원에는 여전히 많은 사람들로 북적인다. &amp;nbsp; 휴~~ 제발 양성 반응이 안나왔으면 좋겠는데...... &amp;nbsp; 하루빨리 연수원에 들어가서 나머지 교육이라도 제대로 받았으면 하는 소망이..... ^^;; &amp;nbsp; 어쨌든 결론은 건강 관리 잘합시다!!! &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/129&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;</summary>
 </entry>
 <entry>
  <title type="html">알몸 투시기의 불편한 진실</title>
  <link rel="alternate" type="text/html" href="http://sosori.com/128"/>
  <link rel="replies" type="application/atom+xml" href="http://sosori.com/atom/discuss/128" thr:count="2" thr:updated="2010-07-01T14:48:57+09:00"/>
  <category term="Hot Issue"/>
  <category term="&#xACF5;&#xD56D; &#xAC80;&#xC0C9;"/>
  <category term="&#xBC18;&#xC804;"/>
  <category term="&#xC54C;&#xBAB8;"/>
  <category term="&#xC54C;&#xBAB8; &#xD22C;&#xC2DC;&#xAE30;"/>
  <author>
   <name>소소리</name>
  </author>
  <id>http://sosori.com/128</id>
  <updated>2010-01-06T23:45:44+09:00</updated>
  <published>2010-01-06T23:45:44+09:00</published>
  <summary type="html"> 최근 미국 여객기에 대한 테러 시도가 발생한 이후, 일부 국가에서 공항에 ‘알몸 투시기(naked scanner)’ 설치를 추진하면서 찬반 논란이 거세게 일고 있다. 도대체 ‘알몸 투시기’로 어느 정도 볼 수 있을까? 독일 일간지 빌트 온라인판은 알몸 투시기의 투시 범위를 소개했다. 이 매체는 보안 전문가인 한스 데트레프 다우(54)를 인용, X레이와 달리 알몸 투시기의 극초단파가 피부 속 깊은 곳까지 침투하는 것은 아니라고 보도했다. &amp;nbsp; &amp;nbsp; 다우는 “옷 속에 숨긴 총검류 등 피부 위에 있는 것을 투시할 수 있다. 또 은밀한 부위에 있는 피어싱, 소변을 뽑아내기 위해 체내에 삽입한 관, 여성의 유방과 남성 성기의 형태도 투시할 수 있다”고 말했다. 다우는 “최신 스캐너는 이미지의 은밀한 부위는 자동으로 흐릿하게 처리한다”고 덧붙였다. 다우는 피부 안쪽에 있는 것을 스캔하지는 않는다고 했다. 그는 “예를 들어 임플란트나 심박동기, 인공 관절, 질에 넣는 생리대 등은 잡히지 않는다. 흉터나 문신도 마찬가지”라고 말했다. 임신 여부도 확인되지 않는다고 한다. 사생활 침해 논란과 함께, 알몸 투시기가 건강에 해롭지 않은지도 논란이다. 알몸 투시기에서 스캔을 한 번 하는 것이 휴대전화 1만 통화에 해당되는 전자파에 노출되는 것과 동일하다고 이 매체는 전했다. &amp;nbsp; ========================================================================================= &amp;nbsp; 위의 기사를 보고 마음이 참 불편해졌다. &amp;nbsp; 이제는 외국 나갈 때 저런 투시 장치도 통과를 해야 하는 구나..... &amp;nbsp; 그런데 뭔가 이상하지 않은가... 저 사진.... 정말 색만 조금 왜곡되어 있을 뿐..... &amp;nbsp; 사람의 누드 사진과 거의 흡사하지 않은가...... 그런 생각이 들었다. &amp;nbsp; 바로 작업 시작. 포토샵을 사용하여 Ctrl + I 명령어로 단순히 색 반전을 시켜보았다. &amp;nbsp; 그리고 아래의 사진을 얻어낼 수 있었다. &amp;nbsp; 이건 거의 어지간한 누드 사진과 다를바가 없지 않은가. &amp;nbsp; 만약 외국을 드나들면서 촬영된 공항에서의 투시 사진이 색 반전 된채 어딘가를 돌아다닌다면.... &amp;nbsp; 이건 또 다른 형태의 인권의 침해가 될 것 같다..... &amp;nbsp; 아~~~ 이거 어디 외국 함부로 돌아다니겠나.... 이거야 원.......... -_- &lt;p&gt;&lt;strong&gt;&lt;a href=&quot;http://sosori.com/128&quot;&gt;글 전체보기&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div style=&quot;width: 100%;border:0; text-align: center; padding-top: 15px; padding-bottom: 5px;&quot;&gt;&lt;embed src=&quot;http://api.v.daum.net/static/recombox2.swf?nid=5358182&quot; quality=&quot;high&quot; bgcolor=&quot;#ffffff&quot; width=&quot;400&quot; height=&quot;58&quot; type=&quot;application/x-shockwave-flash&quot;&gt;&lt;/embed&gt;&lt;/div&gt;</summary>
 </entry>
</feed>
