<?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>ill-life</title>
	<link>http://hanna4861.egloos.com</link>
	<description>한나씨의 딴짓거리</description>
	<language>ko</language>
	<pubDate>Tue, 06 Feb 2007 07:02:11 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>ill-life</title>
		<url>http://pds2.egloos.com/logo/200611/27/13/d0045313.jpg</url>
		<link>http://hanna4861.egloos.com</link>
		<width>80</width>
		<height>40</height>
		<description>한나씨의 딴짓거리</description>
	</image>
  	<item>
		<title><![CDATA[ <오라클> 오라클의 설치와 삭제 ]]> </title>
		<link>http://hanna4861.egloos.com/896045</link>
		<guid>http://hanna4861.egloos.com/896045</guid>
		<description>
			<![CDATA[ 
  <p>Install - 다음 - 경로:C:\oracle\ora92 - 다음 - ⊙ Oracle9i Databse 9.2.0.1.0(제품언어 : 기본) - 다음<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;└&gt;$ORACLE_HOME<br />
&nbsp;&nbsp;⊙E nterprise Edition - 일반적인 목적 - 포트번호 : 2030 - 다음 -<br />
&nbsp;&nbsp;전역데이터베이스이름 : ora9210 - 데이터베이스파일디렉토리 : C:\oracle\oradata - 다음<br />
&nbsp;&nbsp;⊙ 기본문자집합사용 -&nbsp; 다음 - 설치</p><p>&nbsp;&nbsp;sys : oracle<br />
&nbsp;&nbsp;system : oracle<br />
&nbsp;&nbsp;-&gt; 종료 -&gt; 다음 설치 하지 않는다.</p><p><br />
--------------------------------------------------</p><p>&nbsp;</p><p>#Oracle 완전 삭제 <br />
- 반드시 순서 지킬 것!</p><p>- 삭제가 제대로 이루어 지지 않으면, Oracle 재설치 안된다.<br />
(1) [시작]-[Oracle installation Products ]-<br />
&nbsp;&nbsp;&nbsp;&nbsp; [Universal installer - 제품설치 해제 - 제품 다 체크하고제거 버튼 클릭] - [설치된 제품] - [삭제]</p><p>(2) 레지스트리 수정<br />
&nbsp;&nbsp; &lt;시작&gt;-&lt;실행&gt;-regedit<br />
&nbsp;&nbsp; - HKEY_Local_Machine\software\Oracle폴더 통째 삭제.<br />
&nbsp;&nbsp; - HKEY_Local_Machine\system\ControlSet001\Oracle 관련서비스(폴더) 삭제<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \ControlSet002\Oracle 관련서비스 삭제<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; \CurrentControlSet\Oracle 관련서비스 삭제<br />
&nbsp;&nbsp;&nbsp;&nbsp; =&gt; Oracle 관련 값은 모두 제거해야 한다.<br />
(3) Reboot<br />
(4) &lt;탐색기&gt; <br />
&nbsp;- 물리적 파일 제거<br />
&nbsp;-설치 파티션 \Oracle폴더<br />
&nbsp;-부트 파티션 \Program files\Oracle폴더<br />
</p>			 ]]> 
		</description>
		<category>study-life</category>

		<comments>http://hanna4861.egloos.com/896045#comments</comments>
		<pubDate>Tue, 06 Feb 2007 07:01:45 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ <MFC>초보자의 완전삽질 GetCursorPos() ]]> </title>
		<link>http://hanna4861.egloos.com/764469</link>
		<guid>http://hanna4861.egloos.com/764469</guid>
		<description>
			<![CDATA[ 
  <br />
void CMFC_keyView::OnLButtonDown(UINT nFlags, CPoint point)<br />
{<br />
&nbsp;// TODO: Add your message handler code here and/or call default<br />
&nbsp;GetCursorPos(&amp;m_ptNow); = point;<br />
&nbsp;Invalidate();<br />
&nbsp;CView::OnLButtonDown(nFlags, point);<br />
} <br />
<br />
이렇게 한번 해보세요<br />
원하는 위치를 표현하지 않는답니다<br />
하하하하하하하<br />
<br />
<br />
void CMFC_keyView::OnLButtonDown(UINT nFlags, CPoint point)<br />
{<br />
&nbsp;// TODO: Add your message handler code here and/or call default<br />
&nbsp;m_ptNow = point;<br />
&nbsp;Invalidate();<br />
&nbsp;CView::OnLButtonDown(nFlags, point);<br />
}<br />
<br />
<br />
이렇게 해야 맞는 표현이지요;;;;;;<br />
&nbsp;			 ]]> 
		</description>
		<category>error-report</category>

		<comments>http://hanna4861.egloos.com/764469#comments</comments>
		<pubDate>Wed, 03 Jan 2007 14:15:58 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 멀티스레드 ]]> </title>
		<link>http://hanna4861.egloos.com/710564</link>
		<guid>http://hanna4861.egloos.com/710564</guid>
		<description>
			<![CDATA[ 
  <div style="text-align: right;"><a href="http://pds4.egloos.com/pds/200612/21/13/multi_t.zip">multi_t.zip</a><br />
</div><br />
<br />
멀티스레드란?<br />
 하나의 창에서 두 개 이상의 작업을 동시에 하는 것<br />
 <br />
 창을 세 개 띄우는 것이 아니었어~(_-_)~<br />
<br />
<br />
<br />
--------------------Configuration: Multi_T - Win32 Debug--------------------<br />
Compiling...<br />
Multi_T.c<br />
c:\program files\microsoft visual studio\myprojects\multi_t\multi_t.c(122) : warning C4013: '_beginthread' undefined; assuming extern returning int<br />
Linking...<br />
Multi_T.obj : error LNK2001: unresolved external symbol __beginthread<br />
Debug/Multi_T.exe : fatal error LNK1120: 1 unresolved externals<br />
Error executing link.exe.<br />
<br />
Multi_T.exe - 2 error(s), 1 warning(s)<br />
<br />
<br />
<br />
위의 문제를 해결하려면<br />
소스파일 오른클릭 -&gt; project setting 대화상자의 설정을 변경해야한다<br />
C/C++탭을 선택하고, Category 콤보박스에서 'Code Generation' 을 선택한다<br />
'Use run-time library' 콤보박스에는 'Single-Threaded' 혹은 'Debug Single-Threaded'를<br />
'Multithreaded' 또는 'Debug Multithreaded'로 변경한다<br />
<br />
<br />
<br />
후아-_- 속았어!!!!!!!!!!<br />
<br />
<br />
<br />
			 ]]> 
		</description>
		<category>error-report</category>

		<comments>http://hanna4861.egloos.com/710564#comments</comments>
		<pubDate>Thu, 21 Dec 2006 11:13:33 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ <JAVA> Polymorphism 테스트 ]]> </title>
		<link>http://hanna4861.egloos.com/701591</link>
		<guid>http://hanna4861.egloos.com/701591</guid>
		<description>
			<![CDATA[ 
  ;&nbsp;다형성<br />
<br />
class polytest <br />
<br />
{<br />
&nbsp;public static void main(String[] args) <br />
&nbsp;{<br />
&nbsp; System.out.println("Hello World!");<br />
&nbsp; osk sk=new osk2();<br />
&nbsp; sk.os();<br />
&nbsp;}<br />
}<br />
<br />
class osk<br />
{<br />
&nbsp;void os(){<br />
&nbsp; System.out.println("사각형");<br />
&nbsp;}<br />
};<br />
<br />
class osk2 extends osk<br />
{<br />
&nbsp;void os(){<br />
&nbsp;System.out.println("삼각형");<br />
&nbsp;}<br />
};<br />
<br />
출력은<br />
Hello World!<br />
삼각형<br />
<br />
			 ]]> 
		</description>

		<comments>http://hanna4861.egloos.com/701591#comments</comments>
		<pubDate>Tue, 19 Dec 2006 08:30:16 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ MFC에서의 Subclassing 방법 ]]> </title>
		<link>http://hanna4861.egloos.com/701519</link>
		<guid>http://hanna4861.egloos.com/701519</guid>
		<description>
			<![CDATA[ 
  MFC의 경우, 가상함수(virtual function)를 이용해서 이 Subclassing을 자동으로 처리해 주고 있다. 즉, 사용자가 어떤 객체 클래스에서 파생하여 다른 클래스를 만들어 내었다면 이것이 바로 Subclassing이 되고 있는 것이다.<br />
<br />
그런데, 이 클래스를 이용해서 객체를 생성하는 것이 아니고, 이미 존재하고 있는 다른 클래스의 객체를 이 클래스로 바꾸어 줄려면, 메시지 처리함수를 교체 해주는 과정을 거쳐야 한다. 이러한 기능을 해주는 함수가 CWnd::SubclassWindow()함수이고, 이 함수를 사용해서 구현된 편리한 함수로 CWnd::SubclassDlgItem()이 있다. 그러나, 이 함수들을 사용하는 방법은 MFC 2.x와 MFC 4.x에서 각각 다르다. 또한, 서브클래스된 상태를 해제하기 위한 함수가 필요한데, MFC 4.x에서는 CWnd::UnsubclassWindow()라는 함수가 존재한다. 그러면, 각각의 사용법에 대해서 보기로 하자. <br />
<br />
<br />
[MFC 4.x] <br />
<br />
새로운 클래스의 객체를 아래와 같이 선언하고, 바꾸고자 하는, 이미 존재하는 창의 핸들이나 ID를 가지고 서브클래싱을 해주면 된다. <br />
&nbsp;&nbsp;&nbsp; CNewClassWnd&nbsp;&nbsp;&nbsp; &nbsp;m_wndNewWnd;<br />
&nbsp;&nbsp;&nbsp; m_wndNewWnd.SubclassWindow(m_pOriginalWnd); <br />
또는<br />
&nbsp;&nbsp;&nbsp; m_wndNewWnd.SubclassDlgItem(ID_ORIGINAL_WND); <br />
그리고, 서브클래싱을 해제할 때는,<br />
&nbsp;&nbsp;&nbsp;&nbsp;m_wndNewWnd.UnsubclassWindow()와 같이 불러 주면 된다.<br />
<br />
<br />
[MFC 2.x] <br />
<br />
MFC 4.x의 경우, MFC 2.x의 복잡함을 줄이기 위해서 단순하게 고쳤다고 볼 수가 있다. 원래, MFC 2.x에서는CWnd::GetSuperWndProcAddr()함수를 구현해 주어야 하고, CWnd::UnsubclassWindow()함수가 존재하지 않는다. 여기에서, CWnd::GetSuperWndProcAddr()란 Subclassing을 할 때, 원래 메시지처리함수의 포인터를 저장하기 위한 장소를 알아내기 위해서 MFC가 부르는 함수이다. 그래서, 우리는 이 함수를 이용해서 그 포인터를 저장할 변수의 주소를 알려 주면 된다. 이 함수를 구현하는 것은 아래와 같다. <br />
<br />
① 우선, 헤더파일에서 함수와 메시지처리함수의 포인터를 저장할 장소를 선언을 한다. <br />
&nbsp;&nbsp;&nbsp;&nbsp; static&nbsp;&nbsp;&nbsp; &nbsp;WNDPROC&nbsp;&nbsp;&nbsp; &nbsp;m_lpSuperWndProc;<br />
&nbsp;&nbsp;&nbsp;&nbsp; virtual WNDPROC* GetSuperWndProcAddr(); <br />
<br />
② 정적변수로 선언을 했으므로, 프로그램파일에서 다시 선언해주고, 함수를 아래와 같이 선언해 준다.<br />
&nbsp;&nbsp;&nbsp;&nbsp; WNDPROC CNewWnd::m_lpSuperWndProc;<br />
&nbsp;&nbsp;&nbsp;&nbsp; WNDPROC* CNewWnd::GetSuperWndProcAddr() { return &amp;m_lpSuperWndProc; } <br />
<br />
<br />
위와 같이, 이 함수는 단순히 포인터를 저장할 변수의 포인터를 넘겨주는 역할만을 한다. 그러므로, 이러한 함수가 MFC 4.x에서는 사라지는 것이 당연하게 보인다.그리고, 생성자에서 이 변수를 NULL로 초기화 시켜 주어도 좋다. <br />
<br />
<br />
그러면, 이제 UnsubclassWindow()함수를 구현해 보자. 이 함수는 컨트롤을 고치기 위한 목적으로는 별로 쓸 일이 없지만, 일반적인 창을 고치거나 할 때는 사용자의 요구에 따라서 창을 원래의 클래스로 바꾸어 줄 경우도 있기 때문에 꼭 필요하게 된다. 이 함수는&nbsp;Subclassing과정을 거꾸로 구현해 주면 된다. <br />
&nbsp;&nbsp;&nbsp; void CNewWnd::UnsubclassWindow() { WNDPROC* lpfnCurrentFn; lpfnCurrentFn = GetSuperWndProcAddr(); ::SetWindowLong(m_hWnd, GWL_WNDPROC, (DWORD)(* lpfnCurrentFn)); return; } 			 ]]> 
		</description>
		<category>study-life</category>

		<comments>http://hanna4861.egloos.com/701519#comments</comments>
		<pubDate>Tue, 19 Dec 2006 08:09:15 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 2006.12.19일자 테트리스-0- ]]> </title>
		<link>http://hanna4861.egloos.com/701498</link>
		<guid>http://hanna4861.egloos.com/701498</guid>
		<description>
			<![CDATA[ 
  하하하;;<br />
<br />
<a href="http://pds3.egloos.com/pds/200612/19/13/tetris.zip">tetris.zip</a>			 ]]> 
		</description>
		<category>study-life</category>

		<comments>http://hanna4861.egloos.com/701498#comments</comments>
		<pubDate>Tue, 19 Dec 2006 08:01:52 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 오버로딩과 오버라이딩 ]]> </title>
		<link>http://hanna4861.egloos.com/701357</link>
		<guid>http://hanna4861.egloos.com/701357</guid>
		<description>
			<![CDATA[ 
  overloading: 클래스의 이름은 같으나 인자가 다른 경우<br />
overriding : 인자와 리턴타입 모두 같은 경우<br />
<br />
<br />
1 메소드 오버로딩<br />
<br />
한 클래스에 동일한 이름의 메소드가 존재하는 경우 서로 오버로딩관계이며, 또한 여러 종류의 생성자가 존재하는 경우에도 모두 서로 overloading 관계이다. 오버로딩이 필요한 이유는 같은 (또는 매우 유사한) 기능을 수행하는 메소드들로서 인자의 타입이 여러 가지 경우가 필요할 때 사용된다. 다음 프로그램은 인자의 종류에 따라서 서로 다른 메소드가 호출되어 2와 1이 출력된다.<br />
<br />
class A {<br />
&nbsp;&nbsp;&nbsp; void test(int i) { System.out.println("1"); }<br />
&nbsp;&nbsp;&nbsp; void test(double i) { System.out.println("2"); }<br />
&nbsp;&nbsp;&nbsp; public static void main(String [] args) {<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A a =new A();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.test(1.0);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a.test(1);<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
<br />
<br />
오버로딩된 메소드들은 실제로 서로 무관한 함수처럼 취급된다. 즉 한 메소드 내에서 다른 오버로드된 메소드를 다시 호출할 수도 있으며 이것은 전혀 관계가 없는 메소드를 호출하듯이 호출하면 된다.<br />
참고로 오버로딩된 경우 적합한 메소드를 찾아서 실행하는 순서는 다음과 같다.<br />
<br />
메소드의 이름<br />
메소드의 인자의 개수<br />
각 인자들의 데이터 형 (data type)<br />
<br />
<br />
<br />
<br />
<br />
2 메소드 오버라이딩(overriding)<br />
<br />
메소드 중복의 주된 목적은 하위클래스에서 상위클래스의 메소드의 동작을 "변경" 시키기 위한 것으로, 오버로딩과 오버라이딩의 주요 차이점은 다음과 같다.<br />
오버로딩된 메소드들은 각각 나름대로 계속 사용이 가능하나, 중복된 메소드의 경우는 나중에 정의한 메소드만 사용할 수 있다.<br />
하나의 클래서 내에서 다수의 오버로딩된 메소드들을 정의할 수 있으나, 중복은 한 하위클래스에서는 "한번만" 정의할 수 있다.<br />
오버로딩 메소드들의 인자는 서로 조금이라도 달라야 하지만 중복된 메소드들은 모든 인자와 리턴 타입도 반드시 일치해야 한다.<br />
오버로딩은 어떤 메소드의 구현내용을 다양하게 즉 다른 형태로 동시에 제공하기 위하여 사용되지만 중복은 메소드의 구현내용을 하위클래스에서 바꾸기 위하여 사용되는 것이다. 메소드 중복은 위와 같은 조건외에도 다음과 같은 조건을 만족하여야 한다.<br />
새로운 메소드의 접근성이 더 좁아지면 안된다. (not more private)<br />
새로운 메소드가 상위클래스의 메소드보다 더 넓은 범위의(상위의) 예외(checked exception)를 발생시키면 안된다. (원래 메소드가 이 예외를 잡을 수 없게 되므로)<br />
주의할 것은 인자는 같고 리턴 타입만 다른 경우는 overloading이 아니며, 컴파일 오류를 발생시킨다. 따라서 같은 클래스 내에서 또는 하위클래스에서 같은 이름과 인자를 같는 메소드는 반드시 같은 리턴 타입을 갖어야 한다.<br />
한편 중복된 (즉 상위클래스에 있는) 메소드를 하위클래스에서 호출할 필요도 있는데 이때는 super.XXX() 와 같이 super를 사용하면 되지만, 두 번 이상 메소드가 중복된 경우에 두 단계 이상 위에 있는 클래스에 있는 (중복) 메소드를 직접 호출할 수는 없다.<br />
주의 : 변수와 메소드를 엑세스할 때의 차이점<br />
아래의 코드중 First s =new Second();에서 s가 멤버 변수(s.var)를 엑세스할 때는 s의 타입인 First이 사용되나, s가 메소드(s.method())를 엑세스할 때는 s가 가리키는 객체참조의 실제타입인 Second가 사용된다. 프로그램의 실행결과는 1 과 2 가 된다.<br />
<br />
<br />
class First {<br />
&nbsp;&nbsp;&nbsp; int var =1;<br />
&nbsp;&nbsp;&nbsp; int method() { return var; }<br />
}<br />
class Second extends First {<br />
&nbsp;&nbsp;&nbsp; int var =2;<br />
&nbsp;&nbsp;&nbsp; int method() { return var; }<br />
}<br />
public class Test {<br />
&nbsp;&nbsp;&nbsp; public static void main(String[] args) {<br />
&nbsp;&nbsp;&nbsp; First s =new Second();<br />
&nbsp;&nbsp;&nbsp; System.out.println(s.var);<br />
&nbsp;&nbsp;&nbsp; System.out.println(s.method());<br />
&nbsp;&nbsp;&nbsp; }<br />
}<br />
&nbsp; 			 ]]> 
		</description>
		<category>study-life</category>

		<comments>http://hanna4861.egloos.com/701357#comments</comments>
		<pubDate>Tue, 19 Dec 2006 07:26:51 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ ▷Inheritance와 Overriding ]]> </title>
		<link>http://hanna4861.egloos.com/701328</link>
		<guid>http://hanna4861.egloos.com/701328</guid>
		<description>
			<![CDATA[ 
  <p>&nbsp;</p><p>&nbsp;</p><p><br />
1. 메서드 재정의란?</p><p>객체지향 개념에서 Overloading만큼이나 중요하며 상속 개념에서 빼놓을 수 없는 것이&nbsp; 바로 Overriding입니다. Overriding은 즉, 메서드 재정의는 말 그대로 메서드를 다시 재정의하는 것을 말합니다. </p><p>&nbsp;</p><p><br />
2. 상속개념에서의 Overriding</p><p>아버지클래스를 상속 받아 아들클래스를 만들었을 때, 아버지가 가지고 있던 메서드를 아들클래스가 다시 만들었다고 가정해 보십시오. 아버지 것은 내 것이고 내 것도 내 것이니 완벽하게 똑같은 이름의 메서드가 2개 존재합니다. 아들클래스가 객체변수를 만들고 이 메서드를 호출한다면 아들클래스는 순간 당황하게 될 것입니다. 아버지 것을 사용할까? 내 것을 사용할까? 하지만 아들클래스의 객체는 유유히 자신의 것을 사용합니다. 왜냐하면, 자신의 것이 더 소중하니까요? 아버지의 메서드는 완전히 무시당하는 것이죠. 이것을 우리는 메서드 재정의라고 부르고 있습니다. 같은 이름의 메서드를 다시 만들 때 상위클래스의 메서드는 무시 당한다는 것입니다. 개념은 아주 쉽습니다. </p><p>▸아버지의 이름으로 아들의 메모리를 참조한다. </p><p>▸아버지라 하더라도 메서드 재정의가 사용되었다면 아들의 메서드를 호출한다.</p><p>▸메서드 재정의 이외에는 완벽한 아버지의 역할을 한다.</p><p>&nbsp;</p><p><br />
3. 메서드 재정의에 대한 느낌 </p><p>아버지의 메서드를 아들이 다시 만들었다면 이것은 아들이 아버지의 특징을 더욱 발전시키거나 아니면 아들만의 특성을 가진 것으로 다시 만든 것입니다. 당연히 아들은 아버지의 것보다는 자신의 것을 사용할 것이다. 이것은 아버지의 모든 것을 상속한다는 특수한 방법을 통해서 아들은 아버지 것을 모두 받아 들이고 필요한 부분만 개선하겠다는 의미를 담고 있습니다. 아주 유용하게 사용할 수 있으며 자바에서 메서드 재정의를 빼면 시체가&nbsp; 되어버릴 정도로 아주 일반적인 프로그래밍 기법입니다. </p><p>&nbsp;</p><p><br />
4. 아버지 무시의 느낌 </p><p>할아버지, 아버지 그리고 아들 모두 print메서드를 가지고 있다고 생각해 보죠. 아버지는 할아버지의 print와 아버지의 print두개의 메서드를 가지고 있습니다. 아들은 3개를 가지고 있죠. 이때 아들의 입장에서 어느것을 사용할 것인가? 아버지는 할아버지의 print를 무시합니다. 그리고 아들은 다시 아버지의 print를 무시하게 됩니다. 아들은 전체 3개의 print를 가지고 있지만 아버지 이전의 것들은 통으로 하나의 조상으로 취급하기 때문에 print는 2개가 있는 것입니다.</p><p>▸할아버지의 print</p><p>▸아버지의 print</p><p>▸아들의 print</p><p>&nbsp;</p><p><br />
아버지가 모든 그 상위 레벨의 정보를 다 가지고 있기 때문에 아들은 아버지 자체를 하나의 조상으로 취급을 하게 됩니다. 그 이전의 모든 정보나 특징들은 아버지가 알아서 다 가지고 있는 것입니다. 처음 이러한 상속개념을 접하게 되면, 할아버지의 할아버지는 어떻게 처리할 것인지 당연히 의심이 가게 마련입니다. 하지만 아들의 입장에서 바라보면 아버지가 모든 정보를 다 처리해서 아버지 상위에 있는 조상들의 정보를 정리해 주기 때문에 아들은 아버지만을 생각하면 됩니다. 즉 아들은 아버지의 print만 생각하면 되는 것입니다. 실제로는 3개의 print가 존재하지만 아들입장에서는 print가 2개 존재하는 것이 되어 버리죠. 아버지의 print와 자신의 print 즉, 아버지의 print를 무시하는 것입니다.</p><p>&nbsp;</p><p><br />
만약 아래와 같이 된다면, 아버지의 print가 없다면 어떻게 될까요. 잘 생각 해 보시기 바랍니다.</p><p>▸할아버지의 print</p><p>▸아버지의 print가 없음</p><p>▸아들의 print</p><p>&nbsp;</p><p><br />
아버지는 할아버지를 상속 받아 할아버지의 print가 아버지의 print가 됩니다. 그렇기 때문에 할아버지의 print메서드가 아버지의 print메서드가 되는 것입니다. 그래서 아버지의 print를 무시하게 되지만 실제적으로는 할아버지의 print를 무시하는 것이 됩니다. </p><p>&nbsp;</p><p><br />
5. 결론</p><p>상속의 개념에서 적용되는 Overriding은 클래스의 재사용이라는 측면에서 아주 유용하게 사용됩니다. 아버지의 클래스의 원하는 부분만을 개선하여 다시 사용하겠다는 의미입니다. Overriding 자체의 개념은 아주 쉽게 넘어 갈 수 있습니다. 아직 완벽하게 설명하지 않은 “아버지의 이름으로 아들을 가르킨다”라는 Upcasting의 개념은 Overriding개념의 최고봉이라 할 수 있습니다. </p><p>그리고, 아버지 무시하기 즉, 메서드 재정의를 했을 때 아버지를 완벽하게 무시한다면 아버지의 메서드를 사용하고 싶을 때는 문제가 발생합니다. 무시해버렸기 때문에 아버지의 메서드를 호출하고 싶을 때 방법이 없습니다. 이것의 방법을 자바에서는 super라는 아버지의 참조값을 두어 해결하고 있습니다. 아들은 super라는 아버지의 참조값으로 아버지의 메서드를 호출할 수 있습니다.<br />
</p>			 ]]> 
		</description>
		<category>study-life</category>

		<comments>http://hanna4861.egloos.com/701328#comments</comments>
		<pubDate>Tue, 19 Dec 2006 07:20:54 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ Overloading Method ]]> </title>
		<link>http://hanna4861.egloos.com/701315</link>
		<guid>http://hanna4861.egloos.com/701315</guid>
		<description>
			<![CDATA[ 
  1. Overloading&nbsp;&nbsp; <br />
Overloading은 같은 이름을 가진 여러 개의 메서드를 말합니다. 보통 다중정의, 중복 메서드라고 부르며 일반적으로는 Overloading이라고 합니다. 이것은 하나의 이름으로 여러 개의 메서드를 가지고 있다는 뜻을 내포하고 있는데 Overloading은 클래스의 사용자를 편하게 하기 위해서 사용하는 객체지향의 기법입니다. <br />
일반적으로 메서드를 만들 때 메서드의 매개변수형, 매개변수의 개수 그리고 리턴형이 다르다면 메서드를 각자 따로 만들어 주어야 합니다. 물론 이름도 다르겠죠. 하지만 이러한 약점을 보완하기 위해서 객체지향에서는 하나의 메서드의 이름으로 다양한 매개변수를 받아 들일 수 있는 메서드를 지원합니다. 이것을 우리는 Overloading이라고 합니다. <br />
중복메서드를 구분할 때의 규칙<br />
▸매개변수의 개수가 달라야 한다. <br />
▸매개변수의 타입이 달라야 한다. <br />
▸위의 개수와 타입 중 하나만 달라도 중복메서드의 조건이 성립 됩니다. <br />
▸메서드의 리턴타입은 중복메서드 구분할 때 사용하지 않습니다. <br />
<br />
<br />
중복 메서드를 자바 내부적으로 위의 방식대로 구분한다면 여러분이 중복 메서드를 만들고자 한다면 위의 규칙을 반드시 지켜야 합니다. <br />
<br />
<br />
2. 결론<br />
C++와 같은 객체지향 언어에서 한가지의 이름으로 여러가지 기능을 제공해 주는 것이 중복메서드입니다. 중복 메서드는 생성자메서드에서도 지원되며 자바 라이브러리에서 아주 많은 부분이 Overloading개념을 포함하고 있기 때문에 Overloading개념을 알고 있어야 만 자바 라이브러리를 잘 이용할 수 있습니다. 기존의 C언어 계열에서는 모든 것을 사용자가 전부 만들어 사용하였지만 언어의 발전에 따라 고급언어로 발전하면서 객체지향의 여러 기법들을 이용하고 있습니다. 이러한 객체지향 기법 중에서 가장 일반적으로 많이 사용되는 Overloading을 잘 알고 있다면 보다 효율적으로 프로그램 개발을 할 수 있을 것입니다. 			 ]]> 
		</description>
		<category>study-life</category>

		<comments>http://hanna4861.egloos.com/701315#comments</comments>
		<pubDate>Tue, 19 Dec 2006 07:17:36 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
	<item>
		<title><![CDATA[ C++에서의 struct와 class ]]> </title>
		<link>http://hanna4861.egloos.com/701305</link>
		<guid>http://hanna4861.egloos.com/701305</guid>
		<description>
			<![CDATA[ 
  c++의 구조체와 c의 구조체는 다릅니다...<br />
c에서는 구조체가 데이터만을 멤버로 가질 수 있지만 c++는 구조체에 함수를 가질 수 있습니다.<br />
사실 class와 struct는 c++에서 거의 차이가 없습니다. 이름만 틀릴 뿐이며 동작하는 방식은 똑같습니다.<br />
struct 역시 생성/소멸될 때 class처럼 생성자와 소멸자를 호출하게 됩니다.<br />
유일한 차이점은 아무런 명시를 해주지 않았을 때 class는 멤버가 private 권한을 가지며 struct는 public을<br />
가진다는 것 뿐입니다. <br />
따라서 struct 키워드를 사용해서 정의를 해준다고 해도 생성자, 소멸자는 물론 다른 멤버 함수도 똑같이<br />
선언할 수 있습니다. <br />
즉, 아래의 두 정의는 완전히 똑같습니다.<br />
<br />
struct stTest {<br />
&nbsp;&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; stTest() : x(0) {};&nbsp;&nbsp;&nbsp; /// contstructor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~stTest() {};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /// destructor<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void stFunc() {};<br />
&nbsp;&nbsp;&nbsp; private:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x;<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
class CTest {<br />
&nbsp;&nbsp;&nbsp; public:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CTest() : x(0) {};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ~CTest() {};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; void cFunc() {};<br />
&nbsp;&nbsp;&nbsp; private:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int x;<br />
&nbsp;&nbsp;&nbsp; };<br />
<br />
하지만 아무런 권한 표시를 해주지 않을 경우 stTest의 멤버는 모두 public이 되며 CTest의 멤버는 모두 private으로<br />
정의됩니다...<br />
			 ]]> 
		</description>
		<category>study-life</category>

		<comments>http://hanna4861.egloos.com/701305#comments</comments>
		<pubDate>Tue, 19 Dec 2006 07:14:09 GMT</pubDate>
		<dc:creator>ILLIFE</dc:creator>
	</item>
</channel>
</rss>
