<?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://chopisal.egloos.com</link>
	<description>노는게 공부하는거고
공부하는게 노는것처럼</description>
	<language>ko</language>
	<pubDate>Sun, 22 Mar 2009 18:01:06 GMT</pubDate>
	<generator>Egloos</generator>
	<image>
		<title>프로그래머가 되고픈 대학생</title>
		<url>http://pds10.egloos.com/logo/200811/05/96/f0066496.gif</url>
		<link>http://chopisal.egloos.com</link>
		<width>80</width>
		<height>94</height>
		<description>노는게 공부하는거고
공부하는게 노는것처럼</description>
	</image>
  	<item>
		<title><![CDATA[ 인터페이스 (IEnumerable) ]]> </title>
		<link>http://chopisal.egloos.com/1418456</link>
		<guid>http://chopisal.egloos.com/1418456</guid>
		<description>
			<![CDATA[ 
  {<br>&nbsp;&nbsp;&nbsp;&nbsp;private Car[] carArray;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public Cars()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carArray = new Car[4];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carArray[0] = new Car("FeeFee",&nbsp;200, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carArray[1] = new Car("Fee",&nbsp;200, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carArray[2] = new Car("Zippy",&nbsp;200, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;carArray[3] = new Car("Fred",&nbsp;200, 0);<br><br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>main()<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;foreach (Car c in carLot)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Name : {0} ", c.PetName);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Max&nbsp;Speed : {0}", c.MaxSpeed);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br>그러나 이 코드를 실행하려고 하면 , Cars 클래스에 GetEnumerator() 메소드가 구현되지<br>않았다는 컴파일 에러가 발생할 것이다. 이 메소드는 System.Collections 네임스페이스에 숨어 <br>있는 IEnumerable 인터페이스에 정의되어 있다.<br><br>// foreach 구문을 이용해서 하위 형식을 얻으려면, 컨테이너가 반드시 IEnumerable 을 구현해야 한다.<br><br>public class Cars : IEnumerable // IEnumerator 는 필요하지 않다!<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;// 이 클래스에는 자동차의 배열이 들어 있다.<br><br>&nbsp;&nbsp;&nbsp;&nbsp;public IEnumerator GetEnumerator()<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// 이제는 내부 배열로부터 IEnumerator 를 반환한다!<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return carArray.GetEnumerator();<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br><br><br>			 ]]> 
		</description>

		<comments>http://chopisal.egloos.com/1418456#comments</comments>
		<pubDate>Sun, 22 Mar 2009 18:01:06 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 인터페이스  ]]> </title>
		<link>http://chopisal.egloos.com/1418297</link>
		<guid>http://chopisal.egloos.com/1418297</guid>
		<description>
			<![CDATA[ 
  <p><br><br>인터페이스의 멤버는 접근 한정자를 취하지 않는다. (인터페이스의 메소드는, 지원하는 형식에서<br>이 멤버들을 구현할 수 있어야 하므로, 암시적으로 public 이다.).<br><br>// 인터페이스는 기본 클래스를 갖지 않는다!<br>public interface IPointy<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;byte GetNumberOfPoints();&nbsp; // 암시적으로 public이고 abstract 이다.<br>}<br><br>인터페이스를 지원해서 C#클래스의 기능을 확장하려면, 형식 정의 부분에 쉼표로 구분해서 해당<br>인터페이스의 목록을 적으면 된다. 주의할 점은, 기본 클래스가 있는 경우 기본 클래스 이름 먼저 와야<br>한다는 것이다. <br><br>인터페이스 구현은 '전부 또는 무 ' 명제를 따른다. 만약 10개의 멤버가 정의된 인터페이스를 구현하는<br>클래스가 있다면 이 클래스에서 10 개의 추상 항목을 모두 채워야 한다. <br><br>NOTE 추상 클래스가 다른 인터페이스를 지원하는 경우 해당 인터페이스의 멤버를 명시적으로 abstract로<br>정의하기만 하면 이 인터페이스의 멤버를 구현하지 않은 채로 두어도 무방하다. <br><br><br></p>			 ]]> 
		</description>
		<category>c#</category>

		<comments>http://chopisal.egloos.com/1418297#comments</comments>
		<pubDate>Sun, 22 Mar 2009 15:41:40 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ C# 언어 기초 2 ]]> </title>
		<link>http://chopisal.egloos.com/1418123</link>
		<guid>http://chopisal.egloos.com/1418123</guid>
		<description>
			<![CDATA[ 
  <p><br><strong>값 형식과 참조 형식 이해하기</strong><br><br>// 구조체는 값 형식이다.<br>struct FOO<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public int x,y;<br>}<br><br>// 기본 생성자를 이용해서 생성할 때는 'new'키워드가 생략 될수 있지만, 필드들은 모두 사용되기 전에 할당되어야 한다.<br>FOO f1 = new FOO();<br>f1.x = 100;<br>f1.y = 100;<br><br>FOO f2 = f1;<br>// f2.x 를 변경해도 f1.x는 변경되지 않는다.<br>f2.x = 900;<br><br>이와 반대로, 참조 형식(클래스)은 가비지 컬렉션의 대상인 힙에 할당된다. 힙에 할당된 참조 형식은<br>가비지 컬렉터에 의해 제거되기 전까지는 계속 메모리에 남아 있게 된다. 기본적으로, 참조 형식을 <br>할당하면 메모리에 있는 동일한 객체에 대한 새로운 참조자가 만들어 진다.</p><p>&nbsp;</p><p><br>class FOO<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;public int x, y;<br>}<br>이렇게 바꾸어서 테스트해보면 이제 관리 힙에 있는 동일한 객체를 지시하는 두 개의 참조자가 <br>생겨났기 때문이다. 그래서 f2 참조자의 x값을 변경하면 f1.x도 같은 값을 나타내게 된다. <br><br><br><br><strong>참조 형식을 포함하는 값 형식&nbsp;&nbsp;<br></strong><br>InnerRef (내부에 참조 형식을 포함하는 값 형식)<br>InnerRef 변수 하나를 다른 InnerRef 변수에 할당하면 어떤 일이 벌어 질까?<br>내부 참조 형식은 새로운 InnerRef 변수로 완전히 복사되지 않는다.<br>구조체는 서로 다른 두개가 되지만, 참조자들은 메모리에 있는 동일한 객체를 지시하게 된다.<br><br><br><br><strong>마스터 노드 : System.Object<br><br></strong>C#에서는 모든 데이터 형식(값 기반이든 참조 기반이든)은 결국 공용 기본 클래스인 System.Object로<br>부터 파생한다. Object가 기본 클래스로 명시되어 있지 않은 것을 볼 수 있는데, 다른 기본 클래스를 <br>명시하지 않으면 기본 클래스가 Object 인 것으로 간주된다.<br><br>// 객체 참조자 비교...<br>ObjTest c1 = new ObjTest();<br><br>// c1 에 대한 참조자들을 만든다.<br>ObjTest c2 = c1;<br>object o = c2;<br><br>//세 인스턴스가 모두 메모리상의 동일한 객체를 가리키고 있나?<br>if(o.Equals(c1) &amp;&amp; c2.Equals(o))<br>&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Same instance");<br><br>Equals()는 기본적으로 값 의미구조가 아닌 참조 의미구조로 두 객체의 변수를 비교하게 되어 있다.<br>c1, c2 그리고 o 가 모두 메모리상의 동일한 객체를 가리키기 때문에, 같은 비교 결과는 참이다.<br><br><br><br><br><strong>System.Object 의 기본 기능 재정의 하기<br></strong><br>System.Object에 미리 준비된 기능으로 충분하긴 하지만, 이 동작들을 상속한 메소드를 재정의하는 것이 일반적이다.<br>파생 클래스에서 이 가상 멤버들을 임의대로 구현하고 싶으면 C#의 'override' 키워드를 사용하면 된다.<br><br><strong>System.Object의 정적 멤버들<br></strong><br>값 기반 또는 참조 기반으로 동등 비교를 할 수 있는 두 개의 정적 멤버가 정의되어 있다.<br><br>//System.Object의 정적 멤버.<br>Person p3 = new Person("Sally", "Jones", "333", 4);<br>Person p4 = new Person("Sally", "Jones", "333", 4);<br>// p3와 p4의 상태가 동일한가? 그러타!<br>Console.WriteLine("P3 and P4 have same state : {0}", object.Equals(p3, p4));<br><br>// 이 둘은 메모리상의 동일한 객체인가 ? 아니다!<br>Console.WriteLine("P3 and P4 are pointing to same object : {0} ",<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;object.ReferenceEquals(p3, p4));<br><br>.NET 기본 클래스 라이브러리에 정의되어 있는 모든 클래스, 구조체, 열거형 그리고 델리게이트는 항상<br>System.Object의 public 멤버를 지원한다. 그러나 <u>인터페이스는 System.Object 또는 다른 어떤 기본 클래스로부터<br>파생되지 않는다!!!<br><br><br><br><br><br></u><strong>문자열 데이터로부터 값 구문분석하기<br><br></strong>.NET 데이터 형식은 이 형식을 표현하는&nbsp;문자열로부터 본래 형식의 변수를 생성(즉, 구문분석 parsing)할 수 있다.<br>입력한 데이터를 숫자 값으로 변환하고 싶을 때 특히 유용하게 사용될 수 있다.<br><br>double MyDbl = double.Parse("99.884");<br>int myInt = int.Parse("8");<br>char myChar = char.Parse("w");<br><br><br><strong>값 형식과 참조 형식 간의 변환 : 박싱(boxing)과 언박싱(unboxing)<br></strong><br>.NET 에서는 형식을 크게 두 가지 범주(값 기반과 참조 기반)로 나뉘는데, 경우에 따라 한 범주에 속하는<br>변수를 다른 범주의 변수로 나타낼 필요가 있ㅇ르 수 있다. C#에는 값 형식과 참조 형식 간의 변환을<br>간단하게 할 수 있는 메커니즘이 있는데, 이를 박싱(boxing)이라고 부른다. </p><p><br>// 값 데이터 포인트를 만든다.<br>short s = 25;<br><br>// 값을 객체 참조로 박스한다.<br>object objShort = s;<br><br>박싱은 명시적으로 값 형식을 이에 상응하는 참조 형식으로 변환하는 과정이라고 정의할 수 있다.<br>언박싱은 객체 참조에 들어 있는 ㄱ밧을 이에 상응하는 값 형식으로 변환해 스택에 올려놓는 과정을 일컫는 용어이다.<br><br>// 참조를 이에 상응하는 short로 언박스한다.<br>short anotherShort = (short)objShort;<br><br>알맞은 데이터 형식으로 언박스한느 것은 상당히 주의를 요하는 작업이다.</p><p>&nbsp;</p><p>&nbsp;</p>			 ]]> 
		</description>
		<category>c#</category>

		<comments>http://chopisal.egloos.com/1418123#comments</comments>
		<pubDate>Sun, 22 Mar 2009 14:11:03 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ c# 언어 기초 ]]> </title>
		<link>http://chopisal.egloos.com/1417899</link>
		<guid>http://chopisal.egloos.com/1417899</guid>
		<description>
			<![CDATA[ 
  <p>// foreach 를 사용하면 배열의 크기를 알아낼 필요가 없다.<br><br>public static void Main(string[] args)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;foreach(string s in args)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Console.WriteLine("Arg : {0} ", s);<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>}<br><br><br><strong>객체 생성하기 : 생성자</strong><br>// 에러! 할당되지 않은 지역 변수 사용! 'new'를 사용<br><br>HelloClass c1;<br>c1.SayHi();<br><br>// 한 줄의 코드에서 새로운 객체 선언하고 생성하거나..<br>HelloClass c1 = new HelloClass();<br>// 또는 두줄<br>HelloClass c2;<br>c2 = new HelloClass();<br><br>'new'키워드는 지정된 객체에 필요한 정확한 바이트 수를 할당해서 관리 힙에 충분한<br>메모리를 확보하는 일을 담당한다.<br>앞의 코드 예에서 할당된 두 객체 (c1, c2)는 HelloClass 형식의 고유한 인스턴스를 가리킨다.<br><u>c#의 객체 변수는 사실 객체가 아니고 메모리에 있는 객체에 대한 참조자이다.<br><br><br></u><strong>c# 멤버 변수 초기화<br><br></strong>c#에서는 멤버 변수를 선언하면서 동시에 초기 값을 할당할 수 있다.(c++과 같은 다른 언어에서는 이런방식의<br>멤버 초기화가 불가능하다)<br><br>// 이 방법은 기본 값이 아닌 다른 값을 할당 하고<br>// 각 생성자에 동일한 초기화 코드를 적기 싫은 경유에 유용하다.<br>class Test<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;private int myInt = 9;<br>&nbsp;&nbsp;&nbsp;&nbsp;private string myStr = "My initial value.";<br>&nbsp;&nbsp;&nbsp;&nbsp;private HotRod viper = new HotRod(200, "Chuchy", Color.ReD);<br>&nbsp;&nbsp;&nbsp;&nbsp;...<br>}<br><br><strong>Console 클래스를 이용한 기본 입출력<br></strong></p><p>Console은 System 네임스페이스에 정의 되어 있는 형식이다. <br>System.Console의 주요 메소드는 Read(), ReadLine(), Write(), WriteLine() 등이 있는데,<br>이들은 모두 static 으로 정의되어 있다.<br><br>Write() 메소드는 텍스트를 캐리지 리턴 없이 출력 스트림으로 내보낸다.<br>Read()를 이용하면 입력 스트림으로부터 하나의 문자를 받아 올 수 있다.<br><br><br><strong>텍스트 출력 포맷 지정</strong><strong></p><p><br>{0}, {1}와 같은 토큰<br><br>//문자열 포맷하기...<br>Console.WriteLine("Int is : {0} \ nFloat is : {1} \ nYou Are : {2} ",<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;theInt, theFloat, myIO.ToString());<br><br>WriteLine()의 첫번째 매개변수는 {0}, {1},{2}와 같은 포맷 지정자가 포함된<br>포맷 문자열을 나타낸다. WriteLine()의 나머지 매개변수는 각각의 포맷 지정자에 들어갈 값들이다<br>또한 WriteLine()은 객체 배열을 포맷 지정자로 지정할 수 있도록 오버로드 되어 있다.<br><br>// 포맷 지정자를 객체 배열로 채운다.<br>object[] stuff = {"Hello", 20.9, 1, "There", "83", 99.933} ;<br>Console.WriteLine("The Stuff : {0}, {1}, {2}, {3}, {4}, {5} ", stuff);<br><br>하나의 포맷 지정자를 통해 해당 문자열 안에 반복해서 쓸 수 있다. <br>예를 들어 , "9Number9Number9"와 같은 문자열을 만들고 싶은 경우<br><br>Console.WriteLine("{0} Number{0}Number{0}", 9);<br><br><br></p></strong>			 ]]> 
		</description>
		<category>c#</category>

		<comments>http://chopisal.egloos.com/1417899#comments</comments>
		<pubDate>Sun, 22 Mar 2009 11:51:00 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ table ]]> </title>
		<link>http://chopisal.egloos.com/1363010</link>
		<guid>http://chopisal.egloos.com/1363010</guid>
		<description>
			<![CDATA[ 
  <p>CREATE TABLE member<br>(<br>&nbsp;&nbsp;&nbsp; mnum&nbsp;&nbsp; NUMBER(3)&nbsp;&nbsp;&nbsp; CONSTRAINT member_mnum_pk&nbsp;&nbsp; PRIMARY KEY,<br>&nbsp;&nbsp;&nbsp; id&nbsp;&nbsp;&nbsp; VARCHAR2(25)&nbsp; CONSTRAINT member_id_uk&nbsp;&nbsp;&nbsp;&nbsp; UNIQUE,<br>&nbsp;&nbsp;&nbsp; pw&nbsp;&nbsp;&nbsp; VARCHAR2(25)&nbsp; CONSTRAINT member_pw_nn&nbsp;&nbsp;&nbsp;&nbsp; NOT NULL,<br>&nbsp;&nbsp;&nbsp; name&nbsp; VARCHAR2(25)&nbsp; CONSTRAINT member_name_nn&nbsp;&nbsp; NOT NULL,<br>&nbsp;&nbsp;&nbsp; state NUMBER(1)&nbsp;&nbsp;&nbsp;&nbsp; CONSTRAINT member_state_ck&nbsp; CHECK(state in(0,1))<br>);</p><p><br>&nbsp;</p><p>create sequence member_no start with 1 increment by 1;<br></p><p><br>create table reservation<br>(<br>&nbsp;&nbsp;&nbsp; mnum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NUMBER(3) CONSTRAINT&nbsp; reservation_mnum_fk REFERENCES member(mnum) ON DELETE CASCADE ,<br>&nbsp;&nbsp;&nbsp; start_date&nbsp;&nbsp;&nbsp;&nbsp; date&nbsp;&nbsp;&nbsp;&nbsp; ,<br>&nbsp;&nbsp;&nbsp; end_date&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; date&nbsp;&nbsp;&nbsp; ,<br>&nbsp;&nbsp;&nbsp; tnum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number(3) CONSTRAINT&nbsp; reservation_tnum_fk REFERENCES travel(tnum) ON DELETE CASCADE<br>);</p><p>&nbsp;</p><p>drop table reservation;</p><p><br>create table member_grade<br>(<br>&nbsp;&nbsp;&nbsp; mnum&nbsp;&nbsp;&nbsp;&nbsp; number(3) ,<br>&nbsp;&nbsp;&nbsp; mpoint&nbsp;&nbsp; number(10) ,<br>&nbsp;&nbsp;&nbsp; grade&nbsp;&nbsp;&nbsp; varchar2(25)<br>);</p><p><br>alter table member_grade<br>add constraint member_grade_fk foreign key(mnum) references member(mnum);</p><p><br>-- 여행 테이블<br>create table travel<br>(<br>&nbsp;&nbsp;&nbsp; tnum&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; number(3)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; constraint travel_tnum_pk&nbsp;&nbsp; primary key, <br>&nbsp;&nbsp;&nbsp; t_name&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; varchar(25)&nbsp;&nbsp;&nbsp;&nbsp; constraint travel_t_name_nn not null ,<br>&nbsp;&nbsp;&nbsp; t_location&nbsp; varchar(25)&nbsp;&nbsp;&nbsp;&nbsp; constraint travel_t_location_nn not null,<br>&nbsp;&nbsp;&nbsp; t_price&nbsp;&nbsp;&nbsp;&nbsp; number(10)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; constraint travel_t_price_nn not null&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>);</p><p><br>-- 여행 일정 테이블<br>create table travel_plan<br>(<br>&nbsp;&nbsp;&nbsp; tnum&nbsp;&nbsp;&nbsp; number(3) constraint travel_plan_tnum_fk REFERENCES travel(tnum),<br>&nbsp;&nbsp;&nbsp; tplan&nbsp;&nbsp; date<br>);</p><p><br>-- 테마 테이블<br>create table theme<br>(<br>&nbsp;&nbsp;&nbsp; thm_num number(3)&nbsp;&nbsp; constraint theme_thm_num_pk primary key,<br>&nbsp;&nbsp;&nbsp; thm_name varchar(25) <br>);</p><p><br>-- 테마의 여행지 테이블<br>create table theme_travel<br>(<br>&nbsp;&nbsp;&nbsp; thm_num number(3)&nbsp;&nbsp; constraint theme_travel_thm_num_fk references theme(thm_num),<br>&nbsp;&nbsp;&nbsp; tnum&nbsp;&nbsp;&nbsp; number(3)&nbsp;&nbsp; constraint theme_travel_tnum_fk&nbsp;&nbsp;&nbsp;&nbsp; references travel(tnum)<br>);</p><p>&nbsp;</p>			 ]]> 
		</description>

		<comments>http://chopisal.egloos.com/1363010#comments</comments>
		<pubDate>Fri, 13 Feb 2009 07:17:35 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ WPARAM  과   LPARAM ]]> </title>
		<link>http://chopisal.egloos.com/1278030</link>
		<guid>http://chopisal.egloos.com/1278030</guid>
		<description>
			<![CDATA[ 
  <p>WPARAM은 unsigned int 형이고, LPARAM은 unsigned long 형이다. </p><p>특징은, WPARAM는 주로 값들을 넘기는데 사용하고, LPARAM는 값들 뿐만 아니라 포인터를 넘겨줄 때 사용된다. </p><br><p>보통 window procedure 또는 callback function의 인자로, 먼저 나오는 wParam에 자주 쓰이는 정보를 기술하고, lParam에 추가 정보를 기술한다. 지금은 모두 32bit이므로 사용자가 정의하기 나름이다. </p><br><p>윈도우는 메시지 방식으로 프로그램이 진행된다. WPARAM나 LPARAM는 모두 MS에서 지정해 놓은 형식이다. 메시지를 보낼 때 추가로 부가적인 정보를 넣는 것이다. 구체적으로 어떤 정보인지는 아무도 모른다. 이것은 각 메시지마다 다르게 구성되어 있다는 것을 뜻한다. </p><p><br>WM_KEYDOWN을 사용한다면, MS에서 키다운 메시지에 대한 제어를 하고 싶을 땐 이것을 써라. 그리고 부가적인 정보에는 WPARAM와 LPARAM를 사용해라. WPARAM에는 Virtual Key정보를 주고 LPARAM에는 KeyData<span id="callbacknestpoongtistorycom732403" style="FLOAT: left; WIDTH: 226px; HEIGHT: 196px"><object id="poongtistorycom732403" codebase="http://fpdownload.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=8,0,0,0" height="100%" width="100%" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"><param name="_cx" value="5080"><param name="_cy" value="5080"><param name="FlashVars" value=""><param name="Movie" value="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestpoongtistorycom732403&amp;id=73&amp;callbackId=poongtistorycom732403&amp;host=http://poong.tistory.com&amp;float=left&amp;"><param name="Src" value="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestpoongtistorycom732403&amp;id=73&amp;callbackId=poongtistorycom732403&amp;host=http://poong.tistory.com&amp;float=left&amp;"><param name="WMode" value="Transparent"><param name="Play" value="0"><param name="Loop" value="-1"><param name="Quality" value="High"><param name="SAlign" value="LT"><param name="Menu" value="-1"><param name="Base" value=""><param name="AllowScriptAccess" value=""><param name="Scale" value="NoScale"><param name="DeviceFont" value="0"><param name="EmbedMovie" value="0"><param name="BGColor" value=""><param name="SWRemote" value=""><param name="MovieData" value=""><param name="SeamlessTabbing" value="1"><param name="Profile" value="0"><param name="ProfileAddress" value=""><param name="ProfilePort" value="0"><param name="AllowNetworking" value="all"><param name="AllowFullScreen" value="false">    <embed width="100%" height="100%" wmode="transparent" id="poongtistorycom732403" src="http://cfs.tistory.com/blog/plugins/CallBack/callback.swf?destDocId=callbacknestpoongtistorycom732403&id=73&callbackId=poongtistorycom732403&host=http://poong.tistory.com&float=left&" allowscriptaccess="always" menu="false" type="application/x-shockwave-flash"  ></embed></object></span>정보를 넣을 것이니 구현은 사용자가 알아서 제어를 해라. 하는 것과 같다. </p><br><p>W : word</p><p>L : long</p><br><p>typedef UINT WPARAM;<br>typedef LONG LPARAM;<br><br>현재는 둘다 32bit 값을 갖는 데이터 타입이다. 그냥 unsigned int, long 이라 해도 상관은 없겠지만, 굳이 이름을 WPARAM, LPARAM이라 한&nbsp;것은 예전 16bit OS 시절에 이름 붙인 것이 이어져 온 것이다. 당시는 WPARAM은 word 형 파라미터, LPARAM은 long 형 파라미터라는 뜻이어서, (여기서 word형은 2바이트, 참고로 dword(double word)형은 4바이트, byte형은 말그대로 1바이트) 그 때도 위처럼 typedef되었었다. 그런데 32bit OS로 오면서 int형이 4바이트가 되었다. 그런데 typedef은 그대로 두다보니 현재 WPARAM는 이름과는 다르게 4바이트를 갖는 형이되었다. 그러니까 지금은 WPARAM이나 LPARAM이나 4바이트를 갖는 데이터 타입이다. 참고로 windef.h를 보면 여러가지 데이터 타입이 typedef되어 있는 걸&nbsp;볼 수 있다.</p>			 ]]> 
		</description>

		<comments>http://chopisal.egloos.com/1278030#comments</comments>
		<pubDate>Tue, 30 Dec 2008 02:15:45 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ C++ 만든 스타크래프트 ]]> </title>
		<link>http://chopisal.egloos.com/1059824</link>
		<guid>http://chopisal.egloos.com/1059824</guid>
		<description>
			<![CDATA[ 
  <p>도스 콘솔창에서 하는 스타크래프트이다<br>허접하지만 C++ 배우고 조별프로젝트로 일주일동안 만들어 본것이다.<br><br><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds10.egloos.com/pds/200811/06/96/f0066496_4911c0a60402e.jpg" width="500" height="324.587706147" onclick="Control.Modal.openDialog(this, event, 'http://pds10.egloos.com/pds/200811/06/96/f0066496_4911c0a60402e.jpg');" /></div></p><br>첫 화면<br>우리조는 프로토스 종족을 만들었다.<br><br><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds10.egloos.com/pds/200811/06/96/f0066496_4911c0f0484dc.jpg" width="500" height="324.587706147" onclick="Control.Modal.openDialog(this, event, 'http://pds10.egloos.com/pds/200811/06/96/f0066496_4911c0f0484dc.jpg');" /></div><br>최대한 비슷하게 만들어 볼려고... 개 노가다였다.<br><br><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds11.egloos.com/pds/200811/06/96/f0066496_4911c133cc039.jpg" width="500" height="324.587706147" onclick="Control.Modal.openDialog(this, event, 'http://pds11.egloos.com/pds/200811/06/96/f0066496_4911c133cc039.jpg');" /></div><br>게임하는 화면<br>여기서 건물도 짓고, 유닛도 생산하고, 업그레이드도 한다.<br><br><br><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds12.egloos.com/pds/200811/06/96/f0066496_4911c1f72928e.jpg" width="500" height="324.587706147" onclick="Control.Modal.openDialog(this, event, 'http://pds12.egloos.com/pds/200811/06/96/f0066496_4911c1f72928e.jpg');" /></div><br><br><br><div style="text-align:center"><img class="image_mid" border="0" onmouseover="this.style.cursor='pointer'" alt="" src="http://pds10.egloos.com/pds/200811/06/96/f0066496_4911c210b1da6.jpg" width="500" height="324.587706147" onclick="Control.Modal.openDialog(this, event, 'http://pds10.egloos.com/pds/200811/06/96/f0066496_4911c210b1da6.jpg');" /></div><br>게임은 턴방식이고<br>5턴째에 컴퓨터가 쳐들어 오게 했다.<br><br>여기까지 우리조가 만든것이다.<br><br><br>참고로 실행할려면 OpenCV를 설치해야 한다.<br><br><br><br><a href="http://pds12.egloos.com/pds/200811/06/96/star.zip">star.zip</a><br><br>			 ]]> 
		</description>
		<category>C / C++ / 자료구조</category>

		<comments>http://chopisal.egloos.com/1059824#comments</comments>
		<pubDate>Wed, 05 Nov 2008 16:00:42 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 제 8 장 대화상자  ]]> </title>
		<link>http://chopisal.egloos.com/1022684</link>
		<guid>http://chopisal.egloos.com/1022684</guid>
		<description>
			<![CDATA[ 
  <p><strong>&nbsp; 대화 상자<br><br></strong>&nbsp; 대화상자는 동작 방식에 따라 크게 모달형과 모델리스형으로 나뉘어 진다. 모달형은 대화상자를 대화상자를 닫기 전에 다른 윈도우로 전환할 수 없으며 반드시 확인(또는 OK) 버튼이나 취소버튼을 눌러 대화상자를 닫아야 다른 윈도우로 전환할 수 있다. Open대화상자가 대표적인 모달 대화상자의 예이다.<br></p><p>&nbsp; 모델리스 형은 대화상자를 열어 놓은 채로 다른 윈도우로 전환할 수 있는 대화상자이다.&nbsp; 예를 찾는다면 워드 프로그램의 찾기 대화상자를 들 수 있다. <br></p><p>---------------------------------------------------------------------</p><p><br>&nbsp; 대화 상자를 만들기 위해서는 기본적으로 다음 두가지가 있어야 한다. <br></p><p>&nbsp; <strong>대화상자 템플릿</strong> : 대화상자의 모양과 대화상자 내의 컨트롤 배치 상태가 저장되는 이진 정보이며 리소스로 작성된다. 개발자 스튜디오에 별도의 대화상자 편집기가 제공되므로 어렵지 않게 디자인할 수 있다.<br></p><p>&nbsp; <strong>대화상자 프로시져</strong> : 윈도우 프로시져가 윈도우에서 발생하는 메시지를 처리하는 것과 마찬가지로 대화상자 프로시저는 대화상자에서 발생하는 메시지를 처리한다. </p><p><br>&nbsp; 모든 대화상자는 이 두 가지가 있어야만 만들 수 있다. 대화상자 템플릿은 모양을 정의하며 대화상자 프로시저는 동작을 정의한다. </p><p>&nbsp;</p><p>---------------------------------------------------------------------</p><p><br>&nbsp; 대화상자를 호출할 때는 DialogBox 함수를 사용하며 이 함수는 대화상자의 출력, 운영 및 종료까지 대화상자에 관한 모든 처리를 다 책임진다.<br><br><strong>int DialogBox(HINSTANCE hInstance, LPCTSTR lpTemplate, HWND hWndParent, DLGPROC lpDialogFunc);</strong></p><p><strong></strong>&nbsp;</p><p>&nbsp; 첫 번째 인수는 대화상자 리소스를 가진 인스턴스의 핸들이다.<br>&nbsp; 두 번째 인수는 대화상자 템플릿의 리소스 ID 이다.<br>&nbsp; 세 번째 인수는 대화상자를 소유할 부모 윈도우이다.<br>&nbsp; 네 번째 인수는 대화상자 프로시저의 이름이다. </p>			 ]]> 
		</description>
		<category>win API</category>

		<comments>http://chopisal.egloos.com/1022684#comments</comments>
		<pubDate>Tue, 28 Oct 2008 13:56:24 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 제 7 장 컨트롤 (체크박스) ]]> </title>
		<link>http://chopisal.egloos.com/1018112</link>
		<guid>http://chopisal.egloos.com/1018112</guid>
		<description>
			<![CDATA[ 
  <p>&nbsp;&nbsp; <strong>컨트롤의 메시지<br></strong></p><p>&nbsp; 컨트롤은 자신에게 어떤 변화가 있을 때마다 부모 윈도우로 메시지를 보내며 이 메시지를<br>통지 메시지라고 부른다. 예를 들어 체크 박스의 경우 사용자가 마우스로 클릭할 때마다 부모<br>윈도우로 BN_CLICKED 메시지를 보낸다. 부모 윈도우가 체크 박스의 현재 상태를 알아보거나<br>상태를 바꾸고자 할 때도 차일드 윈도우로 메시지를 보낸다. 통지 메시지는 차일드가 부모로 보내는<br>보고 메시지이고 그냥 메시지는 부모가 차일드에게 어떤 지시를 내리기 위해 보내는 명령이다.<br></p><p><strong>BM_GETCHECK</strong>&nbsp; 체크 박스가 현재 체크되어 있는 상태인지를 조사하며 wParam, lParam은 사용하지&nbsp;않는다. 체크 상태는 리턴값으로 돌려진다.<br><br><strong>BM_SETCHECK</strong>&nbsp; 체크 박스의 체크 상태를 변경하며 wParam 에 변경할 체크 상태를 지정한다. <br></p><p><strong>BM_GETCHECK</strong> &nbsp;에 의해 리턴되는 값, 또는 BM_SETCHECK에 의해 설정되는 체크 박스의 상태는&nbsp;다음 세가지가 있다.<br><br></p><p><strong>BST_UNCHECKED</strong>&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;0&nbsp; 현재 체크되어 있지 않다.<br><strong>BST_CHECKED</strong>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;1&nbsp; 현재 체크되어 있다.<br><strong>BST_INDETERMINATE</strong>&nbsp;&nbsp; 2&nbsp; 체크도 아니고 안 체크도 아닌 상태</p><p><br>case WM_COMMAND:<br>&nbsp;&nbsp;&nbsp;&nbsp;switch(LOWORD(wParam))<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;case 0:<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SendMessage(c1, BM_GETCHECK, 0,0) == BST_UNCHECKED)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(c1, BM_SETCHECK, BST_CHECKED, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bEllipse = TRUE;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SendMessage(c1, BM_SETCHECK, BST_UNCHECKED, 0);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bEllipse = FALSE;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InvalidateRect(hWnd, NULL, TRUE);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br></p><p>부모 윈도우는 먼저 BM_GETCHECK 메시지를 c1체크 박스로 보내 현재 체크 박스의 상태를 조사한다.<br>그리고 그 값이 BST_UNCHECKED이면, 즉 현재 체크되어 있지 않으면 BM_SETCHECK 메시지를 보내<br>체크 박스에 체크 표시를 하도록 명령한다. 이 때 wParam으로 체크 표시를 하라는 의미의 <br>BST_CHECKED가 전달되었다.&nbsp; 반대로 만약 BST_UNCHECKED가 아니면, 즉 현재 체크되어 있으면<br>체크 표시를 해제하라는 메시지를 보낸다. </p><p>&nbsp; 또한 조사된 체크 박스의 상태에 따라 bEllipse 변수값을 TRUE나 FALSE로 변경하며 InvalidateRect<br>함수를 호출하여 WM_PAINT 메시지를 발생시키는데 WM_PAINT메시지에서는 bEllipse변수의 값에 따라<br>사각형이나 타원을 그린다. </p>			 ]]> 
		</description>
		<category>win API</category>

		<comments>http://chopisal.egloos.com/1018112#comments</comments>
		<pubDate>Mon, 27 Oct 2008 13:47:11 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
	<item>
		<title><![CDATA[ 제 7 장  컨트롤 (버튼) ]]> </title>
		<link>http://chopisal.egloos.com/1014137</link>
		<guid>http://chopisal.egloos.com/1014137</guid>
		<description>
			<![CDATA[ 
  <p><strong>&nbsp; 버튼 만들기<br></strong></p><p>컨트롤은 윈도우이기는 하지만 홀로 사용될 수 없으며 반드시 부모 윈도우의 차일드로 <br>존재해야 한다. 차일드 컨트롤은 보통 부모 윈도우가 만들어질 때 즉, WM_CREATE 메시지가<br>발생했을 때 만든다. 컨트롤도 하나의 윈도우 이므로 CreateWindow 함수를 호출<br></p><p><strong>CreateWindow(TEXT("button"), TEXT("Click Me"), WS_CHILD | WS_VISIBLE |<br>&nbsp;BS_PUSHBUTTON, 20, 20, 100, 25, hWnd, (HMENU)0, g_hInst, NULL);<br></strong></p><p>&nbsp; CreateWindow 함수의 첫 번재 인수는 만들고자 하는 윈도우의 윈도우 클래스이다. <br>컨트롤은 운영체제에 의해 윈도우 클래스가 미리 등록되어 있으므로 별도로 등록할 필요없이<br>이 인수에 만들고자 하는 컨트롤의 윈도우 클래스명을 적어주면 된다. <br></p><p>&nbsp; 두번째 인수는 윈도우의 타이틀 바에 나타날 윈도우의 제목이되 컨트롤에 따라 캡션이<br>나타날 위치가 달라진다. 버튼은 버튼 위에 캡션이 나타난다. <br></p><p>&nbsp; 세번째 인수는 윈도우의 속성값이다. 컨트롤은 차일드 윈도우이므로 WS_CHILD 스타일은<br>반드시 주어야 한다. 또한 WS_VISIBLE 스타일을 주어야 ShowWindow 함수를 호출하지 않아도<br>컨트롤이 화면에 나타난다. 컨트롤의 경우 이 두 스타일값은 거의 예외없이 지정하는것이 정석이다.<br>그 외 버튼의 경우는 여러 스타일을 사용하여 버튼의 종류를 지정한다. <br>버튼의 스타일 값은 BS_접두어로 시작된다. <br></p><p>&nbsp; 네번째부터 7번째 인수까지는 윈도우의 위치와 크기를 지정한다. 이 예제의 경우 부모 윈도우의<br>작업영역 좌상단에서 (20,20)에 버튼이 위치하며 폭은 100, 높이는 25픽셀이다. <br></p><p>&nbsp; 8번째 인수는 컨트롤의 부모 윈도우를 지정한다. 컨트롤은 차일드이므로 반드시 부모 윈도우가<br>있어야 한다. 예제에서는 메인 윈도우의 핸들인 hWnd를 적어줌으로써 부모 윈도우를 지정했다.<br>무슨 일이 생기면 hWnd에게 통지 메시지를 보내고 또한 hWnd가 파괴될 때 같이 파괴된다.<br></p><p>&nbsp; 9번째 인수는 윈도우에서 사용할 메뉴의 핸들이다. 단 차일드 컨트롤은 메뉴를 가지지 않으므로<br>이 인수를 컨트롤의 ID지정 용도로 사용한다. <br></p><p>&nbsp; 10번재 인수는 이 윈도우를 만드는 인스턴스의 핸들인데 WinMain의 첫번째 인수로 전달받은<br>hInstance의 사본인 g_hInst를 넘겨주면 된다.<br></p><p>&nbsp; 11번째 인수는 사용자 정의 데이터이며 MDI에서 사용하는 구조체인데 일단 무시하고<br>NULL로 지정하면 된다. </p><p><br>-----------------------------------------------------------------<br></p><p>&nbsp;<strong>&nbsp; 부모와의 통신<br></strong></p><p>&nbsp; 버튼이 눌러질 경우의 처리를 해보자. 버튼을 클릭했을 경우 부모 윈도우로 통지 메시지를<br>보내 어떤 사건이 발생했는지를 알린다. 부모 윈도우는 차일드 컨트롤이 보낸 통지 메시지를<br>받아 적절한 처리를 해야 한다. 버튼을 클릭할 경우 WM_COMMAND 메시지를 부모 윈도우에게<br>보내며 이때 전달되는 정보는 다음과 같다.</p><p><br><br>HIWORD(wParam)&nbsp;&nbsp;&nbsp; 통지 코드<br>LOWORD(wParam)&nbsp; &nbsp;컨트롤의 ID<br>lParam&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp; 메시지를 보낸 차일드 윈도우의 윈도우 핸들</p><p><br><br>&nbsp; 컨트롤의 ID는 Createwindow의 아홉 번재 인수에서 지정한 정수값이다. 어떤 컨트롤이 <br>통지 메시지를 보냈는지를 알려준다. 통지 코드는 차일드 컨트롤이 왜 메시지를 보냈는가를<br>나타내는 값이다. BN_CLICKED 이 값은 특별히 검사할 필요가 없지만 통지 코드가 여러개인 <br>컨트롤은 이 값을 검사해 보아야 한다. <br></p><p>&nbsp; 부모 윈도우는 WM_COMMAND 에서 LOWORD(wParam)값을 조사하여 어떤 컨트롤이 눌러졌는지에 <br>따라 적절한 처리를 한다. <br></p><p>&nbsp; WM_COMMAND 메시지는 컨트롤의 통지 메시지뿐만 아니라 메뉴 항목, 액셀러레이터 등의 <br>명령을 처리하는 중요한 일을 한다. 이때 컨트롤의 ID, 메뉴 ID, 액셀러레이터 ID 등은<br>모두 LOWORD(wParam)으로 전달되므로 이 세 가지 명령들끼리는 0 ~ 65535 까지의 범위에서 <br>상호 중복되지 않는 ID를 가져야 한다. </p><p><br>&nbsp;</p>			 ]]> 
		</description>
		<category>win API</category>

		<comments>http://chopisal.egloos.com/1014137#comments</comments>
		<pubDate>Sun, 26 Oct 2008 16:20:20 GMT</pubDate>
		<dc:creator>초피쌀</dc:creator>
	</item>
</channel>
</rss>
