<?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://zzang2k.egloos.com</link>
	<description>타임캡슐</description>
	<language>ko</language>
	<pubDate>Fri, 20 Nov 2009 01:32:29 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>시간 저장소</title>
		<url>http://pds15.egloos.com/logo/200907/20/30/f0060930.jpg</url>
		<link>http://zzang2k.egloos.com</link>
		<width>80</width>
		<height>45</height>
		<description>타임캡슐</description>
	</image>
  	<item>
		<title><![CDATA[ Base64 원리 ]]> </title>
		<link>http://zzang2k.egloos.com/1984543</link>
		<guid>http://zzang2k.egloos.com/1984543</guid>
		<description>
			<![CDATA[ 
  출처 : <a href="http://par.sarang.net/369">http://par.sarang.net/369</a><br><br><br><br><br>윈도우즈 환경에서 쓰려고 그런 것 같은데 Base64 인코딩의 원리는 간단하므로 <br>어떤 컴퓨팅 환경이던 원리만 알면 누구나 쉽게 코딩할 수 있으리라 생각된다.<br><br><strong>Base64 인코딩 원리</strong><br><br>우선 제목이 말하는 Base64의 의미가 무엇인지 살펴 보자.<br><br>베이스가 64라는 것은 모든 정보를 64진수로 표시한다는 것인데, 컴퓨터는 2진수를 사용하므로 64진수로 표시하기 위해서는<br>2^6 = 64 즉 6 비트 2진수 열이 필요하다.<br><br>그런데 대개 컴퓨터에서 가장 기본이 되는 정보 단위는 8 비트씩 엮어진 바이트이므로<br>6비트와 8비트가 각각 나누어 떨어질 수 있는 공배수의 최소값 (최소 공배수)를 구하면 24비트가 된다.<br><br>24비트는 8비트 바이트에서는 3바이트가 되고, 64진수로 나타내기 위한 6비트 단위로는 4 단위가 된다. (바이트라고 반복하기 말하면 혼동이 될 것 같아서 "단위"라는 말로 대치하였다.)<br><br>따라서 Base64의 인코딩 원리는 3바이트 단위마다 (즉 24비트 마다) 6비트씩 쪼개어서 6비트 짜리 문자 4개로 만드는 것이 되겠다.<br><br>이 때 6비트씩 쪼개진 단위를 A-Z a-z 0-9 + / (모두 64개 문자)로 각각 대응시키면 Base64 인코딩이 된다.<br><br><div class="imageblock center" style="CLEAR: both; TEXT-ALIGN: center"><img height="304" alt="Base64 Encoding Decoding" src="http://par.sarang.net/attach/1/1166262965.jpg" width="492"> <p class="cap1">Base64 Encoding/Decoding</p></div><br><br>그런데 입력되는 정보가 모두 3바이트씩 떨어진다는 보장이 없으므로 3바이트로 나누어떨어지지 않는 경우 = 문자로 채우기를 한다. 즉 Base64로 인코딩 된 데이타에서 = 가 보이면 그 것은 다시 원래의 정보로 되돌아 갈때 (디코딩 될때) 아무 것도 없는 것이라는 소리가 된다.<br>(Base64로 인코딩 정보의 끝에 최대 나올 수 있는 = 의 수는 2개가 되겠다. 즉 끝부분에 =가 없거나 1개가 있거나 2개가 있는 것이 모두 나올 수 있는 경우가 되겠다.)<br><br>디코딩은 A-Z a-z 0-9 +- 문자를 각각 6비트의 정보로 바꾸어서 4 단위 (6*4=24 비트) 마다 합쳐서 3바이트 (3*8=24 비트) 로 다시 복원시키면 된다.<br/><br/>tag : <a href="/tag/Base64" rel="tag">Base64</a>			 ]]> 
		</description>
		<category>암호학</category>
		<category>Base64</category>

		<comments>http://zzang2k.egloos.com/1984543#comments</comments>
		<pubDate>Fri, 20 Nov 2009 01:32:29 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 가상함수 테이블 ]]> </title>
		<link>http://zzang2k.egloos.com/1741699</link>
		<guid>http://zzang2k.egloos.com/1741699</guid>
		<description>
			<![CDATA[ 
  <p style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-WEIGHT: normal; FONT-SIZE: 12px; PADDING-BOTTOM: 0px; MARGIN: 11px 0px 7px; PADDING-TOP: 0px; FONT-STYLE: normal; FONT-FAMILY: Dotum"><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">[출처]</strong> <a href="http://blog.naver.com/samyoung79/110030340489" target="_blank">클래스 단위로 컴파일러가 생성하는 가상함수 테이블</a><span style="PADDING-RIGHT: 7px; PADDING-LEFT: 5px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">|</span><strong style="PADDING-RIGHT: 7px; PADDING-LEFT: 0px; PADDING-BOTTOM: 0px; PADDING-TOP: 0px">작성자</strong> <a href="http://blog.naver.com/samyoung79" target="_blank">동키</a><br><br><br>C++ 컴파일러는 가상 함수를 호출할때 자료형을 참조하는 것이 아니라, <strong>객체 포인터를 이용해 함수를 호출</strong>하게 되는데, 이를 구현하기 위해 <strong>C++ 컴파일러는 컴파일 단계에서 가상 함수를 가지는 모든 클래스에 대해 가상 함수 테이블을 생성한다.</strong> 이 가상 함수 테이블 내의 각 항목은 정의된 가상 함수를 가리킨다. C++ 컴파일러는 가상 함수를 가지는 클래스의 객체에 대해 객체가 할당된 메모리의 처음 4바이트에 가상 함수 테이블의 주소를 저장한다.. </p><p>&nbsp;</p><p>가상함수 테이블 포인터(vptr)을 이용해 가상함수를 호출하기 때문에 객체의 처음 4바이트가 어떤 클래스의 가상 함수 테이블을 가리키는지에 따라 다른 가상 함수를 테이블이 구체적으로 어떻게 생성되고 객체는 자신의 처음 4바이트를 어떻게 초기화시키는지 알아보자</p><p>&nbsp;</p><p>가상 함수 테이블이 클래스 단위로 생성된다고 했는데, C++ 컴파일러가 가상함수 테이블을 클래스 단위로 생성하는 것은 객체의 메모리 크기를 줄이기 위해서 이다. 만약 객체 메모리 영역에 직접 가상 함수 포인터를 생성한다면 가상 함수 개수에 비례하여 객체의 크기는 늘어날 것이다. </p><p>어차피 동일한 클래스로 생성된 객체들은 동일 가상 함수를 호출해야 하기 때문에 이것은 메모리 낭비가 아닐수 없다. </p><p>&nbsp;</p><p>그래서 C++ 컴파일러는 가상함수를 가리키는 포인터를 테이블로 구성하고 이것을 클래스 단위로 생성한 다음 이 테이블에 대한 포인터를 객체 맨 앞에 4바이트에 설정함으로서 간단하게 객체에 가상함수 테이블을 포함하는 효과를 가질수 있도록 한다. 이렇게 C++ 컴파일러가 가상함수 테이블을 관리하기 때문에 가상함수를 가지는 클래스는 가상함수의 개수에 상관없이 객체의 크기는 항상 멤버 변수의 총 크기에 4바이트를 더한 크기로 생성될수 있게 된다. </p><p>&nbsp;</p><p>가상 함수에 대한 모든 원리는 테이블과 관련이 있기 때문에 이것에 대해 좀더 알아보자 </p><p>가상 함수 테이블의 크기는 해당 클래스에 정의된 가상함수 개수에 비례한다. </p><p>여기서 정의된 가상함수란 상위 클래스에 정의된 가상함수도 포함한다.</p><p>그래서 상위 클래스에 두개의 가상함수가 정의되고, 자신의 클래스에 하나의 가상 함수가 정의 된다면 <strong>가상 함수 테이블 내의 항목은 상위 클래스의 가상 함수를 가리킨다. 너무나 당연한 이야기지만 가상 함수 테이블 내의 항목은 재정의 된 가상 함수를 가리킨다.</strong> <span style="COLOR: #ff0000">가상 함수 테이블의 이런 특징 때문에 어떤 클래스가 가상 함수를 상속 받아 가상 함수를 재정의 하지 않고 객체를 생성하여 해당 가상 함수를 호출하면 상위 클래스에 정의된 가상 함수가 호출된다.&nbsp; </span></p><br/><br/>tag : <a href="/tag/가상함수" rel="tag">가상함수</a>,&nbsp;<a href="/tag/가상함수테이블" rel="tag">가상함수테이블</a>,&nbsp;<a href="/tag/c뿔뿔vtable" rel="tag">c뿔뿔vtable</a>			 ]]> 
		</description>
		<category>C플러스플러스</category>
		<category>가상함수</category>
		<category>가상함수테이블</category>
		<category>c뿔뿔vtable</category>

		<comments>http://zzang2k.egloos.com/1741699#comments</comments>
		<pubDate>Thu, 29 Oct 2009 01:42:10 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ object Tag ]]> </title>
		<link>http://zzang2k.egloos.com/1725938</link>
		<guid>http://zzang2k.egloos.com/1725938</guid>
		<description>
			<![CDATA[ 
  <h1><span style="FONT-SIZE: 100%"><span style="FONT-SIZE: 100%"><br>퍼옴 : </span></span><a href="http://jihansome.tistory.com/420"><span style="FONT-SIZE: 100%"><span style="FONT-SIZE: 100%">http://jihansome.tistory.com/420</span></span></a><br><br><br><br><br><br>&lt;OBJECT&gt; </h1><div class="description"><b>OBJECT</b> 요소는 HTML 문서에 객체, 즉 웹 브라우저에서 지원하지 않는 형식의 파일을 삽입할 때 사용합니다. <br><br><b>구문: &lt;OBJECT&gt; </b><br><br><b>닫는 태그: 필요</b></div><h2>속성</h2><p class="in">볼드체로 표시된 것은 필수 속성, 회색으로 표시된 것은 HTML 4.01에서 권장하지 않는(deprecated) 속성입니다.</p><table class="in_table" cellspacing="0" border="0"><tbody><tr><td class="bord head">속성</td><td class="bord head">값</td><td class="bord head">내용</td></tr><tr valign="top"><td class="bord attr" width="50">archive</td><td class="bord"><a href="http://jihansome.tistory.com/409#cdata" target="_blank"><span style="COLOR: #ed125a">CDATA</span></a></td><td class="bord">필요한 라이브러리 파일을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">class</td><td class="bord"><a href="http://jihansome.tistory.com/409#classname" target="_blank"><span style="COLOR: #ed125a">ClassName</span></a></td><td class="bord">CSS의 class 선택자를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">classid</td><td class="bord"><a href="http://jihansome.tistory.com/409#uri" target="_blank"><span style="COLOR: #ed125a">URI</span></a></td><td class="bord">ActiveX 컨트롤의 classid를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">codebase</td><td class="bord"><a href="http://jihansome.tistory.com/409#uri" target="_blank"><span style="COLOR: #ed125a">URI</span></a></td><td class="bord">개체가 현재 HTML 문서와 다른 디렉토리에 있을 경우, 애플릿의 파일 경로를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">codetype</td><td class="bord"><a href="http://jihansome.tistory.com/409#contenttypes" target="_blank"><span style="COLOR: #ed125a">ContentTypes</span></a></td><td class="bord">MIME 타입을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">data</td><td class="bord"><a href="http://jihansome.tistory.com/409#uri" target="_blank"><span style="COLOR: #ed125a">URI</span></a></td><td class="bord">플러그인 파일의 URI를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">declare</td><td class="bord"><a href="http://jihansome.tistory.com/409#text" target="_blank"><span style="COLOR: #ed125a">Text</span></a></td><td class="bord">ActiveX 컨트롤을 선언합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">dir</td><td class="bord">rtl<br>ltr</td><td class="bord">글자 방향을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">height</td><td class="bord"><a href="http://jihansome.tistory.com/409#length" target="_blank"><span style="COLOR: #ed125a">Length</span></a></td><td class="bord">개체의 높이를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">id</td><td class="bord"><a href="http://jihansome.tistory.com/409#elementid" target="_blank"><span style="COLOR: #ed125a">ElementID</span></a></td><td class="bord">CSS의 ID 선택자를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">lang</td><td class="bord"><a href="http://jihansome.tistory.com/409#languagecode" target="_blank"><span style="COLOR: #ed125a">LanguageCode</span></a></td><td class="bord">내용에 사용할 언어를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">name</td><td class="bord"><a href="http://jihansome.tistory.com/409#cdata" target="_blank"><span style="COLOR: #ed125a">CDATA</span></a></td><td class="bord">요소의 이름을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">standby</td><td class="bord"><a href="http://jihansome.tistory.com/409#text" target="_blank"><span style="COLOR: #ed125a">Text</span></a></td><td class="bord">개체가 로딩되는 동안 먼저 표시될 텍스트를 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">style</td><td class="bord"><a href="http://jihansome.tistory.com/409#styledesc" target="_blank"><span style="COLOR: #ed125a">StyleDesc</span></a></td><td class="bord">CSS 스타일을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">tabindex</td><td class="bord"><a href="http://jihansome.tistory.com/409#number" target="_blank"><span style="COLOR: #ed125a">Number</span></a></td><td class="bord">링크의 탭 순서를 지정합니다. 0과 32767사이의 하나의 숫자를 사용하며 양수로 표시된 값이 낮은 숫자일수록 우선 순위가 되며, 값이 같을 때는 HTML 문서에서 먼저 나온 것이 우선 순위가 됩니다. 값이 '0'이거나 없는 경우는 가장 마지막 순서가 됩니다. </td></tr><tr valign="top"><td class="bord attr" width="50">title</td><td class="bord"><a href="http://jihansome.tistory.com/409#text" target="_blank"><span style="COLOR: #ed125a">Text</span></a></td><td class="bord">웹 브라우저에서 툴팁으로 표시할 추가 설명을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">type</td><td class="bord"><a href="http://jihansome.tistory.com/409#contenttypes" target="_blank"><span style="COLOR: #ed125a">ContentTypes</span></a></td><td class="bord">MIME 타입을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">usemap</td><td class="bord"><a href="http://jihansome.tistory.com/409#uri" target="_blank"><span style="COLOR: #ed125a">URI</span></a></td><td class="bord">이미지 맵의 URI를 지정합니다. map으로 명명된 <b>MAP</b> 요소가 같은 문서에 포함되어 있어야 합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">usemap</td><td class="bord"><a href="http://jihansome.tistory.com/409#uri" target="_blank"><span style="COLOR: #ed125a">URI</span></a></td><td class="bord">컨트롤에 이미지 맵을 지정합니다.</td></tr><tr valign="top"><td class="bord attr" width="50">width</td><td class="bord"><a href="http://jihansome.tistory.com/409#length" target="_blank"><span style="COLOR: #ed125a">Length</span></a></td><td class="bord">개체의 너비를 지정합니다.</td></tr><tr><td class="bord attr deprec">align</td><td class="bord deprec">left<br>right<br>top<br>bottom<br>middle</td><td class="bord deprec">정렬 방법을 지정합니다.</td></tr><tr><td class="bord attr deprec">border</td><td class="bord deprec"><a href="http://jihansome.tistory.com/409#length" target="_blank"><span style="COLOR: #ed125a">Length</span></a></td><td class="bord deprec">테두리의 두께를 지정합니다.</td></tr><tr><td class="bord attr deprec">hspace</td><td class="bord deprec"><a href="http://jihansome.tistory.com/409#pixels" target="_blank"><span style="COLOR: #ed125a">Pixels</span></a></td><td class="bord deprec">세로 여백을 지정합니다.</td></tr><tr><td class="bord attr deprec">vspace</td><td class="bord deprec"><a href="http://jihansome.tistory.com/409#pixels" target="_blank"><span style="COLOR: #ed125a">Pixels</span></a></td><td class="bord deprec">가로 여백을 지정합니다.</td></tr></tbody></table><h2>예제</h2><fieldset><legend>예제 1</legend><pre class="ex"> &lt;OBJECT data="mlk.mov" type="video/quicktime" title="Martin Luther King's &amp;quot;I Have a Dream&amp;quot; speech"<br> width="150" height="150"&gt; &lt;PARAM name="pluginspage" value="http://quicktime.apple.com/"&gt; &lt;PARAM name="autoplay" value="true"&gt; &lt;OBJECT data="mlk.wav" type="audio/x-wav"  title="Martin Luther King's &amp;quot;I Have a Dream&amp;quot; speech"&gt; &lt;PARAM name="autostart" value="true"&gt; &lt;PARAM name="hidden" value="true"&gt; &lt;A href="mlk.html"&gt;Full text of Martin Luther King's "I Have a Dream" speech&lt;/A&gt; &lt;/OBJECT&gt; &lt;/OBJECT&gt;    </pre><div class="dis"><b>OBJECT</b> 요소는 실행 초기 데이터를 제공하기 위해 <a href="mk:@MSITStore:C:\Program%20Files\Namo\WebEditor%20FX\bin\Reference.chm::/param.html"><b><span style="COLOR: #ed125a">PARAM</span></b></a> 요소를 포함할 수 있습니다. 위 예제는 비디오 클립을 포함한 것으로, 비디오 클립을 보여줄 수 없을 경우 이를 대신하여 보여줄 콘텐츠로 오디오 클립을 지정하였고, <b>PARAM</b> 요소를 이용하여 오디오/비디오 플러그 인을 위한 매개 변수를 지정하였습니다. </div></fieldset><br><fieldset><legend>예제 2</legend><pre class="ex"> &lt;OBJECT classid="java:yahtzee.class" codetype="application/java" width="400" height="250" title="my yahtzee game" standby="Get ready to play Yahtzee!"&gt;   Enable Java support to play!&lt;/OBJECT&gt; </pre><div class="dis">위 예제는 <b>OBJECT</b> 요소를 사용하여 자바 애플릿을 삽입한 것입니다. </div></fieldset><br><fieldset><legend>예제 3</legend><pre class="ex"> &lt;OBJECT data="example.gif" title="Nice Photo" /&gt; </pre><div class="dis">위 예제는 <a href="mk:@MSITStore:C:\Program%20Files\Namo\WebEditor%20FX\bin\Reference.chm::/img.html"><b><span style="COLOR: #ed125a">IMG</span></b></a> 요소 대신 <b>OBJECT</b> 요소를 사용하여 그림을 삽입한 것입니다. <b>title</b> 속성은 <b>IMG</b> 요소의 <b>alt</b> 속성과 같은 역할을 합니다. </div></fieldset><br><fieldset><legend>예제 4</legend><pre class="ex">&lt;OBJECT classid="clsid:F08DF954-8592-11D1-B16A-00C0F0283628" id="Slider1" width="200" height="40" border="2"&gt;  &lt;PARAM name="BorderStyle" value="1" /&gt;  &lt;PARAM name="MousePointer" value="0" /&gt;  &lt;PARAM name="Enabled" value="1" /&gt;  &lt;PARAM name="Min" value="0" /&gt;  &lt;PARAM name="Max" value="10" /&gt;&lt;/OBJECT&gt;</pre><div class="dis">위 예제는 <b>OBJECT</b> 요소를 사용하여 ActiveX 컨트롤을 삽입한 것입니다. <b>classid</b>의 값은 Windows 레지스트리의 CLSID를 참조한 것입니다. 여러 개의 <a href="mk:@MSITStore:C:\Program%20Files\Namo\WebEditor%20FX\bin\Reference.chm::/param.html"><b><span style="COLOR: #ed125a">PARAM</span></b></a> 요소를 사용하여 ActiveX 컨트롤을 위한 매개 변수를 지정하였습니다.</div></fieldset><br><h2>지원 브라우저/HTML 버전</h2><p class="in">이 태그를 지원하는 브라우저의 최소 버전은 아래와 같습니다.<br><br><b>IE 3, NN n/a, HTML 4</b></p><h2>참고</h2><ul><li><b>OBJECT</b> 요소는 <a href="mk:@MSITStore:C:\Program%20Files\Namo\WebEditor%20FX\bin\Reference.chm::/inline.html"><span style="COLOR: #ed125a">인라인 요소</span></a>(Inline Element)와 <a href="mk:@MSITStore:C:\Program%20Files\Namo\WebEditor%20FX\bin\Reference.chm::/block.html"><span style="COLOR: #ed125a">블록 요소</span></a>(Block Element) 안에 모두 쓰일 수 있습니다. <li><b>OBJECT</b> 요소의 내용은 <b>OBJECT</b> 부모 요소 안에 포함될 수 있는 요소여야 합니다. 예를 들어 <b>OBJECT</b>가 <a href="mk:@MSITStore:C:\Program%20Files\Namo\WebEditor%20FX\bin\Reference.chm::/a.html"><b><span style="COLOR: #ed125a">A</span></b></a> 요소 안에 포함되어 있다면, <b>OBJECT</b>는 블록 요소를 내용으로 포함할 수 없습니다. </li></ul>			 ]]> 
		</description>
		<category>코딩/개발</category>

		<comments>http://zzang2k.egloos.com/1725938#comments</comments>
		<pubDate>Tue, 27 Oct 2009 04:05:40 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ extern "C" ]]> </title>
		<link>http://zzang2k.egloos.com/1680999</link>
		<guid>http://zzang2k.egloos.com/1680999</guid>
		<description>
			<![CDATA[ 
  <span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">[퍼옴]http://cafe.naver.com/devctrl/1700<br><br>C와 C++는 컴파일시 obj에 함수 이름, 변수 이름 등의 심벌을 기록하는 방식이 다르다. 그래서 C++ 컴파일러에서 C로 작성된 코드를 컴파일 하고자 할 때 사용한다.</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">C 컴파일러는&nbsp;함수 이름을 그대로 사용하는 반면 C++ 컴파일러는 그대로 사용하지 않는다. </span><br></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'">C++에서 프로그래머가 Func라는 이름으로 함수를 만들어도 이 이름과 동일한 함수를&nbsp; 만들 수 있다. 어떤 Func라는 함수는 정수를 인자로 받고 또 어떤 Func라는 함수는 실수를 인자로 받도록 만들 수 있다. <br></span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'">이렇게 이름이 동일한 여러 개의 함수가 나타날 수 있기 때문에 C++ 컴파일러는 내부적으로 Func라는 이름에다가 인자들의 타입 및 리턴 타입으로 어떤 문자들을 덧붙여서 각 함수들을 구분할 수 있도록 새로운 이름을 만든다.<br><br></span></span></span><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">extern "C"는&nbsp;C++에서 C 함수를 사용하고자 할 때, 컴파일러에게 C 함수라는 것을 알리는&nbsp;역할을 한다.<br></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">이해를 돕기 위해 다음과 같은 프로그램 예를 들어보자(파일 확장자는 .cpp로 만들어 C++ style로 컴파일한다).</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">add_1(), fadd_2(), add_3()이 컴파일 된 후,&nbsp;어떻게 이름이 바뀌는지 보면 왜 extern "C" 가 필요한지 알 수 있다.</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><blockquote><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">#include "stdio.h"</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">int add_1(int a, int b);</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">float fadd_2(int a, int b);</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">extern "C"&nbsp;int add_3(int a, int b);</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">int main()</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">{</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; int a = 2; </span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; int b = 3;</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; int&nbsp;c;</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; float fc;</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; c&nbsp; = add_1(a, b);</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; fc = fadd_2(a, b);</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; c = add_3(a, b);</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; return 0;</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">}</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">/* -- 시험 삼아 여기를 막는다. --</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">int add_1(int a, int b)</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">{</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; return a + b;</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">}</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">float fadd_2(int a, int b)</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">{</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; return (float)(a + b);</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">}</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">int add_3(int a, int b)</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">{</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">&nbsp;&nbsp;&nbsp; return a + b;</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">}</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">*/</span><br></blockquote></span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">################### compile/link 결과 ###############################</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">naver.obj : error LNK2001: unresolved external symbol _add_3</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">naver.obj : error LNK2001: unresolved external symbol "float __cdecl fadd_2(int, int)" (?fadd_2@@YAMHH@Z)</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">naver.obj : error LNK2001: unresolved external symbol "int __cdecl add_1(int, int)" (?add_1@@YAHHH@Z)</span><br><br></span></span><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><span>compile/link 하면 위와 같이 link error가 발생한다.<br><strong>자세히 보면</strong></span><br><strong><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">add_1 -&gt; ?add_1@@YAHHH@Z</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">fadd_2 -&gt; ?fadd_2@@YAMHH@Z</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">add_3 -&gt; _add_3</span><br></strong></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><strong>와 같이 compile 과정에서 이름이 바뀐다.<br></strong></span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><strong>add_1(), fadd_2()는 C++ style의 decorated name으로 바뀐 것이며, add_3()는 prototype에서 extern "C"를 주었으므로 C style로 '_'만 앞에 붙은 것이 차이점이다.</strong><br><br></span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'">C++는 argument, return value에 따라 이름이 바뀌어&nbsp;반드시 protype과 일치하는 function이 link된다.&nbsp;argument가 틀린 경우에는 같은 이름의 function이 여러 개 존재할 수 있으며 argument에 따라 적당한 function이 link된다.<br><br></span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'">C는 단순히 이름 앞에 '_' 만 추가되므로 argument가 틀리던 return value type이 틀리던 link는 될 수 있다. 심하게 잘못되면 compile/link는 되는데 오동작을 할 수도 있다.<br><br></span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><u>C++는 컴파일시&nbsp;함수 이름을&nbsp;모두 다른 이름으로 바꿔주기 때문에&nbsp;C에서 컴파일된 함수를 링크시킬 때는 해당 함수의 선언부 혹은 include 부분에 extern "C"라는 키워드를 사용하여 해당 함수가 C로 컴파일된 함수라는 것을 컴파일러에게 명시적으로 알려줘야 한다.</u> <br><br>그런데 이 extern "C" 키워드는 C++에서 사용하는 것이므로 C에서는 사용되지 않는다. 따라서 반대로 C++의 함수를 C에서 사용하고자 한다면 C++ 소스를 컴파일 전에 소스 내에서 사용되는 함수의 선언을 모두 <br></span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'">extern "C" 함수선언 <br></span></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'">이렇게 변환해 주어야 한다.<br><br></span></span></span><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">C에서는 이미 컴파일된 C++ 함수를 호출할 수 없다. 하지만, 만약 이렇게 C++ 소스에서 모든 함수를 extern "C"로 변환한다면 이 함수들은 C++의 함수 특성을 모두 잃게 된다. 즉, 클래스의 멤버 함수가 될 수 없고 인자만 틀리고 함수 이름은 같은 오버로딩 함수가 될 수도 없다.<br><br></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">보통 *.h 파일에 아래와 같이 하여 *.c, *.cpp에서 공용할 수 있는 protype 선언을 한다.</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><blockquote><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">#if defined (__cplusplus)</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">extern "C" {</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">#endif</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">int func1();</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">int func2(); </span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">.</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">.</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">.</span><br><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">#if defined (__cplusplus)</span><br><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10">};</span><br></span></span><span style="FONT-SIZE: 10pt; FONT-FAMILY: 954102_10"><span style="FONT-FAMILY: '돋움','Dotum'"><span style="FONT-FAMILY: '돋움','Dotum'">#endif<br></span></span></span></blockquote></span></span></span><!--       <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"		    xmlns:dc="http://purl.org/dc/elements/1.1/"		    xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">       <rdf:Description	        rdf:about="http://pinge.egloos.com/4267350"	        dc:identifier="http://pinge.egloos.com/4267350"	        dc:title="[VC] extern &quot;C&quot;"	        trackback:ping="http://pinge.egloos.com/tb/4267350"/>       </rdf:RDF>       --><br/><br/>tag : <a href="/tag/externC" rel="tag">externC</a>			 ]]> 
		</description>
		<category>코딩/개발</category>
		<category>externC</category>

		<comments>http://zzang2k.egloos.com/1680999#comments</comments>
		<pubDate>Wed, 21 Oct 2009 08:58:46 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 12장 ]]> </title>
		<link>http://zzang2k.egloos.com/1666342</link>
		<guid>http://zzang2k.egloos.com/1666342</guid>
		<description>
			<![CDATA[ 
  <br>당장 봐야할 거 부터 -_- 대충 내용은 아니깐..<br><br><span style="FONT-SIZE: 130%">열혈강의 C++ 12장 템플릿</span><br><br><br><strong>1. 템플릿<br></strong><br>Template. 모형자??<br><br>모형자는 기능이 결정되어 있다. 예를 들어 원을 그린다던가, 삼각형을 그린다던가..<br><span style="COLOR: #ff0000">하지만 색은 결정되어져 있지 않다<br></span><br><span style="COLOR: #000000"><blockquote><p>#include&lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p><br>template &lt;typename T&gt;&nbsp;&nbsp;&nbsp;&nbsp;//함수 템플릿이라고 한다.<br>T Add(T a, T b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a+b;<br>}</p><p><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; Add(10, 20) &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; Add(1.1, 2.2) &lt;&lt; endl;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br><strong>자료형에 독립적으로 이용이 된다!<br><br></strong>잘봐 이런 것도 가능하다<br>#include &lt;iostream&gt;<br>#include &lt;string&gt;</p><p><br>using std::cout;<br>using std::endl;<br>using std::string;</p><p><br>template &lt;typename T&gt;<br>T Add(T a, T b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return a+b;<br>}</p><p>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string str1="abc";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;string str2="def";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; str1 &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; str2 &lt;&lt; endl;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; Add(str1, str2) &lt;&lt; endl;</p><p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br><strong>결과는 abcdef</strong><br></p></blockquote><br><strong>2. 함수 템플릿</strong><br><blockquote><p>자료형 T1과 T2에 대해서 아래에 존재하는 함수를 템플릿화 하겠다.<br><br>#include &lt;iostream&gt;<br>#include &lt;string&gt;</p><p>using std::cout;<br>using std::endl;<br>using std::string;</p><p><br>template &lt;typename T1, typename T2&gt;<br>void ShowData(T1 a, T2 b)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; a &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; b &lt;&lt; endl;<br>}</p><p><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowData(1, 2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowData(3, 2.5);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br>geneirc programming : 자료형에 제한을 받지 않게 일반화시키는 것<br></p><p><br><strong>함수 템플릿의 특수화</strong><br><br>#include &lt;iostream&gt;<br>using std::endl;<br>using std::cout;</p><p><br>template &lt;typename T&gt; // 함수 템플릿 정의<br>int SizeOf(T a) <br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return sizeof(a);<br>}</p><p><br><strong>template&lt;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">&nbsp;//char* 가 전달이 되면 이 함수가 호출이 된다.</span><br>int SizeOf(char* a)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return strlen(a);<br>}</strong></p><p><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i=10;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;double e=7.7;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char* str="Good morning!";</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;SizeOf(i)&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;SizeOf(e)&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;SizeOf(str)&lt;&lt;endl;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p></blockquote></span><blockquote><p></p></blockquote><br><br><strong>3. 클래스 템플릿</strong><br><blockquote><p>#include &lt;iostream&gt;<br>using std::endl;<br>using std::cout;</p><p><br>template &lt;typename T&gt;<br>class Data<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T data;<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data(T d);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void SetData(T d);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T GetData();<br>};</p><p><br>template &lt;typename T&gt;<br>Data&lt;T&gt;::Data(T d) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = d;<br>}</p><p><br>template &lt;typename T&gt;<br>void Data&lt;T&gt;::SetData(T d) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;data = d;<br>}</p><p><br>template &lt;typename T&gt;<br>T Data&lt;T&gt;::GetData() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return data;<br>}</p><p><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data&lt;int&gt; d1(0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;d1.SetData(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data&lt;char&gt; d2('a');<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; d1.GetData() &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; d2.GetData() &lt;&lt; endl;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p><p><br>사실 클래스가 아니라 Data &lt;T&gt; 템플릿이다.<br></p></blockquote><br><strong>4. 템플릿의 원리</strong><br><blockquote><br>템플릿은 함수 오버로딩과 유사한 형태로 구성이 된다.</blockquote><blockquote><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds15.egloos.com/pds/200910/20/30/f0060930_4add0e3cd4618.jpg" width="382" height="205" onclick="Control.Modal.openDialog(this, event, 'http://pds15.egloos.com/pds/200910/20/30/f0060930_4add0e3cd4618.jpg');" /></div><br></blockquote><blockquote>템플릿을 기반으로 해서 다양한 형태의 코드가 컴파일 타임에 만들어진다.<br>즉 컴파일러가 만든다.<br><br><span style="COLOR: #ff0000">따라서 템플릿은 함수가 아니라, 함수를 만들어 내는 형틀에 지나지 않는다. 함수 <strong>템플릿</strong>이다.<br>따라서 템플릿 함수란 템플릿이 만든 다양한 형태의 함수를 만든다. 이것이 템플릿 <strong>함수</strong>이다.<br><br></span>인자 형태를 보며 템플릿 함수를 생성한다.<br><br>-템플릿은 선언과 정의를 분리하면 안된다.<br>&nbsp;왜냐하면 컴파일 타임에 참조가 가능해야 하기 때문이다.<br><br></blockquote><br><br><br>			 ]]> 
		</description>
		<category>C플러스플러스</category>

		<comments>http://zzang2k.egloos.com/1666342#comments</comments>
		<pubDate>Tue, 20 Oct 2009 01:21:06 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 7장 ]]> </title>
		<link>http://zzang2k.egloos.com/1662423</link>
		<guid>http://zzang2k.egloos.com/1662423</guid>
		<description>
			<![CDATA[ 
  <p><br>드디어!! 상속<br><br><span style="FONT-SIZE: 130%">열혈강의 C++ 7장<br></span><br><br><br>1. 상속으로 들어가기에 앞서서<br><br>일단 스톱....<br><br><br>2. 상속의 기본 개념<br></p><blockquote><p>#include &lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p>class Person<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char name[20];<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int GetAge() const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const char* GetName() const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return name;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person(int _age=1, char* _name="noname") {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age=_age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(name, _name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</p><p>class Student: public Person<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char major[20];<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student(char* _major) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(major, _major);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const char* GetMajor() const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return major;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void ShowData() const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "이름 : " &lt;&lt; GetName() &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "나이 : " &lt;&lt; GetAge() &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "전공 : " &lt;&lt; GetMajor() &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</p><p><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student zzang2k("computer");</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zzang2k.ShowData();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p></blockquote><p><br>&nbsp;<br></p>			 ]]> 
		</description>

		<comments>http://zzang2k.egloos.com/1662423#comments</comments>
		<pubDate>Mon, 19 Oct 2009 17:44:31 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 6장 ]]> </title>
		<link>http://zzang2k.egloos.com/1650876</link>
		<guid>http://zzang2k.egloos.com/1650876</guid>
		<description>
			<![CDATA[ 
  <p><br>어익후..<br><br><span style="FONT-SIZE: 130%">열혈강의 C++ 6장<br></span><br><br><strong>1. 클래스와 const</strong><br><br>const 키워드는 변수를 상수화한다. 값 변경시 컴파일 오류<br>데이터 상수화<br>포인터 상수화<br><br></p><blockquote><p>class Student<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const int id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char name[20];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char major[30];<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student(int _id, int _age, char* _name, char* _major)<span style="COLOR: #ff0000">:id(_id)</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; id=_id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age=_age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(name, _name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(major, _major);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br><br>이 같은 경우 먼저 멤버변수 id가 메모리에 할당되고 쓰레기 값으로 채워진다. 그리고 생성자를 호출하여 초기화하려 하면 const키워드로 인해 컴파일 오류가 난다.<br><br>따라서 <span style="COLOR: #ff0000"><span style="COLOR: #ff0000"><strong>:id(_id)</strong></span> </span><span style="COLOR: #000000">와 같이 <span style="COLOR: #ff0000"><strong>이니셜라이져(initializer) </strong></span>를 이용하여 초기화 해야 한다.<br>이는 메모리가 할당되고 나서 생성자 몸체 부분이 실행되기 이전에 실행되고,<br>쓰레기 값이 들어가기 이전에 실행 된다. 따라서 const 키워드도 초기화 할 수 있다.<br><br><br><br>함수 상수화 <br>멤버 변수 뒤에 const 키워드를 쓰면 해당 함수에서는 멤버 변수의 값 변경을 허용하지 않겠다라는 의미<br>왜 함수가 상수화 되었는데 멤버 변수를 조작하려 하느냐!<br>--&gt; 프로그램을 안정적으로 구성하는데 도움<br><br>class Student<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const int id;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char name[20];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char major[30];<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Student(int _id, int _age, char* _name, char* _major):id(_id), age(_age)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(name, _name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(major, _major);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></p><p><span style="COLOR: #000000">&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void ShowData() <span style="COLOR: #ff0000"><strong>const<br></strong></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br><span style="COLOR: #ff0000">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>//age = 20;&nbsp;이와 같이 조작하는 코드를 넣으면&nbsp;컴파일&nbsp;오류발생.</strong></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"이름: "&lt;&lt;name&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"나이: "&lt;&lt;age&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"학번: "&lt;&lt;id&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"학과: "&lt;&lt;major&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br><br><br><br></span>조작할 수 있는 동기를 제공하지 않는다.<br>예를 들어&nbsp;<br><br>class A {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int cnt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int* GetPtr() const{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &amp;cnt;&nbsp; // Compile Error<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br>이 코드 역시 에러이다. 왜냐하면 GetPtr 함수를 호출하여 리턴 받은 놈은 주소를 얻기 때문에 변경할 여지가 충분히 있다.<br>따라서 참조만 하려고 한다면<br><br>class A {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int cnt;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const int* GetPtr() const{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &amp;cnt;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>이렇게 빼도박도 못하게 확실하게 해줘야 한다.<br><br><br><br>class A {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int cnt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp; void ShowData() const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ShowIntro();&nbsp;<span style="COLOR: #ff0000">// Compile Error</span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;cnt&lt;&lt;endl;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void ShowIntro() <em><span style="COLOR: #3333ff">const</span></em>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"현재 count의 값 : "&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br><br>이건 왜 오류일까?<br>상수화 된 함수 내에서 상수화되지 않은 함수를 호출했다.<br>ShowIntro 함수가 멤버 조작을 하지 않는 함수라고 해도 컴파일러는 그걸 모른다. 왜냐 const되지 않았기 때문에.<br>컴파일러는 const냐 아니냐만 검사한다. 따라서 const 키워드를 붙이면 오류가 없겠지.<br></p></blockquote><p><br><br><strong>2. const 객체</strong></p><blockquote>기본적으로 변수, 함수에 쓰이는 const와 동일<br>다른 거 없다. 똑같이 생각해라.<br>const AAA aaa(10);<br><br>const 객체는 const 함수 이외이는 호출이 불가능하다.<br>데이터 변경이 허용되지 않는 객체!</blockquote><p><br>const도 함수 오버로딩 조건에 포함된다.<br></p><blockquote><p>#include &lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p><br>class AAA<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int num;<br>public :<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA(int _num) : num(_num) {}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>void ShowData(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"void ShowData() 호출"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;num&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void ShowData() const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"void ShowData() const 호출"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;num&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</strong><br>};</p><p>&nbsp;<br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;const AAA aaa1(20);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA aaa2(70);</p><p>&nbsp;&nbsp;&nbsp;&nbsp; aaa1.ShowData();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aaa2.ShowData();&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">//aaa2는 const 이다. 따라서&nbsp;const 멤버 함수가 호출된다.</span><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p></blockquote><p><br><br><strong>3. static 키워드</strong><br>static 키워드는 지역 변수를 전역 변수의 형태로 만든다.<br>따라서 전역변수는 아무 곳에서나 참조 가능. 하지만 static 변수는 전역을 파일로 제한.<br><br>객체 지향에는 전역이라는 개념이 존재하지 않는다.<br>따라서 static 멤버가 등장했다.<br></p><blockquote>#include&lt;iostream&gt;<br>using std::cout;<br>using std::endl;<p><br>class Person<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char name[20];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static int count;<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person(char* _name, int _age)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(name, _name);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age=_age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;count++&lt;&lt;"번째 Person 객체 생성"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void ShowData(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"이름: "&lt;&lt;name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"나이: "&lt;&lt;age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</p><p><br><span style="COLOR: #ff0000">int Person::count=1; // static 멤버 초기화</span></p><p><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person p1("Lee", 13);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person p2("Hong", 22);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p><br><strong>static 멤버의 특징<br>(정확히 말하면 static 멤버라는 표현은 없다. 왜냐면 클래스 멤버가 아니기 때문에.-&gt; 클래스 객체 생성 전에 메모리에 할당되니깐!!)<br><br></strong>-클래스 변수, 클래스 함수라 한다.<br>-메인함수 호출 이전에 메모리 공간에 올라가서 초기화된다(전역변수와 동일)<br>-그냥 초기화가 안된다. static 멤버 초기화무능로 초기화해야 한다.<br><br>static 멤버 변수(클래스변수)는 직접 접근 권한, 가릴 수 있는 권한(권한 지정 키워드에 영향을 받는다)을 제공한다.<br><br>생성자 내에서 초기화 할 수 없다. 왜냐 객체 생성 시 마다 초기화 되어야 한다. 말이 안된다.<br>따라서 static 멤버 초기 문장으로 초기화 해야 한다.<br><br><span style="COLOR: #ff0000">int Person::count=1; // static 멤버 초기화<br></span></blockquote><p><br><strong>4. explicit &amp; mutable</strong><br><br>explicit : 명시적 호출만 허용을 한다.<br></p><blockquote><p>#include&lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p><br>class AAA<br>{<br>public:<br>&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">explicit</span> AAA(int n){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"explicit AAA(int n)"&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br></p><p>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;AAA a1=10;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="COLOR: #ff0000">//이 문장은 묵시적으로 아래와 같이 형변환되어 호출된다. 따라서 explicit 선언시 이와같이 하면 오류가 난다. 왜냐. explicit은 명시적으로만 사용하라라는 의미니깐!<br></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA a1(10);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p></blockquote><br>mutable : 상수 함수 내에서 조작 가능하게 한다. const 에 예외를 둔다.<blockquote>#include&lt;iostream&gt;<br>using std::cout;<br>using std::endl;<p><br>class AAA<br>{<br>private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mutable int val1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int val2;</p><p>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void SetData(int a, int b) const&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val1=a;&nbsp; // val1이 mutable이므로 OK!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val2=b;&nbsp; // Error!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};<br></p><p>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA a1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a1.SetData(10, 20);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p></blockquote><br/><br/>tag : <a href="/tag/const" rel="tag">const</a>,&nbsp;<a href="/tag/static" rel="tag">static</a>,&nbsp;<a href="/tag/explicit" rel="tag">explicit</a>			 ]]> 
		</description>
		<category>C플러스플러스</category>
		<category>const</category>
		<category>static</category>
		<category>explicit</category>

		<comments>http://zzang2k.egloos.com/1650876#comments</comments>
		<pubDate>Thu, 15 Oct 2009 04:37:20 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 5장 ]]> </title>
		<link>http://zzang2k.egloos.com/1650261</link>
		<guid>http://zzang2k.egloos.com/1650261</guid>
		<description>
			<![CDATA[ 
  <p>아아아<br><br><span style="FONT-SIZE: 130%">열혈강의 C++ 5장</span><br><br><br><strong>1. 복사 생성자의 의미</strong><br></p><blockquote><blockquote>AAA a1 = 10; <br>AAA a1(10);<br><br>위의 두 문장은 같다. 아래와 같이 묵시적으로 변환된다고 생각해라!<br><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;int val1(20);&nbsp;&nbsp;&nbsp;&nbsp;//val1&nbsp;이라는 변수를 20으로 초기화 하겠다.<br>&nbsp;&nbsp;&nbsp;&nbsp;AAA a1(10);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;..........<br>}</blockquote><br><blockquote>class AAA<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA() { }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA(int i) { }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA(const AAA&amp; a) { }&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//복사 생성자<br>};<br><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;AAA obj1;<br>&nbsp;&nbsp;&nbsp;&nbsp;AAA obj2(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;AAA obj3(obj2);<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br>복사 생성자는 자신과 동일한 타입의 객체에 대한 레퍼런스를 인자로 받는다<br>복사 생성자를 지정해주지 않으면 디폴트 복사 생성자가 삽입된다.<br><br>따라서,<br>디폴트 생성자, 디폴트 소멸자, 디폴트 복사 생성자는 컴파일러가 자동으로 삽입힌다.<br>디폴트 생성자/소멸자는 아무일도 하지 않지만,<br>디폴트 복사 생성자는 멤버 대 멤버 복사를 수행한다.</blockquote><br></blockquote><p><strong>2. 디폴트 복사 생성자</strong><br><br>사용자 정의 복사 생성자가 없을 때 자동 삽입<br>멤버 변수 대 멤버 변수의 복사를 수행<br><br>얕은 복사에 의한 메모리 참조 오류가 있다.<br>따라서 deep copy 필요<br></p><blockquote><p>#include&lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p><br>class Person<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char *phone;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int age;<br>&nbsp;&nbsp;&nbsp;&nbsp;public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person(char* _name, char* _phone, int _age);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person(const Person&amp; p) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name = new char[strlen(p.name)+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(name, p.name);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phone = new char[strlen(p.phone)+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(phone, p.phone);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age = p.age;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;~Person();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void ShowData();<br>};</p><p><br>Person::Person(char* _name, char* _phone, int _age)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name=new char[strlen(_name)+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(name, _name);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;phone=new char[strlen(_phone)+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strcpy(phone, _phone);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;age=_age;<br>}<br><br>Person::~Person()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete []name;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;delete []phone;<br>}<br>void Person::ShowData()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"name: "&lt;&lt;name&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"phone: "&lt;&lt;phone&lt;&lt;endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout&lt;&lt;"age: "&lt;&lt;age&lt;&lt;endl;<br>}</p><p>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person p1("KIM", "013-333-5555", 22);<br>&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;Person p2=p1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person p2(p1);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2.ShowData();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;p2.ShowData();<br>&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p></blockquote><p><br><strong>3. 복사 생성자 호출 형태 3가지</strong><br></p><blockquote>case1: 기존에 생성된 객체로 새로운 객체 초기화<br><br>case2: 매개변수 역시 1. 메모리 공간 할당 2. 초기화의 과정을 거친다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;하지만 초기화 과정에서 값을 직접 대입하는 게 아니라 복사 생성자를 호출하여 인자로 전달한다.<br><br>case3: AAA i(10);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AAA j = i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;일반 변수와 같이 직접 대입하지 않는다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j가 지니고 있는 생성자를 호출. 그 과정에서 i객체가 인자로 전달된다. 이 때 j의 복사생성자를 호출하게 된다.</blockquote><p><br>&nbsp;</p><br/><br/>tag : <a href="/tag/복사생성자" rel="tag">복사생성자</a>			 ]]> 
		</description>
		<category>C플러스플러스</category>
		<category>복사생성자</category>

		<comments>http://zzang2k.egloos.com/1650261#comments</comments>
		<pubDate>Wed, 14 Oct 2009 10:41:06 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 4장 ]]> </title>
		<link>http://zzang2k.egloos.com/1650219</link>
		<guid>http://zzang2k.egloos.com/1650219</guid>
		<description>
			<![CDATA[ 
  뚜둥!<br><br><span style="FONT-SIZE: 130%">열혈강의 C++ 4장<br><br><br><br></span><span style="FONT-SIZE: 100%"><strong>1. 정보 은닉<br></strong><blockquote>선언된 클래스 외부에서 직접적인 접근을 허용하지 않는 것.<br>예) private 멤버 변수를 public 멤버 함수로 접근. 값을 사전에 확인하여 내부에서만 Acceess</blockquote></span><blockquote></blockquote><br><strong>2. 캡슐화의 기본 개념</strong><br><blockquote>관련 있는 데이터와 함수를 하나로 묶는 것.<br>예) English 라는 클래스가 있고 멤버 변수가 a,b,c 가 있다고 하자<br>그렇다면 이 a,b,c 멤버 변수를 조작하는 모든 함수는 멤버 함수로 와야 한다.<br>다시 말하면 a,b,c는 내부의 함수를 통해서만 조작되어야 한다.</blockquote><br><strong>3. 생성자의 필요성</strong><br><blockquote>객체를 생성과 동시에 초기화 하기 위해서 사용된다.<br>객체는 생성과 동시에 초기화 하는 것이 좋은 구조이다.<br><br>예를 들어. 먼저 객체를 만들고, 여기에 대입할 값을 검증했을 때&nbsp; 값이 유효하지 않다면 어쨌든 객체는 남아있다.<br>하지만 미리 검증하고 생성과 동시에 초기화 한다면 항상 유효한 객체만 남아있을 것.<br><br>기존의 방법으론 생성과 동시에 초기화 할 수 없다. 왜냐하면 정보은닉 때문.<br>따라서 어떤 방법이 있을까? 바로 생성자!</blockquote><br><strong>4. 객체의&nbsp;생성 과정</strong><br><blockquote><p>생성자<br>-클래스와 이름 동일<br>-리턴타입이 없음. 리턴하지도 않는다.<br><br>#include&lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p><br>class AAA {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int i, j;<br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA(int _i, int _j)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = _i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = _j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA(int _i, int _j, int _x)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i = _i;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = _j;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;j = _x;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void showData()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; i &lt;&lt;' '&lt;&lt; j &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</p><p><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA abc(111,222);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abc.showData();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p></blockquote><br><strong>5. public 생성자, private 생성자<br></strong><blockquote>디폴트 생성자 : 생성자가 하나도 정의되지 않은 경우.<br>(모든 객체는 반드시 생성자를 가지고 있다. 직접 정의한 생성자가 없을 경우 컴파일러가 자동으로 생성자를 삽입한다.)<br><br>예) Person min("123", 180. "hohoho");&nbsp;&nbsp;&nbsp;&nbsp;//이건 가능,&nbsp;인자 3개를 갖는 생성자 호출<br>&nbsp;&nbsp;&nbsp;&nbsp; Person ho();&nbsp;&nbsp;&nbsp;&nbsp;//이건 안된다. 함수 선언 같지 않나?<br>&nbsp;&nbsp;&nbsp;&nbsp; Person ho;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//따라서 요렇게 해야 한다.&nbsp;&nbsp;&nbsp;&nbsp;void 생성자 호출<br><br>-생성자를 하나 정의해두었으면 void를 인자값을 받는 디폴트 생성자는 자동으로 붙지 않는다. 따라서 따로 하나 만들어줘야 된다.<br>-생성자도 두 개 이상 들어가도 된다. 왜냐하면 함수이기 때문에. 오버로딩 할 수 있지 않겠나?ㅋㅋ<br>-또한 디폴트 매개변수 설정도 가능하다.<br></blockquote><strong>6. 객체의 소멸</strong><br><blockquote>객체가 소멸되는 시점은 기본 자료형 변수, 구조체 변수가 소멸되는 시점과 동일하다.<br>소멸자 : -객체의 메모리 반환을 위해서 객체 소멸 시 자동으로 호출되는 함수<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-전달인자는 항상 void<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;- 클래스 이름 앞에 ~(틸트)클래스명 이 붙은 형태<br><br>객체의 생성 순서 : 메모리 할당 -&gt; 생성자 호출<br>객체의 반환 순서 : 소멸자 호출 -&gt; 메모리 반환<br></blockquote><strong>7. 객체의 배열과 생성자<br></strong><blockquote><blockquote>Point arr[5];<br>객체를 멤버로 지니는 배열이다.<br>기본적으로 void 생성자의 호출을 요구한다.<br></blockquote><p><br><br>&nbsp;</p><blockquote><p>객체 포인터 배열<br>&nbsp;Point* arr[5];</p><p>&nbsp;<br>&nbsp;for(int i=0; i&lt;5; i++)<br>&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arr[i]=new Point(i*2, i*3);&nbsp; // new에 의한 객체 동적 생성.<br>&nbsp;}<br></p></blockquote><p><br><br>this 포인터<br></p><blockquote>자기 자신의 포인터 값 리턴. 자기 참조 포인터.<br><br>class Person<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Person* GetThis() {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//당연히 Person* 타입이어야 한다. 왜냐하면 자기 자신의 주소를 리턴하기 때문에.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return this;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</blockquote><p><br>&nbsp;</p><blockquote><p>class Person<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int aaa = 100;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int bbb = 200;<br></p><p><br>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Data(int aaa, int bbb) {&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;aaa = aaa;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//this-&gt;aaa는 멤버변수&nbsp; aaa이다<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;this-&gt;bbb = bbb;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<strong>//왜냐하면&nbsp;&nbsp;this는 Person의 주소를 가지기 때문에&nbsp;당연하다. 매개변수 주소는 모른다.<br></strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void printfAll() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; aaa &lt;&lt; " " &lt;&lt; bbb &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>};</p></blockquote><p>&nbsp;</p></blockquote><br><strong>8. friend 선언</strong><br><blockquote><p>private 영역에 접근을 허용한다.<br><br>A클래스 내에서<br>&nbsp;&nbsp;&nbsp;&nbsp;firend class BBB;<br>라고 하면 클래스 BBB는 AAA의 private 영역에 접근이 가능하다.<br><br>#include &lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p><br>class counter<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int val;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;val = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void print() const {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; val &lt;&lt; endl;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend void setX(counter&amp; c, int val);<br>};</p><p><br>void setX(counter&amp; c, int val)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.val = val;<br>}</p><p><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;counter cnt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt.print();</p><p>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;setX(cnt, 2002);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cnt.print();<br><br>&nbsp;&nbsp;&nbsp;&nbsp; return 0 ;<br>}<br></p><p>클래스가 함수를 freind로 선언<br>클래스가 클래스를 friend로 선언 모두 가능<br><br>#include &lt;iostream&gt;<br>using std::cout;<br>using std::endl;</p><p><br>class AAA<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;private:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;friend class BBB;<br>};</p><p><br>class BBB<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void setData(AAA&amp; aaa, int val)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;aaa.val = val;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</p><p><br>int main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;AAA aaa;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BBB bbb;</p><p><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bbb.setData(aaa, 10);</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p><br>friend 선언은 단방향성이다. 기억할 것.<br>friend는 그다지 유용하지 않다.(연산자 오버로딩에는 유용)<br></blockquote><br><br/><br/>tag : <a href="/tag/정보은닉" rel="tag">정보은닉</a>,&nbsp;<a href="/tag/캡슐화" rel="tag">캡슐화</a>,&nbsp;<a href="/tag/생성자" rel="tag">생성자</a>,&nbsp;<a href="/tag/객체" rel="tag">객체</a>,&nbsp;<a href="/tag/friend" rel="tag">friend</a>			 ]]> 
		</description>
		<category>C플러스플러스</category>
		<category>정보은닉</category>
		<category>캡슐화</category>
		<category>생성자</category>
		<category>객체</category>
		<category>friend</category>

		<comments>http://zzang2k.egloos.com/1650219#comments</comments>
		<pubDate>Wed, 14 Oct 2009 09:46:06 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 세 번째 ]]> </title>
		<link>http://zzang2k.egloos.com/1650009</link>
		<guid>http://zzang2k.egloos.com/1650009</guid>
		<description>
			<![CDATA[ 
  또리링<br><br><span style="FONT-SIZE: 130%">열혈강의 C++ 3장</span><br><br><br><br>그 전에..<br><strong>&lt;함수포인터&gt;</strong><br><blockquote><p>함수를 가리키는 포인터다.<br><br>#include &lt;iostream&gt;<br>using namespace std;</p><p><br>void dog()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "i'm dog" &lt;&lt; endl;<br>}</p><p><br>void cat()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "i'm cat" &lt;&lt; endl;<br>}</p><p><br>int main(void)<br>{</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void (*pDog)();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void (*pCat)();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDog = &amp;dog;&nbsp;&nbsp;&nbsp;&nbsp;//pDog 에는 dog()의 시작 주소가 들어간다<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pCat = &amp;cat;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*pDog)();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//마치 함수의 이름인 것 처럼 사용할 수 있다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(*pCat)();</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}<br><br>함수원형 : int MyFunc(int a, char* p);&nbsp; //함수 원형이 이렇다면<br>함수포인터 : int (*ptr)(int, char*);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//요렇게 선언하면 되겠지</p></blockquote><br><br><br><strong>1. 구조체와 클래스</strong><br><blockquote>기본 자료형과 사용자 자료형의 사용법 일치<br>C에서는 struct 키워드를 붙여야 했다. 물론 typedef 가 있긴 하지..<br>하지만 C++에서는 기본 자료형이나 사용자 자료형 모두 하나의 자료형으로 인식한다.(구분짓지 않는다. 이걸 c++의 철학이라고 하나..ㅋ)<br></blockquote><strong>2. 함수를 넣으면 좋은 구조체</strong><br><blockquote><p>#include &lt;iostream&gt;<br>using namespace std;</p><p><br>struct Account {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char accID[20];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char secID[20];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;char name[20];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int balance;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void Deposit(int money) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;balance+=money;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void Withdraw(int money) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;balance-=money;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>};</p><p><br>int main(void)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Account zzang2k={"1234", "9999", "zzang2k", 10000};</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zzang2k.Deposit(1000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//함수도 똑같이 접근자를 통해서 호출<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "잔액 : " &lt;&lt; zzang2k.balance &lt;&lt; endl;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zzang2k.Withdraw(6000);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "잔액 : " &lt;&lt; zzang2k.balance &lt;&lt; endl;</p><p>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return 0;<br>}</p><br>C에서는 구조체 안에 함수를 넣을 수 없다.<br>하지만 C++ 에서는 가능!</blockquote><br><strong>3. 구조체가 아니라 클래스<br></strong><blockquote>왜 클래스라는 개념이 등장했나.<br>특정 객체의 함수를 호출한다 : 메시지를 전달한다.&nbsp;<br>특정 객체 안에 있는 함수를 호출하는 행위를 Message Passing 이라 한다. 무엇을 알린다 라는 개념.<br></blockquote><strong>4. 클래스와 객체<br><br></strong><blockquote>현실 세계의 사물 --&gt; 추상화 --&gt; 클래스화 --&gt; 인스턴트화<br>따라서 클래스가 변수와 함수로 이루어져 있는 이유를 대충 알겄지?<br><br></blockquote><strong>5. 클래스의 내부 접근과 외부 접근<br></strong><blockquote>내부접근 : 같은 클래스 내에서 접근<br>외부접근 : 다른 함수 또는 클래스에서 접근<br><br>private : 클래스 내부 접근만 허용<br>public : 어떤 경우이던 접근을 허용한다. 내부접근/외부접근을 모두 허용한다.<br>protected : 상속이라는 문법적 요소와 맞물려짐. 추후 설명.<br></blockquote><strong>6. 기타</strong><br><blockquote><p>-class는 접근제어를 명시해주지 않으면 디폴트 private: 이다.<br><br>-C++에서의 struct 에도 접근제어자를 선언할 수 있다. C++에서 struct는 class라고 생각해라.<br>단, struct로 선언하면 접근제어는 디폴트 public 이다.<br><br>-멤버 함수는 외부에 정의해라. 그래야 클래스를 보기에 편하다.<br><br>const int OPEN = 1;<br>const int CLOSE = 0;</p><p><br>class Door {</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int state;</p><p>public:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void open();&nbsp;&nbsp;&nbsp;&nbsp;//문을 오픈한다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void close();&nbsp;&nbsp;&nbsp;&nbsp;//문을 닫는다.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;void showState();&nbsp;&nbsp;&nbsp;&nbsp;//문의 상태를 보여준다.</p><p>};<br></p><p>void Door::open() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state = OPEN;<br>}<br></p><p>void Door::close() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state = CLOSE;<br>}<br></p><p>void Door::showState() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "현재 문의 상태 : ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; ((state==OPEN) ? "OPEN" : "CLOSE") &lt;&lt; endl;<br>}<br></p><br>-멤버 함수의 인-라인화<br>클래스내에 멤버 함수를 정의해 놓으면 자동으로 in-line화 된다.<br>클래스 밖으로 함수의 선언과 정의를 분리시키면 자동으로 in-line이 안된다.<br>따라서 외부의 정의에 inline 키워드를 써야한다.<br><br>C에서는 #define<br>C++에서는 inline 키워드<br><br>//위와 같은 의미이다.<br><p>inline void Door::open() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state = OPEN;<br>}<br></p><p>inline void Door::close() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;state = CLOSE;<br>}<br></p><p>inline void Door::showState() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; "현재 문의 상태 : ";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cout &lt;&lt; ((state==OPEN) ? "OPEN" : "CLOSE") &lt;&lt; endl;<br>}</p></blockquote><br/><br/>tag : <a href="/tag/함수포인터" rel="tag">함수포인터</a>,&nbsp;<a href="/tag/구조체" rel="tag">구조체</a>,&nbsp;<a href="/tag/클래스" rel="tag">클래스</a>			 ]]> 
		</description>
		<category>C플러스플러스</category>
		<category>함수포인터</category>
		<category>구조체</category>
		<category>클래스</category>

		<comments>http://zzang2k.egloos.com/1650009#comments</comments>
		<pubDate>Wed, 14 Oct 2009 04:24:45 GMT</pubDate>
		<dc:creator>짱투케이</dc:creator>
	</item>
</channel>
</rss>
