<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>::NPTEAM:: Network Programer Team</title>
		<link>http://npteam.net/</link>
		<description></description>
		<language>ko</language>
		<pubDate>Fri, 05 Feb 2010 23:19:01 +0900</pubDate>
		<generator>Textcube 1.7.6 : Staccato</generator>
		<item>
			<title>그레고리 닥터 하우스 수상소감</title>
			<link>http://npteam.net/767</link>
			<description>&lt;object type=&#039;application/x-shockwave-flash&#039; width=&quot;502&quot; height=&quot;399&quot; align=&#039;middle&#039; classid=&#039;clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&#039; codebase=&#039;http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0&#039;&gt;&lt;param name=&#039;movie&#039; value=&#039;http://flvs.daum.net/flvPlayer.swf?vid=U6qha4OuDYE$&#039; /&gt;&lt;param name=&#039;allowScriptAccess&#039; value=&#039;always&#039; /&gt;&lt;param name=&#039;allowFullScreen&#039; value=&#039;true&#039; /&gt;&lt;param name=&#039;bgcolor&#039; value=&#039;#000000&#039; /&gt;&lt;embed src=&#039;http://flvs.daum.net/flvPlayer.swf?vid=U6qha4OuDYE$&#039; width=&quot;502&quot; height=&quot;399&quot; allowScriptAccess=&#039;always&#039; type=&#039;application/x-shockwave-flash&#039; allowFullScreen=&#039;true&#039; bgcolor=&#039;#000000&#039; &gt;&lt;/embed&gt;&lt;/object&gt;&lt;BR&gt;역시 기대를 저버리지 않네요. ㅎㅎ</description>
			<category>TTF 개인 폴더</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/767</guid>
			<comments>http://npteam.net/767#entry767comment</comments>
			<pubDate>Wed, 03 Feb 2010 01:41:28 +0900</pubDate>
		</item>
		<item>
			<title>[STL]  STL Container 자료구조 순환 삭제를 위한 코드</title>
			<link>http://npteam.net/753</link>
			<description>&lt;strong&gt;&lt;font size=&quot;3&quot;&gt;STL Container 자료구조 순환 삭제를 위한 코드&lt;/font&gt;&lt;/strong&gt; &lt;br /&gt;&lt;br /&gt;컨테이너가 표준 &lt;font color=&quot;#ff9900&quot;&gt;&lt;strong&gt;시퀀스 컨테이너&lt;/strong&gt;&lt;/font&gt;이면, 컨테이너 요소를 하나씩 사용하는 루프를 작성합니다.&lt;br /&gt;(erase를 호출할 때마다 그 함수의 &lt;font color=&quot;#008000&quot;&gt;&lt;strong&gt;반환값으로 반복자를 업데이트&lt;/strong&gt;&lt;/font&gt; 하는 일을 꼭 해야 합니다.)&lt;br /&gt;&lt;br /&gt;컨테이너가 표준 &lt;font color=&quot;#ff9900&quot;&gt;&lt;strong&gt;연관 컨테이너&lt;/strong&gt;&lt;/font&gt;이면, 컨테이너 요소를 하나씩 사용하는 루프를 작성합니다.&lt;br /&gt;(erase를 호출하면서 erase에 넘기는 반복자를 &lt;font color=&quot;#008000&quot;&gt;&lt;strong&gt;후위 증가 연산자로 &lt;/strong&gt;&lt;/font&gt;증가시킵니다.)&lt;br /&gt;&lt;br /&gt;&lt;font color=&quot;#8e8e8e&quot;&gt;&lt;strong&gt;(출처 : Effective STL p88)&lt;br /&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;&lt;strong&gt;팁 : erase() 함수의 리턴값이 있으면 반환값을 받고, 없으면 후위 증가 연산자로 증가시킵니다.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;// std::vector 순환 삭제 코드
typedef std::vector&amp;lt; int &amp;gt; VEC_Container;
VEC_Container vecContainer;

vecContainer.push_back( 1 );
vecContainer.push_back( 2 );
vecContainer.push_back( 3 );
vecContainer.push_back( 4 );
vecContainer.push_back( 5 );

VEC_Container::iterator it = vecContainer.begin();
for( ; it != vecContainer.end(); )
{
	// erase 코드
	if( TRUE /*FALSE*/ )
	{
		it = vecContainer.erase( it );
		continue;
	}
	
	++it;
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;// std::list 순환 삭제 코드
typedef std::list&lt; int &gt; LIST_Container;
LIST_Container listContainer;

listContainer.push_back( 1 );
listContainer.push_back( 2 );
listContainer.push_back( 3 );
listContainer.push_back( 4 );
listContainer.push_back( 5 );

LIST_Container::iterator it = listContainer.begin();
for( ; it != listContainer.end(); )
{
	// erase 코드
	if( TRUE /*FALSE*/ )
	{
		it = listContainer.erase( it );
		continue;
	}
	
	++it;
}
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class=&quot;brush: cpp&quot;&gt;// std::map 순환 삭제 코드
typedef std::map&lt; int, int &gt; MAP_Container;
MAP_Container mapContainer;

mapContainer.insert( std::make_pair(1, 5) );
mapContainer.insert( std::make_pair(2, 4) );
mapContainer.insert( std::make_pair(3, 3) );
mapContainer.insert( std::make_pair(4, 2) );
mapContainer.insert( std::make_pair(5, 1) );

MAP_Container::iterator it = mapContainer.begin();
for( ; it != mapContainer.end(); )
{
	// erase 코드
	if( TRUE /*FALSE*/ )
	{
		mapContainer.erase( it++ );
		continue;
	}
	
	++it;
}
&lt;/pre&gt;</description>
			<category>소스 코드</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/753</guid>
			<comments>http://npteam.net/753#entry753comment</comments>
			<pubDate>Mon, 30 Nov 2009 21:52:58 +0900</pubDate>
		</item>
		<item>
			<title>간단한 Doxygen 사용 방법</title>
			<link>http://npteam.net/752</link>
			<description>&lt;P&gt;프로그래밍과 문서화, 문서화와 프로그래밍...&lt;BR&gt;프로그래머를 직업으로 가진 사람들은 한정된 시간에 프로그래밍 결과물과 문서화를 동시에 이루어야 하는 숙명을 지니고 살아간다.&lt;BR&gt;&lt;BR&gt;이 두마리 토끼를 한번에 잡을 수 있을까?&lt;BR&gt;한번에 두마리 토끼를 잡으려면, 토끼 한마리를 잡은 다음 토끼가 친구를 데려오게 하는 방법이 좋다.(-_-;)&lt;BR&gt;&lt;BR&gt;Doxygen은 주석을 문서화 해주는 측면에서 매우 유용하다. 쓸만하다. 좋다.... 라는 평은 많이 들었지만,&lt;BR&gt;실제로 사용하기 전에는 약간은 망설이게 된다.&lt;BR&gt;&lt;BR&gt;이제부터 Doxygen 사용법에 대해서 알아보자.&lt;BR&gt;&lt;A href=&quot;http://www.stack.nl/~dimitri/doxygen/&quot;&gt;http://www.stack.nl/~dimitri/doxygen/&lt;/A&gt;&amp;nbsp;여기에서 Doxygen을 다운로드 받는다.&lt;BR&gt;&lt;STRONG&gt;doxygen-1.6.1-setup.exe &lt;/STRONG&gt;파일을 실행하여 설치한다.&lt;BR&gt;&lt;BR&gt;그래프 구조로 보기 위해서&lt;BR&gt;&lt;A href=&quot;http://www.graphviz.org/Download..php&quot;&gt;http://www.graphviz.org/Download..php&lt;/A&gt;&amp;nbsp;여기에서 graphviz를 다운로드 받는다.&lt;BR&gt;graphviz-2.24.msi 파일을 실행하여 설치한다.&lt;BR&gt;&lt;BR&gt;이제 모든 준비는 끝났다. &lt;BR&gt;&quot;C:\Program Files\doxygen\bin\doxywizard.exe&quot; 를 실행한다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1298620026.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1298620026.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1292996932.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1292996932.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1239885677.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1239885677.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1161660547.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1161660547.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1143211492.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1143211492.png&quot; width=&quot;509&quot; height=&quot;367&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1338183295.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1338183295.png&quot; width=&quot;494&quot; height=&quot;356&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1280564209.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1280564209.png&quot; width=&quot;552&quot; height=&quot;512&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1314585591.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1314585591.png&quot; width=&quot;494&quot; height=&quot;356&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;위와 같이 설정후 Run을 누르면,&lt;BR&gt;D:\Project\TEST_CODE\Document\html\index.html 로 다음과 같은 출력물을 볼 수 있다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1315989484.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1315989484.png&quot; width=&quot;560&quot; height=&quot;420&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;기본적인 출력만 하더라도 노력한 결과에 비해서 상당히 예쁜(프로그래머 입장에서) 결과물을 볼 수 있었다.&lt;BR&gt;&lt;BR&gt;&lt;A href=&quot;http://www.atomineer.com/AtomineerUtils.html&quot;&gt;http://www.atomineer.com/AtomineerUtils.html&lt;/A&gt;&amp;nbsp;에서 atomineer 플러그인을 설치하면,&lt;BR&gt;비주얼 스튜디오에서 다음의 메뉴가 활성화 된다.&lt;BR&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1021106365.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1021106365.png&quot; width=&quot;456&quot; height=&quot;207&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;위 플러그인을 이용해서 함수와 클래스에 약간의 설명을 추가해 보도록 한다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1386556667.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1386556667.png&quot; width=&quot;497&quot; height=&quot;397&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1348879543.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1348879543.png&quot; width=&quot;577&quot; height=&quot;346&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;</description>
			<category>Tip&amp;Tech</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/752</guid>
			<comments>http://npteam.net/752#entry752comment</comments>
			<pubDate>Sun, 29 Nov 2009 16:30:00 +0900</pubDate>
		</item>
		<item>
			<title>[C++] ReturnMacro</title>
			<link>http://npteam.net/750</link>
			<description>&lt;P&gt;C++ 코드 작성시 가독성과 흐름처리를 원활하게 하기 위해서 다음과 같이 리턴 처리를 자주하게 된다.&lt;/P&gt;&lt;PRE class=&quot;brush: cpp&quot;&gt;bool LogicProcedure()
{
    if( A_Logic )
    {
        return false;
    }

    if( B_Logic )
    {
        return false;
    }

    return true;
}
&lt;/PRE&gt;위와 같이 중간에 흐름제어를 하기 위해서 try catch를 쓰고 싶어진다.&lt;BR&gt;&lt;BR&gt;이를 해결하기 위해서 ReturnMacro를 작성하였다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1208251094.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1208251094.png&quot; width=&quot;600&quot; height=&quot;231&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1231522220.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1231522220.png&quot; width=&quot;600&quot; height=&quot;329&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;프로그래머에게 금기시되는 goto 제어문을 define으로 감싸서 &lt;BR&gt;1. 코드 가독성&lt;BR&gt;2. 사용자 편의&lt;BR&gt;3. 성능상의 잇점&lt;BR&gt;3가지를 모두 얻을 수 있도록 헤더 파일을 제작하였다.&lt;BR&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://www.npteam.net/attachment/1197328157.h&quot;&gt;&lt;img src=&quot;http://www.npteam.net/image/extension/unknown.gif&quot; alt=&quot;&quot; /&gt; ReturnMacro.h&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;BR&gt;&lt;PRE class=&quot;brush: cpp&quot;&gt;#pragma once

#include &amp;lt; strsafe.h &amp;gt;

//////////////////////////////////////////////////////////////////////////
// ReturnMacro For Singleton Class
template &amp;lt; typename T &amp;gt;
class CReturnMacroForSingleton
{
public:
	static T * InstancePtr()
	{
		if( ms_Instance == NULL ) ms_Instance = new T;
		return ms_Instance;
	};
	static T &amp;amp; Instance()
	{
		if( ms_Instance == NULL ) ms_Instance = new T;
		return *ms_Instance;
	};
	static void DestroyInstance()
	{
		delete ms_Instance;
		ms_Instance = NULL;
	};

private:
	static T * ms_Instance;
};

template&amp;lt; typename T &amp;gt; T* CReturnMacroForSingleton&lt;T&gt;::ms_Instance = 0;
//////////////////////////////////////////////////////////////////////////


//////////////////////////////////////////////////////////////////////////
class CReturnMacro : public CReturnMacroForSingleton&amp;lt; CReturnMacro &amp;gt;
{
public:
	explicit CReturnMacro()
		: m_nGetLastLine(0)
	{
		memset( m_tszFunctionName, 0, sizeof( m_tszFunctionName ) );
	};

	~CReturnMacro() {};

public:
	inline int	GetLastLine()							{ return m_nGetLastLine;		}
	inline void	SetLastLine( int nLine )				{ m_nGetLastLine = nLine;		}

	inline TCHAR* GetFunctionName()						{ return m_tszFunctionName;		}
	inline void	  SetFunctionName( TCHAR* ptszFnName )
	{
		if( FAILED( StringCchCopy( m_tszFunctionName, _countof( m_tszFunctionName ), ptszFnName ) ) )
		{
			memset( m_tszFunctionName, 0, sizeof( m_tszFunctionName ) );
		}
	}

private:
	int		m_nGetLastLine;
	TCHAR	m_tszFunctionName[256];
};

#define RETURNMACRO CReturnMacro::Instance()
//////////////////////////////////////////////////////////////////////////


struct RETURN_RESULT
{
	int		LastLine;
	TCHAR*	LastFnName;
};

#define RETURN_VOID

//////////////////////////////////////////////////////////////////////////
// RETURN FAIL
#define RETURN_FAIL()													\
	RETURNMACRO.SetLastLine( __LINE__ );								\
	RETURNMACRO.SetFunctionName( _T(__FUNCTION__) );					\
	goto RET_FAIL;

#define RETURN_FAIL_BEGIN()												\
	RET_FAIL:															\
	RETURN_RESULT Ret_Fail;												\
	Ret_Fail.LastLine	= RETURNMACRO.GetLastLine();					\
	Ret_Fail.LastFnName = RETURNMACRO.GetFunctionName();

#define RETURN_FAIL_END( ReturnValue )									\
	return ReturnValue;
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
// RETURN_SUCCESS
#define RETURN_SUCCESS( )												\
	RETURNMACRO.SetLastLine( __LINE__ );								\
	RETURNMACRO.SetFunctionName( _T(__FUNCTION__) );					\
	goto RET_SUCCESS;

#define RETURN_SUCCESS_BEGIN()											\
	RET_SUCCESS:														\
	RETURN_RESULT Ret_Success;											\
	Ret_Success.LastLine   = RETURNMACRO.GetLastLine();					\
	Ret_Success.LastFnName = RETURNMACRO.GetFunctionName();

#define RETURN_SUCCESS_END( ReturnValue )								\
	return ReturnValue;
//////////////////////////////////////////////////////////////////////////&lt;/PRE&gt;&lt;STRONG&gt;&lt;BR&gt;&lt;BR&gt;Visual Assist Snippet code&lt;/STRONG&gt; &lt;PRE class=brush:cpp&gt;RETURN_SUCCESS();


#pragma region RETURN_MACRO

	RETURN_FAIL_BEGIN();
	// Fail Code.
	RETURN_FAIL_END( RETURN_VOID );

	RETURN_SUCCESS_BEGIN();
	// Success Code.
	RETURN_SUCCESS_END( RETURN_VOID );

#pragma endregion RETURN_MACRO
&lt;/PRE&gt;</description>
			<category>소스 코드</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/750</guid>
			<comments>http://npteam.net/750#entry750comment</comments>
			<pubDate>Sat, 21 Nov 2009 22:22:07 +0900</pubDate>
		</item>
		<item>
			<title>[WMI] 프로세스 (시작 / 종료) 이벤트 발생시 프로그램 실행하기</title>
			<link>http://npteam.net/746</link>
			<description>&lt;DIV style=&quot;TEXT-ALIGN: right&quot;&gt;출처 : &lt;A href=&quot;http://www.npteam.net/746&quot;&gt;http://www.npteam.net/746&lt;/A&gt;&lt;/DIV&gt;프로세스 시작/종료 이벤트시에 하고 싶은 것들이 많다.&lt;BR&gt;서버 프로그래머라면 서버 프로그램이 이유없이 죽을때 시간 및 Log를 남길 수도 있고,&lt;BR&gt;프로그램이 죽으면, 다시 시작하도록 설정해서 24시간 스스로 유지되길 바라는 경우가 있다.&lt;BR&gt;이럴때 윈도우에서 실행가능한 VBS(WMI)스크립트로 간단하게 관리해 보자.&lt;BR&gt;&lt;BR&gt;아래의 스크립트는 다음과 같은 작동을 합니다.&lt;BR&gt;1. 무한 루프를 반복하면서 1초마다 프로세스가 생성되거나 삭제되는 이벤트를 감시한다.&lt;BR&gt;2. notepad.exe 프로세스가 생성되면, calc.exe를 실행합니다.&lt;BR&gt;3. notepad.exe 프로세스가 삭제되면, calc.exe를 종료합니다.&lt;BR&gt;&lt;BR&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://www.npteam.net/attachment/1331519571.vbs&quot;&gt;&lt;img src=&quot;http://www.npteam.net/image/extension/unknown.gif&quot; alt=&quot;&quot; /&gt; ProcessEvent.vbs&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;&lt;PRE class=&quot;brush: vb&quot;&gt;Option Explicit

Dim strComputer
strComputer = &quot;.&quot;

&#039;기본 Object 가져오기
Dim Shell : Set Shell = WScript.CreateObject(&quot;WScript.Shell&quot;)
Dim FSO : Set FSO = CreateObject(&quot;Scripting.FileSystemObject&quot;)
Dim objWMIService : Set objWMIService = GetObject(&quot;winmgmts:\\&quot; &amp;amp; strComputer &amp;amp; &quot;\root\cimv2&quot;)
Dim colMonitorCreateProcessesEvent : Set colMonitorCreateProcessesEvent = objWMIService.ExecNotificationQuery(&quot;select * from __InstanceCreationEvent within 1 where TargetInstance isa &#039;Win32_Process&#039;&quot; )
Dim colMonitorDeleteProcessesEvent : Set colMonitorDeleteProcessesEvent = objWMIService.ExecNotificationQuery(&quot;select * from __InstanceDeletionEvent within 1 where TargetInstance isa &#039;Win32_Process&#039;&quot; )

&#039;CMD 윈도우 98에서도 적용 가능하게 COMSPEC으로 가져온다.
Dim COMSPEC : COMSPEC = Shell.ExpandEnvironmentStrings(&quot;%comspec%&quot;)

&#039;메인 함수 실행
Call MainFunction()


Sub MainFunction
	&#039;중복 실행 방지 코드 - vbs 파일명을 입력합니다.
	If( IsExistSameVBS( &quot;ProcessEvent.vbs&quot; ) ) Then
		Wscript.Quit
	End If
	
	Do While True
		Call ProcessCreatedEvent()
		Call ProcessDeletedEvent()
		Wscript.Sleep( 1000 )
	Loop
	
	Wscript.Quit
End Sub


Sub ProcessCreatedEvent
	&#039;프로세스 시작시
	
	&#039;모니터링할 프로세스 이름
	Dim strMonitorProcessName : strMonitorProcessName = &quot;notepad.exe&quot;
	
	&#039;실행할 파일
	Dim strExecuteFilePath : strExecuteFilePath = &quot;C:\Windows\system32&quot;
	Dim strExecuteFileName : strExecuteFileName = &quot;calc.exe&quot;
	
	&#039;프로세스 시작 이벤트 검사
	Dim objLastestProcess : Set objLastestProcess = colMonitorCreateProcessesEvent.NextEvent
	If( StrComp(Lcase(objLastestProcess.TargetInstance.Name), Lcase(strMonitorProcessName), 1 ) = 0 ) Then
		&#039;프로그램 실행
		Call ExecuteOnce( strExecuteFilePath, strExecuteFileName, &quot;&quot; )
	End If
End Sub


Sub ProcessDeletedEvent
	&#039;프로세스 종료시
	
	&#039;모니터링할 프로세스 이름
	Dim strMonitorProcessName : strMonitorProcessName = &quot;Notepad.exe&quot;
	
	&#039;종료할 프로세스 이름
	Dim strKillProcessName : strKillProcessName = &quot;calc.exe&quot;
	
	&#039;프로세스 종료 이벤트 검사
	Dim objLastestProcess : Set objLastestProcess = colMonitorDeleteProcessesEvent.NextEvent
	If( StrComp(Lcase(objLastestProcess.TargetInstance.Name), Lcase(strMonitorProcessName), 1) = 0 ) Then
		&#039;프로세스 종료
		Call KillProcess( strKillProcessName )
	End If
End Sub


Sub ExecuteFile (strFileFullPath, Arguments)
	If( FSO.FileExists( strFileFullPath ) ) Then
		Shell.Run COMSPEC &amp;amp; &quot; /c &quot; &amp;amp; strFileFullPath &amp;amp; Arguments &amp;amp; &quot; &amp;amp; Exit&quot;, 0
	Else
		Shell.Popup strFileFullPath &amp;amp; &quot; 을(를) 찾을 수 없습니다.&quot;, 3, &quot;File Dose not exist&quot;, 48
		Wscript.Quit
	End If
End Sub


Function IsExistProcess( strProcessName )
	IsExistProcess = False
	
	Dim colProcessList, objProcess
	Set colProcessList = objWMIService.ExecQuery( &quot;select * from Win32_Process&quot; )
	For Each objProcess in colProcessList
		If( StrComp(Lcase(strProcessName), Lcase(objProcess.Name), 1) = 0 ) Then
			IsExistProcess = True
		End If
	Next
End Function


Sub ExecuteOnce( strFilePath, strFileName, Arguments )
	If( IsExistProcess( strFileName ) = False ) Then
		Call ExecuteFile( strFilePath &amp;amp; &quot;\&quot; &amp;amp; strFileName, Arguments )
		Wscript.Sleep 2000
	End If
End Sub


Sub KillProcess( strProcessName )
	Dim colProcessList, objProcess
	Set colProcessList = objWMIService.ExecQuery( &quot;select * from Win32_Process&quot; )
	For Each objProcess in colProcessList
		If( StrComp(Lcase(strProcessName), Lcase(objProcess.Name), 1) = 0 ) Then
			objProcess.Terminate()
		End If
	Next
End Sub


Function IsExistSameVBS( strFileName )
	IsExistSameVBS = False
	Dim nSameVBSCount : nSameVBSCount = 0
	
	Dim colProcessList, objProcess
	Set colProcessList = objWMIService.ExecQuery(&quot;SELECT * FROM Win32_Process WHERE Name = &#039;wscript.exe&#039; OR Name = &#039;cscript.exe&#039;&quot;)
	For Each objProcess in colProcessList
		If InStr( Lcase(objProcess.CommandLine), Lcase(strFileName) ) Then
			nSameVBSCount = nSameVBSCount + 1
		End If
	Next
	
	If( nSameVBSCount &amp;gt; 1 ) Then
		IsExistSameVBS = True
		Wscript.echo strFileName &amp;amp; &quot; 은 이미 실행중인 스크립트 입니다.&quot;
	End If
End Function
&lt;/PRE&gt;</description>
			<category>WMI 스크립트</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/746</guid>
			<comments>http://npteam.net/746#entry746comment</comments>
			<pubDate>Fri, 06 Nov 2009 21:53:51 +0900</pubDate>
		</item>
		<item>
			<title>MS-SQL 2005의 TRY _ CATCH를 써보자</title>
			<link>http://npteam.net/738</link>
			<description>&lt;PRE class=&quot;brush: sql;&quot;&gt;
CREATE PROCEDURE NormalInsert(
	@Context nvarchar(100)
)
AS
BEGIN
	SET NOCOUNT ON

	DECLARE @StartTime    DATETIME
	SET @StartTime = GETDATE()

	DECLARE @LoopCount INT
	SET @LoopCount = 10000

	WHILE( @LoopCount &amp;gt; 0 )
	BEGIN
		BEGIN TRANSACTION
			INSERT SendBox(Context) values (@Context)
			IF( @@Error &amp;lt;&amp;gt; 0 or @@RowCount = 0)
			BEGIN
				ROLLBACK TRANSACTION
				RAISERROR(&#039;Error when processing INSERT statement or Task Table.&#039;,15,1)
				RETURN -100
			END

		COMMIT TRANSACTION

		SET @LoopCount = @LoopCount - 1
	END

	PRINT &#039;Elapsed Time : &#039; + convert( varchar(128), GETDATE() - @StartTime, 114 )

	RETURN
END
GO
&lt;/PRE&gt;&lt;BR /&gt;
Normal Insert 사용시&lt;BR /&gt;Elapsed Time : 00:00:02:653 &lt;BR /&gt;Elapsed Time : 00:00:02:593 &lt;BR /&gt;Elapsed Time : 00:00:02:560 &lt;BR /&gt;Elapsed Time : 00:00:02:737 &lt;BR /&gt;Elapsed Time : 00:00:02:593&lt;BR /&gt;
&lt;PRE class=&quot;brush: sql;&quot;&gt;
CREATE PROCEDURE TryInsert(
	@Context nvarchar(100)
)
AS
BEGIN
	SET NOCOUNT ON

	DECLARE @StartTime    DATETIME
	SET @StartTime = GETDATE()

	DECLARE @LoopCount INT
	SET @LoopCount = 10000

	WHILE( @LoopCount &amp;gt; 0 )
	BEGIN
		BEGIN TRY
			BEGIN TRANSACTION
				INSERT SendBox(Context) values (@Context)
			COMMIT TRANSACTION
		END TRY

		BEGIN CATCH
			ROLLBACK TRANSACTION

			BEGIN
				RAISERROR(&#039;Error when processing INSERT statement or Task Table.&#039;,15,1)
				RETURN -100
			END
		END CATCH

		SET @LoopCount = @LoopCount - 1
	END

	PRINT &#039;Elapsed Time : &#039; + convert( varchar(128), GETDATE() - @StartTime, 114 )

	RETURN
END
GO
&lt;/PRE&gt;&lt;BR /&gt;
Try Insert 사용시&lt;BR /&gt;
Elapsed Time : 00:00:02:860&lt;BR /&gt;
Elapsed Time : 00:00:02:810&lt;BR /&gt;
Elapsed Time : 00:00:03:063&lt;BR /&gt;
Elapsed Time : 00:00:02:640&lt;BR /&gt;
Elapsed Time : 00:00:02:767&lt;BR /&gt;</description>
			<category>MS-SQL</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/738</guid>
			<comments>http://npteam.net/738#entry738comment</comments>
			<pubDate>Thu, 10 Sep 2009 13:43:06 +0900</pubDate>
		</item>
		<item>
			<title>프로그램은 왜 실패하는가? (발표자료)</title>
			<link>http://npteam.net/734</link>
			<description>아키텍트를 꿈꾸는 사람들에서 진행하는 토요일 스터디.&lt;BR /&gt;발표 자료입니다.&lt;BR /&gt;&lt;BR /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a class=&quot;extensionIcon&quot; href=&quot;http://www.npteam.net/attachment/1093796661.pptx&quot;&gt;&lt;img src=&quot;http://www.npteam.net/image/extension/unknown.gif&quot; alt=&quot;&quot; /&gt; 프로그램은 왜 실패하는가.pptx&lt;/a&gt;&lt;/div&gt; 
&lt;DIV id=__ss_1764993 style=&quot;WIDTH: 425px; TEXT-ALIGN: left&quot;&gt;&lt;A title=&quot;프로그램은 왜 실패하는가&quot; style=&quot;DISPLAY: block; MARGIN: 12px 0px 3px; FONT: 14px Helvetica,Arial,Sans-serif; TEXT-DECORATION: underline&quot; href=&quot;http://www.slideshare.net/zone0000/ss-1764993&quot;&gt;프로그램은 왜 실패하는가&lt;/A&gt;&lt;object style=&quot;margin:0px&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-090724102328-phpapp02&amp;amp;stripped_title=ss-1764993&quot; /&gt;&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;&lt;embed src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=random-090724102328-phpapp02&amp;amp;stripped_title=ss-1764993&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt; 
&lt;DIV style=&quot;FONT-SIZE: 11px; PADDING-TOP: 2px; FONT-FAMILY: tahoma,arial; HEIGHT: 26px&quot;&gt;View more &lt;A style=&quot;TEXT-DECORATION: underline&quot; href=&quot;http://www.slideshare.net/&quot;&gt;presentations&lt;/A&gt; from &lt;A style=&quot;TEXT-DECORATION: underline&quot; href=&quot;http://www.slideshare.net/zone0000&quot;&gt;zone0000&lt;/A&gt;.&lt;/DIV&gt;&lt;/DIV&gt;</description>
			<category>문서모음</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/734</guid>
			<comments>http://npteam.net/734#entry734comment</comments>
			<pubDate>Sat, 25 Jul 2009 00:12:03 +0900</pubDate>
		</item>
		<item>
			<title>Effective C++ 공부중(요약)</title>
			<link>http://npteam.net/733</link>
			<description>&lt;P&gt;1장 C++에 왔으면 C++의 법에 따릅시다.&lt;/P&gt;
&lt;P&gt;#1. C++을 언어들의 연합체로 바라보는 안목은 필수&lt;/P&gt;
&lt;P&gt;&amp;nbsp;C++은 다중 패러다임 프로그래밍 언어이다.&lt;BR&gt;&amp;nbsp;+---- 절차적(procedural) 프로그래밍&lt;BR&gt;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;+---- 객체지향(object-oriented)&lt;BR&gt;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;+---- 함수식(functional)&lt;BR&gt;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;+---- 일반화(generic)프로그래밍&lt;BR&gt;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;+---- 메타프로그래밍(metaprogramming)&lt;/P&gt;
&lt;P&gt;&amp;nbsp;C++의 하위언어&lt;BR&gt;&amp;nbsp;+---- C : &lt;BR&gt;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;+---- 객체 지향 개념의 C++ : 클래스, 캡슐화, 상속, 다형성, 가상함수(동적 바인딩)&lt;BR&gt;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;+---- 템플릿 C++&lt;BR&gt;&amp;nbsp;|&lt;BR&gt;&amp;nbsp;+---- STL : 컨테이너(container), 반복자(iterator), 알고리즘(algorithm), 함수 객체(function object)&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#2. #define을 쓰려거든 const, enum, inline을 떠올리자&lt;BR&gt;&amp;nbsp;선행처리자(pre-complier)보다 컴파일러를 더 가까이하자.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;(1) 매크로 대신 상수를 쓰자.&lt;BR&gt;&amp;nbsp;#define ASPECT_RATIO 1.653&lt;BR&gt;&amp;nbsp;--&amp;gt; const double AspectRation = 1.653;&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;코드에서 숫자상수로 바뀌기 때문에, 기호 테이블(symbolic table)에 등록되지 않는다.&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;const char* const authorName = &quot;Sccot Meyers&quot;;&lt;BR&gt;&amp;nbsp;const std::string authorName(&quot;Sccot Meyers&quot;);&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;(2) 클래스 맴버로 상수를 정의하는 경우&lt;BR&gt;&amp;nbsp;class CSomething{&lt;BR&gt;&amp;nbsp; static const int NumTurns = 5;&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;static 멤버로 만든다. -&amp;gt; 유효영역이 클래스영역으로 제한되어 캡슐화에 용이하다.&lt;/P&gt;
&lt;P&gt;&amp;nbsp;선언 방법&lt;BR&gt;&amp;nbsp;a. 정적 맴버 변수가 정수형일 경우에는 선언과 동시에 초기화 가능&lt;BR&gt;&amp;nbsp;b. 그외의 타입은 구현부분에서 초기화&lt;/P&gt;
&lt;P&gt;&amp;nbsp;class CSomething {&lt;BR&gt;&amp;nbsp; static const double FudgeFactor;&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;const double CSomething::FudgeFactor = 1.35;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;&amp;nbsp;(3) enum 나열자 둔갑술&lt;BR&gt;&amp;nbsp;나열자(enumerator)타입은 int가 놓일 곳에도 쓸 수 있다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;예) 배열의 크기를 정의할때&lt;BR&gt;&amp;nbsp;class CSomething {&lt;BR&gt;&amp;nbsp;private:&lt;BR&gt;&amp;nbsp; enum { NumTurns = 5 };&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; int scores[NumTurns];&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;#define CALL_WITH_MAX(a, b) f((a) &amp;gt; (b) ? (a) : (b))&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;int a = 5, b = 0;&lt;BR&gt;&amp;nbsp;CALL_WITH_MAX( ++a, b );&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;template &amp;lt;typename T&amp;gt;&lt;BR&gt;&amp;nbsp;inline void callWithMax(const T&amp;amp; a, const T&amp;amp; b)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp; f(a &amp;gt; b ? a : b);&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;#3. 낌새만 보이면 const를 들이대 보자!&lt;BR&gt;&amp;nbsp;char greeting[] = &quot;Hello&quot;;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;const char *p = greeting; // 상수 데이터, 비상수 포인터&lt;BR&gt;&amp;nbsp;char * const p = greeting; // 비상수 데이터, 상수 포인터&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;const &amp;lt;- * : 데이터&lt;BR&gt;&amp;nbsp;* -&amp;gt; const : 포인터&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;void f1(const Widget *pw); == void f1(Widget const *pw);&lt;BR&gt;&amp;nbsp;// 둘다 같은 용법이다. * 왼쪽에 const는 마음데로 위치할 수 있다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;std::vector&amp;lt;int&amp;gt; vec;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;const std::vector&amp;lt;int&amp;gt;::iterator iter = vec.begin();&lt;BR&gt;&amp;nbsp;*iter = 10; &amp;nbsp;// 데이터 수정 가능&lt;BR&gt;&amp;nbsp;++iter; &amp;nbsp; // iterator 변경 불가능&lt;/P&gt;
&lt;P&gt;&amp;nbsp;std::vector&amp;lt;int&amp;gt;::const_iterator cIter = vec.begin();&lt;BR&gt;&amp;nbsp;*cIter = 10; // 데이터 수정 불가능&lt;BR&gt;&amp;nbsp;++iter; &amp;nbsp; // iterator 변경 가능&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#4. 객체를 사용하기 전에 반드시 그 객체를 초기화 하자.&lt;BR&gt;&amp;nbsp;직접 초기화, 생성자 초기화&lt;BR&gt;&amp;nbsp;C++ 규칙 어떤 객체이든 그 객체의 데이터 맴버는 생성자의 본문이 &quot;실행되기 전&quot;에 초기화 되어야 한다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;초기화 순서&lt;BR&gt;&amp;nbsp;1. 기본 클래스는 파생클래스 보다 먼저 초기화된다.&lt;BR&gt;&amp;nbsp;2. 클래스 데이터 맴버는 선언된 순서대로 초기화된다.&lt;BR&gt;&amp;nbsp;3. 정적 객체의 초기화 순서는 개별 번역 단위에서 정해진다.&lt;BR&gt;&amp;nbsp; &amp;nbsp; (--&amp;gt; 초기화 시점이 달라질수 있으므로 싱글턴 패턴을 이용하여 해결하자)&lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;BR&gt;&amp;nbsp; &amp;nbsp; &lt;BR&gt;2장 생성자, 소멸자 및 대입연산자&lt;/P&gt;
&lt;P&gt;#5. C++가 은근슬쩍 만들어 호출해 버리는 함수들에 촉각을 세우자. &lt;BR&gt;&amp;nbsp;클래스에 선언하지 않으면 컴파일러가 저절로 선언해 주는 것.&lt;BR&gt;&amp;nbsp;1. 복사 생성자&lt;BR&gt;&amp;nbsp;2. 복사 대입 연산자&lt;BR&gt;&amp;nbsp;3. 소멸자&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;class Empty{&lt;BR&gt;&amp;nbsp;public:&lt;BR&gt;&amp;nbsp; Empty() {} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 기본생성자&lt;BR&gt;&amp;nbsp; Empty(const Empty&amp;amp; rhs) {} &amp;nbsp; &amp;nbsp;// 복사생성자&lt;BR&gt;&amp;nbsp; ~Empty() {} &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 소멸자&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; Empty&amp;amp; operator=(const Empty&amp;amp; rhs){} // 복사 대입 연산자&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Empty e1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 기본생성자, 소멸자&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;Empty e2(e1); &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;// 복사 생성자&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;e2 = e1; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 복사 대입 연산자&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;암시적인 복사 대입연산자를 사용하지 못하도록 하는 방법&lt;BR&gt;&amp;nbsp;기본 클래스에서 복사 대입 연산자를 private로 선언하면,&lt;BR&gt;&amp;nbsp;파생 클래스에서 암시적 복사 대입 연산자를 가질수 없다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#6. 컴파일러가 만들어낸 함수가 필요 없으면 확실히 이들의 사용을 금해 버리자.&lt;BR&gt;&amp;nbsp;HomeForSale h1;&lt;BR&gt;&amp;nbsp;HomeForSale h2;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;HomeForSale h3(h1); &amp;nbsp;// 복사생성자 컴파일 금지&lt;BR&gt;&amp;nbsp;h1 = h2; &amp;nbsp; &amp;nbsp;// 복사 대입 연산자 컴파일 금지&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;해결방법 : 컴파일러가 생성하는 함수는 모두 공개된다.&lt;BR&gt;&amp;nbsp;private로 복사생성자와 복사대입연산자를 선언하면 컴파일러는 자동 생성을 할 수 없다.&lt;BR&gt;&amp;nbsp;명시적 선언을 하면 컴파일러는 자동생성을 하지 않고, private로 선언했으므로 외부에서 접근 불가.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;friend 접근까지 막으려면, 함수를 선언만 하고 정의하지 않으면 된다.&lt;BR&gt;&amp;nbsp;class HomeForSale {&lt;BR&gt;&amp;nbsp; HomeForSale(const HomeForSale&amp;amp;); // 선언만 딸랑하고 인자값도 넣지 않는다.&lt;BR&gt;&amp;nbsp; HomeForSale&amp;amp; operator = (const HomeForSale&amp;amp;);&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;위와 같이 하면 링크시점에서 에러 발생&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;컴파일 시점 에러발생을 하려면, 기본 클래스를 상속받으면 된다.&lt;BR&gt;&amp;nbsp;class Uncopyable {&lt;BR&gt;&amp;nbsp;protected:&lt;BR&gt;&amp;nbsp; Uncopyable() {}&lt;BR&gt;&amp;nbsp; ~Uncopyable() {}&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp;private:&lt;BR&gt;&amp;nbsp; Uncopyable(const Uncopyable&amp;amp;);&lt;BR&gt;&amp;nbsp; Uncopyable&amp;amp; operator = (const Uncopyable);&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;이 클래스를 상속 받으면 된다.(public 상속이 아니어도 된다.)&lt;BR&gt;&amp;nbsp;class HomeForSale : private Uncopyable {&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#7. 다형성을 가진 기본 클래스에서는 소멸자를 반드시 가상 소멸자로 선언하자.&lt;BR&gt;&amp;nbsp;다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다.&lt;BR&gt;&amp;nbsp;기본클래스가 아니거나 다형성이 필요없는 클래스에서 가상 소멸자를 선언하지 말자!&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#8. 예외가 소멸자를 떠나지 못하도록 붙들어 놓자.&lt;BR&gt;&amp;nbsp;예외 발생가능성이 있는 코드는 보통함수에서 깔끔하게 처리한다.&lt;BR&gt;&amp;nbsp;소멸자에서 예외 발생 가능성이 포함된 코드실행 및 함수호출은 하지 않는다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;소멸자에게 예외처리를 맡기지 말자.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#9. 객체 생성 및 소멸 과정 중에는 절대로 가상 함수를 호출하지 말자.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;이부분은 넘어가자&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#10. 대입 연산자는 *this의 참조자를 반환하게 하자.&lt;BR&gt;&amp;nbsp;관례적인 성향이 있는 규칙( =, +=, -=, *=, /=, &amp;lt;&amp;lt;, &amp;gt;&amp;gt; )&lt;BR&gt;&amp;nbsp;class Widget {&lt;BR&gt;&amp;nbsp;public:&lt;BR&gt;&amp;nbsp; Widget&amp;amp; operator=(const Widget&amp;amp; rhs) &amp;nbsp;// 반환타입은 클래스의 참조자&lt;BR&gt;&amp;nbsp; {&lt;BR&gt;&amp;nbsp; &amp;nbsp;return *this; &amp;nbsp; &amp;nbsp; &amp;nbsp; // 좌변 객체의 참조자를 반환합니다.&lt;BR&gt;&amp;nbsp; }&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#11. operator=에서는 자기대입에 대한 처리가 빠지지 않도록 하자.&lt;BR&gt;&amp;nbsp;// 사본을 만들어 바꿔치기 한다.&lt;BR&gt;&amp;nbsp;Widget&amp;amp; Widget::operator=(const Widget &amp;amp;rhs)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp; Widget temp(rhs);&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; swap(temp);&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; return *this;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;// 명확성은 떨어지나 기술적인 코드&lt;BR&gt;&amp;nbsp;Widget&amp;amp; Widget::operator=(Widget rhs) // 값에 의한 전달로 사본 전달&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp; swap(rhs);&lt;BR&gt;&amp;nbsp; &lt;BR&gt;&amp;nbsp; return *this;&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#12. 객체의 모든 부분을 빠짐없이 복사하자.&lt;BR&gt;&amp;nbsp;복사 생성자, 복사 대입 연산자.&lt;BR&gt;&amp;nbsp;class PriorityCustomer : public Customer {&lt;BR&gt;&amp;nbsp;};&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;// 복사생성자 처리&lt;BR&gt;&amp;nbsp;PriorityCustomer::PriorityCustomer(const PriorityCustomer&amp;amp; rhs)&lt;BR&gt;&amp;nbsp;: Customer(rhs), &amp;nbsp; &amp;nbsp; &amp;nbsp;// 기본클래스의 복사 생성자를 호출합니다.&lt;BR&gt;&amp;nbsp;&amp;nbsp; priority(rhs.priority)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp;}&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;// 복사 대입 연산자 처리&lt;BR&gt;&amp;nbsp;PriorityCustomer&amp;amp; PriorityCustomer::operator =(const priorityCustomer&amp;amp; rhs)&lt;BR&gt;&amp;nbsp;{&lt;BR&gt;&amp;nbsp; Customer::operator=(rhs); &amp;nbsp; // 기본 클래스 부분을 대입합니다.&lt;BR&gt;&amp;nbsp;}&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;3. 자원관리&lt;/P&gt;
&lt;P&gt;#13. 자원관리에는 객체가 그만!&lt;BR&gt;&amp;nbsp;std::auto_ptr&amp;lt;Investment&amp;gt; pInv(createInvestment());&lt;BR&gt;&amp;nbsp;(1) 자원을 획득한 후에 자원 관리 객체에게 넘긴다.&lt;BR&gt;&amp;nbsp;(2) 자원 관리 객체는 자신의 소멸자를 사용해서 자원이 확실히 해제되도록 합니다.&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;참조 카운팅 방식 스마트 포인터(refrence-counting smart porinter: RCSP)&lt;BR&gt;&amp;nbsp;std::tr1::shared_ptr&amp;lt;Investment&amp;gt; pInv(createInvestment());&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#14. 자원 관리 클래스의 복사 동작에 대해 진지하게 고찰하자.&lt;BR&gt;&amp;nbsp;자원 획득 즉 초기화(RAII : Resource Acquisition Is Initialization)기법&lt;BR&gt;&amp;nbsp;RAII 객체가 복사될 때 어떤 동작이 이루어져야 할까요?&lt;BR&gt;&amp;nbsp;1. 복사를 금지합니다.&lt;BR&gt;&amp;nbsp; class Uncopyable을 상속 받는다.&lt;BR&gt;&amp;nbsp;2. 관리하고 있는 자원에 대해 참조 카운팅을 수행합니다.&lt;BR&gt;&amp;nbsp; tr1::shared_ptr 이용&lt;BR&gt;&amp;nbsp;3. 관리하고 있는 자원을 진짜로 복사합니다.&lt;BR&gt;&amp;nbsp; 깊은복사(Deep copy)로 모두 복사&lt;BR&gt;&amp;nbsp;4. 관리하고 있는 자원의 소유권을 옮깁니다.&lt;BR&gt;&amp;nbsp; auto_ptr의 복사 동작(swap)&lt;BR&gt;&amp;nbsp; &lt;BR&gt;#15. 자원 관리 클래스에서 관리되는 자원은 외부에서 접근할 수 있도록 하자.&lt;BR&gt;&amp;nbsp;자원관리 클래스의 자원을 참조하여 사용할 수 있어야 한다.&lt;BR&gt;&amp;nbsp;자원 변환 방법&lt;BR&gt;&amp;nbsp;(1) 명시적 변환&lt;BR&gt;&amp;nbsp;(2) 암시적 변환&lt;BR&gt;&amp;nbsp;맞게 쓰기는 쉽게, 틀리게 쓰기는 어렵게 하자.&lt;BR&gt;&amp;nbsp;std::string str;&lt;BR&gt;&amp;nbsp;str.c_str(); &amp;nbsp;// 명시적인 변환을 사용하면 암시적인 변환보다 편하진 않지만, 꼭 필요한 곳에서 맞게 쓸 수 있다.&lt;/P&gt;
&lt;P&gt;#16. new 및 delete를 사용할때는 형태를 반드시 맞추자.&lt;BR&gt;&amp;nbsp;CSomething pSomething = new CSomething;&lt;BR&gt;&amp;nbsp;delete pSomething;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;&amp;nbsp;std::string *stringArray = new std::string[100];&lt;BR&gt;&amp;nbsp;delete [] stringArray;&lt;BR&gt;&amp;nbsp;&lt;BR&gt;#17. new로 생성한 객체를 스마트 포인터에 저장하는 코드는 별도의 한 문장으로 만들자.&lt;BR&gt;&amp;nbsp;스킵&lt;/P&gt;</description>
			<category>문서모음</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/733</guid>
			<comments>http://npteam.net/733#entry733comment</comments>
			<pubDate>Wed, 22 Jul 2009 21:51:15 +0900</pubDate>
		</item>
		<item>
			<title>개인용 무료 파티션 프로그램</title>
			<link>http://npteam.net/721</link>
			<description>&lt;DIV style=&quot;TEXT-ALIGN: right&quot;&gt;출처 : &lt;A href=&quot;http://www.partition-tool.com/personal.htm&quot;&gt;http://www.partition-tool.com/personal.htm&lt;/A&gt;&lt;/DIV&gt;&lt;BR&gt;파티션 매직 8.0은 비스타 지원이 안된다.&lt;BR&gt;이미 파티션 매직 UI에 길들여진 분들은 비스타로 넘어오면서 많은 고통을 받아왔다.&lt;BR&gt;&lt;BR&gt;그러나!! 짜잔.&lt;BR&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1240902875.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1240902875.png&quot; width=&quot;902&quot; height=&quot;665&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;오우, 예전에 보던 파티션 매직과 흡사한 인터페이스를 보여준다.&lt;BR&gt;홈에디션은 무료&lt;BR&gt;기업용 EASEUS Partition Master Professional Edition 은 &lt;SPAN class=RedBold&gt;US$ 31.96&lt;BR&gt;&lt;/SPAN&gt;&lt;BR&gt;파티션 매직의 향수에서 벗어나지 못한 분들을 위한 대체 프로그램으로 충분하지 않을까?&lt;BR&gt;</description>
			<category>Tip&amp;Tech</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/721</guid>
			<comments>http://npteam.net/721#entry721comment</comments>
			<pubDate>Mon, 06 Apr 2009 21:01:25 +0900</pubDate>
		</item>
		<item>
			<title>정규식을 이용하여 보다 쉽게 쿼리문을 작성해 보자_02</title>
			<link>http://npteam.net/714</link>
			<description>DB 쿼리 작업을 하다보면, 테이블에 insert 쿼리문를 대량으로 작성해야 하는 경우가 많다.&lt;BR&gt;특히, 엑셀로 작업한 결과물을 DB에 insert 하거나, update 해야 할 경우 쿼리문 작성으로 고단한 경우가 종종 발생한다.&lt;BR&gt;&lt;BR&gt;정규식을 활용하여 원하는 정보를 쿼리식으로 손쉽게 만드는 방법에 대해서 알아보자.&lt;BR&gt;&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1148716350.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1148716350.png&quot; width=&quot;625&quot; height=&quot;414&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;위와 같은 테이블 정보에 아래의 데이터를 INSERT 해야 한다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1169514451.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1169514451.png&quot; width=&quot;702&quot; height=&quot;117&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;엑셀과 같이 입력하고 싶은 자료를 정규식을 지원하는 Notepad2와 같은 편집기에 복사 &amp;amp; 붙여넣기한다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1037652454.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1037652454.png&quot; width=&quot;491&quot; height=&quot;125&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;라인의 처음 시작 부분은 정규식에서 ^로 표시한다.&lt;BR&gt;&lt;BR&gt;&lt;CODE&gt;^(\d{4})&lt;/CODE&gt;한 줄의 시작 부분이 숫자(\d)로된 4자리 글자를 먼저 선택한다.(숫자 4자리 선택)&lt;BR&gt;이렇게 한 줄의 첫번째 되는 부분을 정확히 일치시켜야 줄 중간에서 숫자 4자리를 무시하고 처리할 수 있다.&lt;BR&gt;선택 범위 :&amp;nbsp; &lt;FONT color=#d41a01&gt;&lt;STRONG&gt;[&lt;/STRONG&gt;&lt;/FONT&gt;8001&lt;FONT color=#d41a01&gt;&lt;STRONG&gt;]&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;&lt;CODE&gt;^(\d{4})[\t]+&lt;/CODE&gt;숫자 4자리로 시작하고, 그 다음 탭으로 떨어진 공간을 선택한다.(TAB까지 선택)&lt;BR&gt;선택 범위 :&amp;nbsp; &lt;FONT color=#d41a01&gt;&lt;STRONG&gt;[&lt;/STRONG&gt;&lt;FONT color=#454545&gt;8001 &lt;FONT color=#008000&gt;&lt;STRONG&gt;TAB&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;STRONG&gt;&lt;FONT color=#d41a01&gt;]&lt;BR&gt;&lt;/STRONG&gt;&lt;/FONT&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;CODE&gt;^(\d{4})[\t]+([^\t]+)&lt;/CODE&gt;탭으로 떨어진 공간 다음에, 탭이 아닌 문자를 선택한다.(TOM까지 선택)&lt;BR&gt;선택 범위 :&amp;nbsp; &lt;FONT color=#d41a01&gt;&lt;STRONG&gt;[&lt;/STRONG&gt;&lt;/FONT&gt;8001 &lt;STRONG&gt;&lt;FONT color=#008000&gt;TAB&lt;/FONT&gt;&lt;/STRONG&gt; TOM&lt;FONT color=#d41a01&gt;&lt;STRONG&gt;]&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;위와 같이 탭으로 떨어진 문자 &lt;FONT color=#008000&gt;&lt;STRONG&gt;[\t]+&lt;/STRONG&gt;&lt;/FONT&gt;, 탭이 아닌 문자 &lt;STRONG&gt;([^\t]+)&lt;/STRONG&gt; 를 반복적으로 기입한다.&lt;BR&gt;&lt;BR&gt;&lt;CODE&gt;^(\d{4})[\t]+([^\t]+)[\t]+([^\t]+)[\t]+([^\t]+)[\t]+([^\t]+)[\t]+([^\t]+)[\t]+([^\t]+)[\t]+(\d+)$&lt;/CODE&gt;선택 범위 :&amp;nbsp; &lt;FONT color=#d41a01&gt;&lt;STRONG&gt;[&lt;/STRONG&gt;&lt;/FONT&gt;8001 &lt;STRONG&gt;&lt;FONT color=#008000&gt;TAB&lt;/FONT&gt;&lt;/STRONG&gt; TOM &lt;FONT color=#008000&gt;&lt;STRONG&gt;TAB &lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#454545&gt;DBA &lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;STRONG&gt;TAB &lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#454545&gt;8400 &lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;STRONG&gt;TAB &lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#454545&gt;1981-12-03 &lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;STRONG&gt;TAB &lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#454545&gt;3000 &lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;STRONG&gt;TAB &lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#454545&gt;10 &lt;/FONT&gt;&lt;FONT color=#008000&gt;&lt;STRONG&gt;TAB &lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#454545&gt;40&lt;/FONT&gt;&lt;FONT color=#d41a01&gt;&lt;STRONG&gt;]&lt;/STRONG&gt;&lt;/FONT&gt;&lt;BR&gt;&lt;BR&gt;중간 부분은 &lt;FONT color=#008000&gt;&lt;STRONG&gt;[\t]+&lt;/STRONG&gt;&lt;/FONT&gt; 탭과 &lt;STRONG&gt;([^\t]+)&lt;/STRONG&gt; 탭을 포함하지 않은 문자열로 구분하면 되지만,&lt;BR&gt;시작부분과 마찬가지로 종료 부분에는&lt;CODE&gt;(\d+)$ &amp;nbsp; &amp;nbsp;&amp;nbsp; : 숫자로 종료(0-9)&lt;BR&gt;(\w+)$ &amp;nbsp; &amp;nbsp; &amp;nbsp;: 문자로 종료(a-z, A-Z)&lt;BR&gt;([\d|\w]+)$ : 숫자나 문자로 종료(0-9, a-z, A-Z)&lt;BR&gt;&lt;/CODE&gt;를 명시적으로 표기해야 한다.&lt;BR&gt;(&lt;FONT color=#0000ff&gt;단, \w는 a-z, A-Z의 문자열을 말하며 한글 문자열을 지원하지 않는다.&lt;/FONT&gt;)&lt;BR&gt;&lt;BR&gt;위와 같이 작성된 정규표현식을 찾을문자에 입력하고 찾기 버튼을 누르면, 한 줄씩 선택되는 것을 확인할 수 있다.&lt;BR&gt;&lt;BR&gt;이때, 중요한 점! 지난번에도 언급했듯이 정규표현식에서 &lt;FONT color=#0000ff&gt;()&lt;/FONT&gt; 괄호로 묶은 것은 &lt;FONT color=#0000ff&gt;그룹으로 처리&lt;/FONT&gt;된다.&lt;BR&gt;&lt;FONT color=#cc9900&gt;&lt;STRONG&gt;첫번째 괄호&lt;/STRONG&gt;&lt;/FONT&gt;로 묶인 문자열은 &lt;FONT color=#cc9900&gt;&lt;STRONG&gt;\1&lt;/STRONG&gt;&lt;/FONT&gt;로 치환할 수 있고,&lt;BR&gt;&lt;FONT color=#cc9900&gt;&lt;STRONG&gt;두번재 괄호&lt;/STRONG&gt;&lt;/FONT&gt;로 묶인 문자열은 &lt;FONT color=#cc9900&gt;&lt;STRONG&gt;\2&lt;/STRONG&gt;&lt;/FONT&gt;로 치환할 수 있다....&lt;BR&gt;또한, &lt;FONT color=#cc9900&gt;&lt;STRONG&gt;괄호로 묶인 전체 문자열&lt;/STRONG&gt;&lt;/FONT&gt;&lt;FONT color=#454545&gt;은&lt;/FONT&gt; &lt;FONT color=#cc9900&gt;&lt;STRONG&gt;\0&lt;/STRONG&gt;&lt;/FONT&gt;로 치환할 수 있다.&lt;BR&gt;&lt;BR&gt;우리가 치환하고자 하는 부분은 이미 괄호로 8번 묶어 놓은 상태 이므로,&lt;BR&gt;바꿀 문자에 다음과 같이 입력하고 모두 바꾸기를 수행해 보자.&lt;BR&gt;&lt;BR&gt;&lt;CODE&gt;INSERT INTO TEST_EMP (EMPNO, ENAME, JOB, MGR, HIREDATE, SAL, COMM, DEPTNO) values ( \1, &#039;\2&#039;, &#039;\3&#039;, \4, &#039;\5&#039;, \6, \7, \8);&lt;/CODE&gt; 
&lt;P&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1170156781.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1170156781.png&quot; width=&quot;534&quot; height=&quot;438&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;BR&gt;위와 같이 모두 바꾸기를 수행하면 다음과 같은 결과를 볼 수 있다.&lt;BR&gt;&lt;div align=&quot;center&quot;&gt;&lt;a href=&quot;http://npteam.net/attach/1/1158082911.png&quot; rel=&quot;lightbox[2group0]&quot; title=&quot;&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;http://npteam.net/attach/1/1158082911.png&quot; width=&quot;1165&quot; height=&quot;167&quot; alt=&quot;사용자 삽입 이미지&quot; title=&quot;&quot; style=&quot;cursor: pointer;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/P&gt;
&lt;P&gt;지금까지 INSERT 문을 정규표현식을 이용하여 간단히 바꾸는 과정을 알아 보았다.&lt;BR&gt;&lt;BR&gt;간단하지만 강력한 정규표현식.&lt;BR&gt;위와 같이 적은 양의 자료를 입력할때에는 복사 붙여넣기로 해결되지만,&lt;BR&gt;최소 천건에서 2-3만건의 자료를 처리할 때에는 정규표현식을 만드신 분이 정말 눈물나게 고맙게 느껴진다. ^^;&lt;/P&gt;</description>
			<category>정규식</category>
			<author>(TTF)</author>
			<guid>http://npteam.net/714</guid>
			<comments>http://npteam.net/714#entry714comment</comments>
			<pubDate>Sat, 28 Mar 2009 11:32:03 +0900</pubDate>
		</item>
	</channel>
</rss>
