<?xml version="1.0" encoding="utf-8" ?>
<?xml-stylesheet href="http://rss.egloos.com/style/blog.xsl" type="text/xsl" media="screen"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
	<title>고안해 내는 재능</title>
	<link>http://ingenuity.egloos.com</link>
	<description>개발을 보다 쉽게 할 수 있고 어떻게 하면 재밌게 살까를 고안해 내는 블러그입니다.</description>
	<language>ko</language>
	<pubDate>Wed, 16 Jul 2008 03:34:37 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>고안해 내는 재능</title>
		<url>http://pds1.egloos.com/logo/1/200606/01/21/c0075921.jpg</url>
		<link>http://ingenuity.egloos.com</link>
		<width>80</width>
		<height>106</height>
		<description>개발을 보다 쉽게 할 수 있고 어떻게 하면 재밌게 살까를 고안해 내는 블러그입니다.</description>
	</image>
  	<item>
		<title><![CDATA[ 블로그 개편해야 것다. ]]> </title>
		<link>http://ingenuity.egloos.com/4491421</link>
		<guid>http://ingenuity.egloos.com/4491421</guid>
		<description>
			<![CDATA[ 
  한동안 개인적으로 많은 일들이 있었다.<br>바쁘다는 이유로 블로그를 방치해두니 맘이 항상 찜찜했다.<br>그간 생각한 결과 블로그를 개편(?)해야 겠다.<br>지금것 기술 위주의 정리에 초점을 맞췄는데 그 보다는 개인적인 생각과 이야기...<br>그리고 소중한 경험들을 위주로 개편할 예정이다.<br><br>시기는....<br><br>음...<br><br>가급적 빠른 시일내에...			 ]]> 
		</description>

		<comments>http://ingenuity.egloos.com/4491421#comments</comments>
		<pubDate>Wed, 16 Jul 2008 03:34:37 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 끝과 시작을 준비하는 시간... ]]> </title>
		<link>http://ingenuity.egloos.com/4000014</link>
		<guid>http://ingenuity.egloos.com/4000014</guid>
		<description>
			<![CDATA[ 
  현재 몸담고 있는 곳에서 마지막을 준비하고 있다.<br>그리고&nbsp;새로운 곳에서의 시작도 준비하고 있다.<br><br>맡은 일에 충실해서 끝과 시작을 잘 해야겠다.			 ]]> 
		</description>
		<category>My Life</category>

		<comments>http://ingenuity.egloos.com/4000014#comments</comments>
		<pubDate>Tue, 11 Dec 2007 05:37:31 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Effective Java (3)  ]]> </title>
		<link>http://ingenuity.egloos.com/3970130</link>
		<guid>http://ingenuity.egloos.com/3970130</guid>
		<description>
			<![CDATA[ 
  <p><span style="FONT-SIZE: 130%"><strong>5.&nbsp;메소드</strong></span><br><br><strong>5.1.&nbsp;인자의 유효성을 검사하라<br></strong>유효성 검사를 통해 인자가 유효하지 않을 때 적절한 예외를 발생시키면, 빠르고 깔끔하게 메소드를 종료할 수 있다.<br></p><p><strong>5.2.&nbsp;메소드 시그니처를 신중하게 설계하라<br></strong>1. 메소드 이름을 신중하게 결정하라. 이름은 항상 표준 명명 규칙을 따라야 한다.<br>2. 편리한 메소드를 제공하기 위해 너무 애쓰지 마라.<br>3. 인자를 너무 많이 받지 마라. 현실적으로 인자 개수가 세 개를 넘으면 문제가 있다.<br></p><p><strong>5.3.&nbsp;null이 아닌 길이가 0인 배열을 리턴하라</strong></p><p><strong></strong>&nbsp;</p><p><strong>5.4.&nbsp;외부에 제공하는 API의 모든 구성요소에 대해 문서화 주석을 달아라<br></strong>API를 문서화하려면, 외부에 제공하는 모든 클래스, 인터페이스, 생성자, 메소드, 필드에 문서화 주석을 달아야 한다.<br><br><span style="FONT-SIZE: 130%"><strong>6.&nbsp;예외처리<br></strong></span><br><strong>6.1.&nbsp;예외는 예외상황에서만 써야 한다<br></strong>예외 기반의 구현패턴은 코드의 목적을 애매하게 만들고 성능도 떨어뜨린다.</p><p><br><strong>6.2.&nbsp;처리해야 하는 예외와 런타임 예외를 구분해서 던져라<br></strong>1. 처리해야 하는 예외<br>&nbsp; 호출자가 예외상황을 복구할 수 있다고 기대할 수 있을 때 던진다.<br>&nbsp; <br>2. 처리하지 않는 예외<br>&nbsp; 런타임 예외와 에러가 있다. 이 둘의 행동 방식은 똑같다. 이것들을 잡을 필요도 없고<br>&nbsp; 특별한 경우가 아니라면 잡아서도 안 된다. 이는 복구할 수 없는 상황이기 때문에 더<br>&nbsp; 이상 프로그램을 실행하는 것은 위험할 수도 있다.<br><br><strong>6.3.&nbsp;표준 예외를 써라</strong></p><p><table class="MsoNormalTable" style="BORDER-RIGHT: medium none; BORDER-TOP: medium none; BORDER-LEFT: medium none; BORDER-BOTTOM: medium none; BORDER-COLLAPSE: collapse; mso-border-alt: solid black .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt; mso-border-insidev: .5pt solid black; mso-yfti-tbllook: 1184; mso-border-insideh: .5pt solid black" cellspacing="0" cellpadding="0" border="1"><tbody><tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes"><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #eeece1; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 196.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .5pt" valign="top" width="262"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 100%">예외<span lang="EN-US"><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /><o:p></o:p></span></span></b></p></td><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: black 1pt solid; PADDING-LEFT: 5.4pt; BACKGROUND: #eeece1; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 238.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt" valign="top" width="318"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt; TEXT-ALIGN: center" align="center"><b style="mso-bidi-font-weight: normal"><span style="FONT-SIZE: 100%">용도<span lang="EN-US"><o:p></o:p></span></span></b></p></td></tr><tr style="mso-yfti-irow: 1"><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 196.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="262"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">IllegalArgumentException<o:p></o:p></span></span></p></td><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 238.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="318"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">인자 값이 적절하지 못할 때<span lang="EN-US"><o:p></o:p></span></span></p></td></tr><tr style="mso-yfti-irow: 2"><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 196.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="262"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">IllegalStateException<o:p></o:p></span></span></p></td><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 238.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="318"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">호출을 받은 객체상태가 적절하지 못할 때<span lang="EN-US"><o:p></o:p></span></span></p></td></tr><tr style="mso-yfti-irow: 3"><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 196.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="262"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">NullPointerException<o:p></o:p></span></span></p></td><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 238.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="318"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%"><span lang="EN-US">null</span>을 금지한 인자 값이<span lang="EN-US"> null</span>일 때<span lang="EN-US"><o:p></o:p></span></span></p></td></tr><tr style="mso-yfti-irow: 4"><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 196.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="262"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">IndexOutOfBoundsException<o:p></o:p></span></span></p></td><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 238.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="318"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">인덱스 값이 범위를 벗어났을 때<span lang="EN-US"><o:p></o:p></span></span></p></td></tr><tr style="mso-yfti-irow: 5"><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 196.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="262"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">ConcurrentModificationException<o:p></o:p></span></span></p></td><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 238.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="318"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">동시 수정을 금지한 객체를 동시에 수정할 때<span lang="EN-US"><o:p></o:p></span></span></p></td></tr><tr style="mso-yfti-irow: 6; mso-yfti-lastrow: yes"><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: black 1pt solid; WIDTH: 196.8pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="262"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span lang="EN-US"><span style="FONT-SIZE: 100%">UnsupportedOperationException<o:p></o:p></span></span></p></td><td style="BORDER-RIGHT: black 1pt solid; PADDING-RIGHT: 5.4pt; BORDER-TOP: #ece9d8; PADDING-LEFT: 5.4pt; PADDING-BOTTOM: 0cm; BORDER-LEFT: #ece9d8; WIDTH: 238.3pt; PADDING-TOP: 0cm; BORDER-BOTTOM: black 1pt solid; BACKGROUND-COLOR: transparent; mso-border-alt: solid black .5pt; mso-border-left-alt: solid black .5pt; mso-border-top-alt: solid black .5pt" valign="top" width="318"><p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><span style="FONT-SIZE: 100%">객체가 메소드를 지원하지 않을 때<span lang="EN-US"><o:p></o:p></span></span></p></td></tr></tbody></table></p><p><br><strong>6.4.&nbsp;예외처리 전략<br></strong>1. 비즈니스 로직을 수행하는 중 발생하는 비즈니스적인 Exception을 제외하고는 모든&nbsp;Exception을 Unchecked Exception으로 처리한다.</p><p>2. Checked Exception 중 고객이 인지해야 하는 Exception은 메시징 처리를 통해&nbsp;display 해주며, 시스템 관리자에게 메일로도 통보해 줄 수 있도록 해준다. (에러 메시지를 처리하는 페이지를 따로 두어 처리한다.)</p><p>3. Unchecked Exception이 발생하는 경우 Exception 내용을 시스템 관리자에게 메일로&nbsp;통보해준다.</p><p>4. database 다운과 같이 프로그램적으로 해결하기 힘든 에러가 발생할 경우에는&nbsp; Unchecked Exception을 사용한다.</p><p>5. Unchecked Exception 이나 Checked Exception 중 처리되지 않는 Exception은&nbsp;servlet container에서 제공하는 에러 처리 기능을 활용하여 처리토록 한다. 예를 들어, 404, 500에러 발생시 특정페이지로 이동토록 설정한다.</p><p>&nbsp;</p><p>public String socketGet(String host, int port, String uri, String argv) {<br>&nbsp;&nbsp;&nbsp; StringBuffer result = new StringBuffer();<br></p><p>&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URL url = new URL("http", host,&nbsp; port, uri + argv);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; URLConnection conn &nbsp;= url.openConnection();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; InputStream is = conn.getInputStream();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BufferedReader reader = new BufferedReader(new InputStreamReader(is));<br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; String line = "";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while (line != null) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; line = reader.readLine();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (line != null) result.append(line);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } finally {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reader.close();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return result.toString();<br>&nbsp;&nbsp;&nbsp; } catch (Exception e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; System.err.println(e.getMessage());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return null;<br>&nbsp;&nbsp;&nbsp; }<br>}</p><p>&nbsp;</p>			 ]]> 
		</description>
		<category>JAVA</category>

		<comments>http://ingenuity.egloos.com/3970130#comments</comments>
		<pubDate>Thu, 29 Nov 2007 05:25:51 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Effective Java (2) ]]> </title>
		<link>http://ingenuity.egloos.com/3970125</link>
		<guid>http://ingenuity.egloos.com/3970125</guid>
		<description>
			<![CDATA[ 
  <p><strong><span style="FONT-SIZE: 130%">3.&nbsp;객체 생성과 파괴</span></strong><br><br>객체를 생성하고 파괴하는 방법을 다룰 것이다. 객체를 생성해야 할 때와 생성하지 말아야할 때, 객체를 생성하는 방법과 생성을 피할 수 있는 방법, 객체가 정확한 시기에 파괴되었다는 것을 확인할 수 있는 방법, 객체를 파괴하기 전에 반드시 처리해야 하는 작업들을 관리하는 방법들에 대해 생각해 볼 것이다.<br><br><strong>3.1.&nbsp;생성자 대신 static factory method를 고려하라</strong><br>&nbsp;1. 장점<br>&nbsp;&nbsp; - static factory method는 생성자와 달리 알맞은 이름을 줄 수 있다.<br>&nbsp;&nbsp; - 생성자와 달리 호출될 때마다 새로운 객체를 생성하지 않아도 된다.<br>&nbsp;&nbsp;&nbsp;&nbsp; 이를 이용하면 특정 시점에 존재하는 인스턴스들을 엄격하게 관리할 수 있다.<br><br>&nbsp;&nbsp;&nbsp;&nbsp; 1) 특정 클래스가 싱글톤 이라는 것을 보장<br>&nbsp;&nbsp;&nbsp;&nbsp; 2) 내용이 동등한 불변 클래스의 인스턴스가 여러 개 존재하지 않는다.<br>&nbsp;&nbsp; - 생성자는 자신이 정의된 클래스의 인스턴스만 리턴할 수 있지만, static factory&nbsp;method는 자신이 선언된 것과 같은 타입의 <br>&nbsp;&nbsp;&nbsp;&nbsp; 인스턴스는 모두 리턴할 수 있다.</p><p>&nbsp;2. 단점<br>&nbsp;&nbsp; - 메소드를 정의한 클래스가 public 이나 protected 생성자를 제공하지 않으면, 다른 클래스가 이 클래스를 상속받을 수 없다.<br>&nbsp;&nbsp; - 다른 스택틱 메소드와의 차이를 명시할 수 없다.<br><br><strong>3.2.&nbsp;private 생성자를 써서 싱글톤을 유지하라<br></strong>&nbsp;1. 모든 조건을 고려해 보고, 영원히 싱글톤으로 남는 클래스라면 스태틱 필드를 쓰고,&nbsp;그렇지 않으면 스태틱 팩토리 메소드를 쓰는 것이 좋다.<br>&nbsp;2. 싱글톤을 보장하려면, 반드시 readResolve 메소드를 제공해야한다. 그렇지 않으면,&nbsp;인스턴트들을 역직렬화 할 때마다 새로운 인스턴스가 생겨난다.<br></p><p>&nbsp;&nbsp; Private Object readResolve() throws ObjectStreamException {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /*<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 진짜 인스턴스만 리턴한다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; * 역직렬화로 태어난 가짜 인스턴스들은 태어나자마자 GC에게 던져진다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; */</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Return INSTANCE;<br>&nbsp;&nbsp; }<br><br><strong>3.3.&nbsp;private 생성자로 인스턴스를 만들지 못하게 하라<br></strong>&nbsp;다른 클래스에서 해당 클래스를 생성 또는 상속하지 못하게 할 때 사용한다.</p><p><br><strong>3.4.&nbsp;쓸데없는 객체를 중복 생성하지 마라<br></strong>&nbsp;아주 특별한 경우가 아니라면, 동등한 기능을 하는 객체를 필요할 때마다 생성하는 것보다는 한 객체를 재사용하는 것이 더 낫다. <br>&nbsp;재사용이 속도나 효율적인 코드 생산에 이바지 한다.</p><p><br><strong>3.5.&nbsp;쓸모 없는 객체 참조는 제거하라<br></strong>&nbsp;쓸모 없는 객체를 참조하게 된다면 이는 GC 대상에서 제외되므로 메모리 누수가 발생된다.<br>&nbsp;보통 자신만의 메오리 영역을 가지는 클래스를 쓸 때, 프로그래머는 메모리 누수에 대해&nbsp;항상 생각해야 한다. <br>&nbsp;구성요소를 비울 때마다 null을 대입하여 보관하던 객체 참조를 제거해야 한다. (쓸모 없는 참조에 null 을 대입해 버리면 된다.)<br><br><strong>3.6.&nbsp;종료자들을 쓰지 마라<br></strong>&nbsp;종료자는 호출되자마자 즉각 실행되지 않는다. 어떤 객체에 대한 모든 참조가 없어진 후,&nbsp;이 객체의 종료자가 수행될 때까지 시간은 얼마나 걸릴지 아무도 모른다. 따라서 알맞은&nbsp;시간 안에 반드시 수행해야 하는 작업을 종료자에서 처리하면 절대 안 된다.(중요한 영속&nbsp;상태를 갱신하는 작업을 종료자에서 처리하지 말아야 한다.)<br>&nbsp;명시적인 종결처리 메소드를 제공하고, 이 클래스의 인스턴스를 쓰고 난 다음에 반드시 이&nbsp;메소드를 호출하게 하라. 또, 이 클래스에 각 인스턴스가 종료되었는지 알 수 있는 private&nbsp;필드를 두어야 한다. 명시적인 종결처리 메소드는 종결처리를 끝마치면 해당 인스턴스를&nbsp;더 이상 쓸 수 없다는 사실을 이 필드에 기록해 두어야 한다. 다른 메소드들은 항상 이&nbsp;필드를 먼저 확인하고, 이미 해당 인스턴스가 더 이상 쓸 수 없는 상태라면&nbsp;IllegalStateException 을 던져야 한다.<br>&nbsp;명시적인 종결처리 메소드는 즉각적인 종결처리를 위해 try-finally 구문과 함께 쓰는 것이&nbsp;좋다. 이때 명시적인 종결처리 메소드는 finally 블록에서 호출해야 어떤 상황에서도 명시적인 종결처리 메소드가 호출된다는 것을 보장할 수 있다.<br></p><p>&nbsp;Foo foo = new Foo(…);<br>&nbsp;try {<br>&nbsp;&nbsp;&nbsp;&nbsp; //foo 로 뭔가 작업하고</p><p>&nbsp;} finally {<br>&nbsp;&nbsp;&nbsp;&nbsp; Foo.terminate(); // 명시적인 종결처리 메소드<br>&nbsp;}<br></p><p>&nbsp;종료자를 쓰는 경우는? <br>&nbsp;첫째, 앞에서 설명한 명시적인 종결처리 메소드를 호출하는 것을 잊었을 경우를 대비한&nbsp;“안전망” 역할을 한다. 물론, 종료자가 바로바로 호출된다거나 반드시 호출된다는 보장은&nbsp;없지만, 만약 클라이언트가 명시적인 종결처리 메소드를 호출하지 않았을 때, 중요한 자원을 아예 반환하지 않는 것보다 늦게라도 반환할 수 있는 가능성을 열어 두는 편이 더 낫다.<br>&nbsp;예를 들면, InputStream, OutputStream, Timer 등의 클래스에는 이런 “안전망” 역할을 하는&nbsp;종료자들이 정의되어 있다.<br>&nbsp;둘째, native peer와 관련된 객체를 쓸 때 종료자를 쓴다. native peer란 일반 자바 객체가&nbsp;native 메소드 호출을 통해 자신의 역할을 맡길 수 있는 native 객체를 의미한다.</p><p><br><span style="FONT-SIZE: 130%"><strong>4.&nbsp;클래스와 인터페이스<br></strong></span></p><p>강건하고(robust), 유연하고(flexible), 쓸모있게(usable) 만들기 위해 이 도구들을 어떻게 써야 하는지 알아보도록 하겠다.<br><br><strong>4.1.&nbsp;클래스와 멤버에 대한 접근은 최소화하라<br></strong>우선 클래스의 public API를 신중하게 모두 설계한 다음, 나머지 멤버들은 모두 습관처럼 private로 만들어야 한다. <br>즉, 현재 개발한 패키지를 다시 한번 살표보고 클래스 사이의 의존성을 더 줄일 수 있는 방법은 없는지 생각해 보아야 한다.<br></p><p><strong>4.2.&nbsp;불변 클래스를 써라<br></strong>불변 클래스(immutable class)란 인스턴스의 내용을 절대로 바꿀 수 없는 클래스이다.<br>이 클래스의 각 인스턴스가 저장하는 정보는 인스턴스를 생성할 때 단 한번 만든 후에 인스턴스가 소명될 때까지 변하지 않는다.<br>불변 클래스를 만들려면 다음과 같은 규칙을 따라야 한다.<br></p><p>1. 객체를 변경하는 메소드를 제공하지 않는다.<br>2. 재정의 할 수 있는 메소드를 제공하지 않는다.<br>3. 모든 필드를 final로 만든다.<br>4. 모든 필드를 private로 만든다.<br>5. 가변 객체를 참조하는 필드는 배타적으로 접근해야 한다.</p><p><br><strong>4.3.&nbsp;상속보다 컴포지션을 써라<br></strong>상속이 비록 강력한 기능이긴 하지만 캡슐화를 위반하기 때문에 문제를 발생시킬 수 있다.<br>상위 클래스와 하위 클래스가 정말로 서브타입 관계가 있을 때만 상속을 쓸 수 있다.<br>하지만 이런 경우라도 하위 클래스와 상위 클래스가 다른 패키지에 있거나 상위 클래스가 상속을 위해 설계되지 않았다면 상속받은 하위 클래스에 문제가 생기기 쉽다. 컴포지션과 포워딩을 쓰면 상속의 폐해를 막을 수 있다. 특히, 적절한 인터페이스가 있어서 래퍼 클래스를 구현할 수 있다면 금상첨화이다. 래퍼 클래스는 강건할 뿐만 아니라 기능도&nbsp;막강하다.</p><p><br><strong>4.4.&nbsp;상속받을 수 있도록 설계하고 문서화하라. 아니면 상속을 금지하라<br></strong>클래스 명세문서에 메소드를 재정의하면 발생할 수 있는 모든 파급 효과를 자세하고 정확하게 기술해야 한다. 관례에 따라, 이런 경우에 메소드 명세문서 마지막 부분에 “이번 구현에서는” 으로 시작하는 설명을 달아 놓는 것이 좋다.<br></p><p><strong>4.5.&nbsp;추상 클래스보다는 인터페이스를 써라<br></strong>인터페이스를 쓰면 깔끔하게 mixin 타입을 정의할 수 있다. 즉, 어떤 클래스가 자신의 기본 타입 외에 새로운 기능을 위해 마음대로 골라서 추가할 수 있는 타입이다.</p>			 ]]> 
		</description>
		<category>JAVA</category>

		<comments>http://ingenuity.egloos.com/3970125#comments</comments>
		<pubDate>Thu, 29 Nov 2007 05:21:31 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 로또 4등 ]]> </title>
		<link>http://ingenuity.egloos.com/3955285</link>
		<guid>http://ingenuity.egloos.com/3955285</guid>
		<description>
			<![CDATA[ 
  10월초에 사둔 로또를 오늘 맞춰보았다.<br><br>순간 숨이 막히며 긴장되었지만 허탈해 졌다.<br><br>처음 3번째 숫자까지 연속으로 일치해서 긴장했는데 나머지 세 개의 숫자들 중에 한개만 일치했다.<br><br>그래도 4개 맞춰서 4등...<br><br>잽싸게 금액을 확인해 보니 57,706원...<br><br>사람 욕심이 끝이 없다보니 아쉬웠지만 그래도 좋다.. ㅋㅋ<br><br>오늘도 로또를 사야지~~~			 ]]> 
		</description>
		<category>My Life</category>

		<comments>http://ingenuity.egloos.com/3955285#comments</comments>
		<pubDate>Fri, 23 Nov 2007 04:13:00 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ [구인](파란-KTH) 자바 중급이상 개발자를 모집합니다. ]]> </title>
		<link>http://ingenuity.egloos.com/3947937</link>
		<guid>http://ingenuity.egloos.com/3947937</guid>
		<description>
			<![CDATA[ 
  파란(KTH)에서&nbsp;정규직&nbsp;자바&nbsp;개발자를&nbsp;모집합니다. <br><br>(1)&nbsp;모집분야&nbsp;:&nbsp;웹&nbsp;플랫폼&nbsp;개발,&nbsp;웹&nbsp;서비스&nbsp;개발 <br>(2)&nbsp;모집인원&nbsp;:&nbsp;0명 <br>(3)&nbsp;자격요건&nbsp; <br><br>가.&nbsp;초대졸&nbsp;이상 <br>나.&nbsp;경력&nbsp;4년이상&nbsp;7년이하 <br>다.&nbsp;java&nbsp;능숙자&nbsp;(JSP,&nbsp;servlet,&nbsp;RMI,&nbsp;EJB), <br>&nbsp;&nbsp;&nbsp;&nbsp;자바&nbsp;프레임웍(Spring,&nbsp;Struts,&nbsp;ibatis,&nbsp;velocity)&nbsp;능숙자&nbsp;우대 <br>라.&nbsp;OS&nbsp;:&nbsp;Linux&nbsp;환경&nbsp;개발&nbsp;가능 <br>마.&nbsp;WAS&nbsp;:&nbsp;apache,&nbsp;tomcat,&nbsp;resine <br>마.&nbsp;DB&nbsp;:&nbsp;Oracle,&nbsp;mysql&nbsp;설계,&nbsp;개발&nbsp;가능자 <br>바.&nbsp;eclipse,ER-Win,UML&nbsp;사용&nbsp;가능자 <br><br>(4)&nbsp;제출&nbsp;서류&nbsp;:&nbsp;자필&nbsp;이력서(경력사항&nbsp;위주) <br>(5)&nbsp;실무&nbsp;면접후&nbsp;곧바로&nbsp;채용&nbsp;가능합니다. <br>&nbsp;&nbsp;&nbsp;&nbsp; 근무여건,&nbsp;복지등&nbsp;자세한&nbsp;사항은&nbsp;<a href="http://corp.paran.com/" target="_blank"><span style="COLOR: #000000">http://corp.paran.com</span></a>&nbsp;참조하세요. <br>(6)&nbsp;연락처&nbsp;:&nbsp;02-3289-2758,&nbsp;flyidea@paran.com <br><br>실무&nbsp;부서에서&nbsp;빠른&nbsp;인력확보를&nbsp;위한&nbsp;채용&nbsp;진행입니다.&nbsp;많은&nbsp;지원&nbsp;바랍니다. <br><br>지원&nbsp;의사가&nbsp;있으신분은&nbsp;메일로&nbsp;이력서&nbsp;먼저&nbsp;보내&nbsp;주시기&nbsp;바랍니다. <br>면접일정은&nbsp;개별&nbsp;통보해&nbsp;드리겠습니다.			 ]]> 
		</description>
		<category>Talk Talk</category>

		<comments>http://ingenuity.egloos.com/3947937#comments</comments>
		<pubDate>Tue, 20 Nov 2007 05:00:05 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 아키텍처, 프레임워크, 플랫폼 정의 ]]> </title>
		<link>http://ingenuity.egloos.com/3899288</link>
		<guid>http://ingenuity.egloos.com/3899288</guid>
		<description>
			<![CDATA[ 
  아키텍처, 프레임워크, 플랫폼.<br><br>많이 듣고 대략적으로 알고 있는 것이지만 간략하게 설명하고자 할 때는 당황할 수도 있기에 정리해 보았다.<br><br><strong>[아키텍처: S/W 주요 설계 구조]</strong><br>&nbsp;<br>S/W의&nbsp;특징들을 결정짓는 주요 설계 구조이다. 즉, S/W의&nbsp;구성 요소 및&nbsp;이들간의&nbsp;인터페이스,&nbsp;동작 방식 등의&nbsp;특징들을 결정짓는 모든 설계 구조를 말한다. 이는 S/W의 주요 특징을 결정짓고 개발에 미치는 영향도 매우 커서 가장 중요한 부분이라고 할 수 있다.<br>&nbsp;<br><strong>[프레임워크: S/W 뼈대 구조]<br></strong>&nbsp;<br>프레임워크는&nbsp;S/W가 개발될 수 있는 뼈대 구조이다. 지원 프로그램, 라이브러리, 언어, 다른 S/W 구성 요소들을 엮어 주는 역할을 한다.&nbsp;그리고 플랫폼과 구분되는 점은&nbsp;프로그램 개발을 위한 부분만을 갖기에&nbsp;완전한 S/W 실행 환경이 되지 않는다.<br>&nbsp;<br><strong>[플랫폼:&nbsp;S/W 실행 환경]<br></strong>&nbsp;<br>가장 일반적이면서도 명료한 의미는 "소프트웨어가 실행되는 환경"이다.<br>개발 언어나 개발 환경을 플랫폼에 포함시키기도 하지만 이는 부수적 개념 혹은&nbsp; 확장된 개념에 불과하고, 핵심은 "S/W가 실행되는 환경"이다. <br>각 프로그램은 아무 플랫폼에서나 실행되는 것이 아니고 특정 플랫폼에서만 실행된다.<br>또한, 각 플랫폼 내부는 또 다시 여러 계층으로 이루어진 구조를 갖는다.<br>이는 S/W 구조가 그만큼 계층화되고 복잡해지고 있음을 의미한다.<br>역설적이지만, S/W 구조가 이렇게 다양해지고 복잡해지는 이유는 다양하고 복잡해지는 요구를 보다 적절히 만족시키기 위한 효과적인 방법이기 때문이라고 볼 수 있다. 따라서, 각 플랫폼은 나름대로의 가치와 적정 용도가 있으므로 프로그램이 성공적(경쟁 제품, 서비보다 저렴하게 개발하거나 보다 고품질을 제공하는 등)이기 위해서는 프로그램 개발 전에는 개발 목적에 가장 적합한 플랫폼을 선정하고 프로그램 개발중에는 플랫폼의 잇점을 최대한 살리는 것이 중요해진다.			 ]]> 
		</description>
		<category>Talk Talk</category>

		<comments>http://ingenuity.egloos.com/3899288#comments</comments>
		<pubDate>Thu, 01 Nov 2007 01:23:21 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 웹2,0, 웹3.0  ]]> </title>
		<link>http://ingenuity.egloos.com/3876521</link>
		<guid>http://ingenuity.egloos.com/3876521</guid>
		<description>
			<![CDATA[ 
  자료 찾다가 쉽게 설명되어 있는 웹2,0, 웹3.0 링크들입니다.<br><br>[웹2.0 : 플랫폼으로서의 웹]<br><br><a href="http://wiki.javajigi.net/pages/viewpage.action?pageId=4182#WEB2.0%EC%97%90%EB%8C%80%ED%95%9C%EB%B6%84%EC%84%9D%EA%B3%BC%ED%96%A5%ED%9B%84%EB%B0%9C%EC%A0%84%EB%B0%A9%ED%96%A5-%EC%9B%B92.0%EC%9D%B4%EB%9E%80">http://wiki.javajigi.net/pages/viewpage.action?pageId=4182#WEB2.0%EC%97%90%EB%8C%80%ED%95%9C%EB%B6%84%EC%84%9D%EA%B3%BC%ED%96%A5%ED%9B%84%EB%B0%9C%EC%A0%84%EB%B0%A9%ED%96%A5-%EC%9B%B92.0%EC%9D%B4%EB%9E%80</a><br><br><br>[윕3.0 : 모든환경에서의 플랫폼]<br><br><a href="http://blog.naver.com/getfly?Redirect=Log&amp;logNo=120043645535">http://blog.naver.com/getfly?Redirect=Log&amp;logNo=120043645535</a>			 ]]> 
		</description>
		<category>즐겨찾기</category>

		<comments>http://ingenuity.egloos.com/3876521#comments</comments>
		<pubDate>Tue, 23 Oct 2007 06:35:29 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ KTH 기술본부 탁구 대회 복식 4강 ]]> </title>
		<link>http://ingenuity.egloos.com/3863342</link>
		<guid>http://ingenuity.egloos.com/3863342</guid>
		<description>
			<![CDATA[ 
  현재 내가 재직중인 KTH 기술본부에서 탁구 대회를 진행중이다.<br><br>나는 복식에 참가중이고 어제&nbsp;예선 토너먼트를 거쳐&nbsp;4강에 들었다.<br><br>결승 진출은 좌절되었고 금요일 3, 4위전에 나간다.<br><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds6.egloos.com/pds/200710/18/21/c0075921_4716ae4a4809e.jpg" width="400" height="300" onclick="Control.Modal.openDialog(this, event, 'http://pds6.egloos.com/pds/200710/18/21/c0075921_4716ae4a4809e.jpg');" /></div>사진을 보면 알겠지만 나의 파트너인 강신국 과장님(검색 엔진&nbsp;개발 담당)은 이미 옷이 땀에 젖었고, 나 역시 예선 토너먼트를 통해 체력이 급저하되었다.<br><br>무거운 둘이 한팀이다 보니 우린 실력보다 체력 안배가 중요하다는걸 깨달은 경기였다.<br><br>그래도 모든이의 예상을 깨고 4강에 오른게 너무 기쁘다.. ㅋㅋ...<br><br>강과장님 수고 많으셨고 3, 4위전때 꼭 이겼으면 합니다. <br><br>그리고 곧 새로운 곳(NHN)으로 가실텐데 그곳에서도 늘 그랬듯이 건승하세요~!			 ]]> 
		</description>
		<category>My Life</category>

		<comments>http://ingenuity.egloos.com/3863342#comments</comments>
		<pubDate>Thu, 18 Oct 2007 00:56:08 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 우리는 친구 ]]> </title>
		<link>http://ingenuity.egloos.com/3790998</link>
		<guid>http://ingenuity.egloos.com/3790998</guid>
		<description>
			<![CDATA[ 
  <a href="http://www.donga.com/docs/magazine/shin/2005/08/29/200508290500020/200508290500020_1.html">http://www.donga.com/docs/magazine/shin/2005/08/29/200508290500020/200508290500020_1.html</a><br><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds6.egloos.com/pds/200709/20/21/c0075921_46f1c6f2239df.jpg" width="500" height="370.37037037" onclick="Control.Modal.openDialog(this, event, 'http://pds6.egloos.com/pds/200709/20/21/c0075921_46f1c6f2239df.jpg');" /></div><br>2005년 와이프가 최초로 언론에 나온 사진인데 우연히 검색하다 발견했다.<br>와이프가 하는 일에 관련한 업계 대표들과 찍은 사진인데 아저씨들 사이에 유일한 여성이자 평사원(대리)이다.<br>오랜만에 다시 보니 재밌고 현재 임신 초기로 입덧이 심한데 더욱 잘해줘야 겠다는 생각이 든다. ㅋㅋ			 ]]> 
		</description>
		<category>My Life</category>

		<comments>http://ingenuity.egloos.com/3790998#comments</comments>
		<pubDate>Thu, 20 Sep 2007 01:06:55 GMT</pubDate>
		<dc:creator>이종화</dc:creator>
	</item>
</channel>
</rss>
