[출처] Windows-Apache-Tomcat-Axis-JDK를 이용한 WebService 플랫폼 구축하기|작성자 희열


1. 일단 관련 소프트웨어부터 설치를 해야한다. 설치해야할 소프트웨어는

         * jdk 최신 버전 -> www.sun.com/java 에서 download 메뉴를 들어가면 받을 수 있다.


         * apache tomcat 최신 버전 -> 현재 5.5가 최신 버전이다. tomcat.apache.org에서

               받을 수 있다.


         * apache axis 최신 버전 -> Tomcat 서버에서 실행되는 java 프로그램으로 apache를

            이용하여 web service를 제공하는 패키지 이다. ws.apache.org/axis/에서 받을 수

            있다.


         * apache ant 최신 버전 -> make와 유사한 빌드 툴이다. 있으면 편리하다.

            ant.apache.org에서 다운로드 받을 수 있다.



   1.1 Apache Tomcat은 JDK에 포함된 Java Runtime Environment(JRE)를 필요로 한다. 따라서

        먼저 JDK를 설치한다. 여기에서는 J2SE 1.5 update 7 with NetBeans를 설치하였다. 파일

        용량은 153MB이고, 설치에 필요한 하드 디스크 용량은 473MB이다. (평균 80KB/s 속도로

        다운로드 받는데 30분정도 걸렸다.)


                 jdk install directory = c:/program files/java/jdk1.5.0_07/

                 netbeans directory = c:/program files/NetBeans/


        설치가 끝나면, 내 컴퓨터 ->속성 -> 고급 -> 환경 변수에 다음의 항목을 추가한다.

                 JAVA_HOME=C:\Program Files\Java\jdk1.5.0_07

                 PATH += C:\Program Files\Java\jdk1.5.0_07\bin

                 CLASSPATH += C:\Program Files\Java\jdk1.5.0_07\lib\tools.jar


    1.2 Apache Tomcat 5.5 설치는 비교적 간단하다.


          * 먼저, Apache 사이트에서 윈도우즈용 Apache Tomcat 5.5 Binary를 다운로드 받은 후

             실행한다.


          * 설치 마법사가 수행되면, 몇 가지 선택을 요청하는데, 첫번째 설치 목록 선택에서는

             Full Option을 선택한다. 이렇게 하면 Documentation과 각종 Example이 설치되므로,

             이후 참조하기에 편리하다. 두번째로, 설치된 JRE(Java Runtime Environment)의

             디렉토리 위치를 물어오는데, jdk 1.5.0_07을 미리 설치했다면 jre 1.5.0_07이 설치된

             디렉토리가 기본 설정으로 표시된다. 이것을 그냥 선택하면 된다.

             (나의 경우 : c:/program files/java/jre 1.5.0_07/ 디렉토리를 사용하였다)


           * 그리고, Apache Tomcat의 port 번호와 관리자 ID/PASSWORD를 입력하라는 창이

              나타난다. 여기서는 포트 번호를 8080으로 설정하였다. 나머지 ID/passsword는

              알아서 설정한다.


           * 설치가 끝나면 Apache Tomcat을 수행할 지를 물어온다. 이 때 실행을 선택한다. 그리고,

              Web Browser에서 http://localhost:8080을 입력하여 Apaceh Tomcat 화면이 나오는지

              확인한다. 화면이 뜨면 제대로 설치가 된 것이다.


           * 다음의 환경 변수를 시스템에 추가한다.

                 CATALINA_HOME = C:\Program Files\Apache Software Foundation\Tomcat 5.5

                 CLASSPATH += C:\Program Files\Apache Software Foundation\Tomcat 5.5

                                              \common\lib\servlet-api.jar



  1.3. AXIS 설치하기 (설치 마법사를 사용하지 않고, 그냥 압축을 풀어서 복사한다).


         ws.apache.org/axis에서 AXIS 최신 버전을 다운로드 받는다. 여기서는 Windows 버전을

         사용하였다. AXIS는 zip으로 압축되어 있는데, 압축을 원하는 디렉토리에 푼다.

          ( C:\Program Files\Apache Software Foundation\axis-1.4\ )


         AXIS를 사용하기 위해 다음과 같이 PATH를 설정한다.

         AXIS_HOME = C:\Program Files\Apache Software Foundation\axis-1.4

         AXIS_LIB = %AXIS_HOME%\lib

         AXISCLASSPATH =%AXIS_LIB%\axis.jar;

                                  +=%AXIS_LIB%\commons-discovery-0.2.jar;

                                  +=%AXIS_LIB%\commons-logging-1.0.4.jar;

                                  +=%AXIS_LIB%\jaxrpc.jar;

                                  +=%AXIS_LIB%\saaj.jar;

                                  +=%AXIS_LIB%\log4j-1.2.8.jar;

                                   +=%AXIS_LIB%\wsdl4j.jar

                                  +=%AXIS_LIB%\xml-apis.jar;

                                  +=%AXIS_LIB%\xercesImpl.jar;

         CLASSPATH +=%AXISCLASSPATH%


         위의 AXISCLASSPATH에서 마지막 2개의 jar 파일(xml-apis.jar와 xercesImpl.jar)

         는 기본 axis 배포에 포함되어 있지 않다. 이 두 파일은 xerces.apache.org에서

         다운로드 받을 있다. Mirror에서 xerces-J-bin.2.8.0.zip을 다운로드하여 압축을

         풀면 이 두 파일을 얻을 수 있다. 해당 파일을 %AXIS_LIB% 디렉토리에 복사한다.


   1.4 AXIS와 Tomcat을 연동하기

         AXIS의 압축을 풀어놓은 디렉토리 하위에 webapps\axis가 있는데, 이것을 Tomcat

         의 webapps 디렉토리로 복사한다. 즉, %AXIS_HOME%\webapps\axis를

         %CATALINA_HOME%\webapps\로 복사한다.


         그 다음, 웹을 통해 Axis의 동작을 확인한다. 동작 확인은 웹 브라우저에서

         http://localhost:8080/axis 주소를 입력하여 AXIS 화면이 제대로 뜨는지 보면 된다.


         화면이 제대로 뜨면 "validation" 링크를 클릭한다. 그러면 happyaxis.jsp가 수행되는

         데, 이 JSP는 axis가 필요로 하는 모듈(주로 jar 파일)들을 검사하여 필요한 jar 파일

         이 없으면 경고나 에러 메시지를 출력한다. 내가 Axis를 설치하고, happyaxis를 실행

         했을 때에는 activation.jar 파일과 mail.jar(java mail), xmlsec.jar 모듈이 설치되어

         있지 않다고 메시지가 나왔다.

        

         happyaxis.jsp 출력에서 해당 jar 파일들을 어디에서 다운받는지 알 수 있으므로,

         사이트에 접속하여 파일들을 다운로드 한다. 받은 jar 파일들을 java runtime

         environment(JRE)\lib\ext 에 복사하면 문제가 해결된다.

         (복사한 후 happyaxis.jsp를 실행해도 여전히 해당 jar 파일들이 없다고 나온다.

          JRE 이전 버전들을 모두 제거하고, 컴퓨터를 재부팅하고 나서 살펴보니,

          activation.jar와 mail.jar는 인식이 되는데, xmlsec.jar는 인식이 안된다.

          다른 모듈과의 dependency 문제 때문에 발생하는 것 같은데, 원인은 아직 잘

          모르겠다. --> 누가 아는 사람들은 덧글을 달아주시면 감사하겠습니다. )

Posted by 나비:D
:

#include <iostream>
#include <list>
#include <vector>
#include <string>
#include <conio.h>

using namespace std;

typedef struct _list
{
 int    idx;
 string name;
 string telnum;
} List;


void Insert( vector<list<List> > & rhs )
{
 List tmp;
 int tn;

 cout << "고객번호 입력" << endl;
 cin >> tn;
 if(cin.fail())
 {
  cout << "잘못된 입력";
  cout << "차트0번에 입력 됩니다." << endl;
  cin.clear();
  while(!isspace(cin.get()))
   continue;
 }
 
 tmp.idx = tn%10;
 cout << "이름 입력" << endl;
 cin >> tmp.name;
 cout << "전화번호 입력" << endl;
 cin >> tmp.telnum;
 
 rhs[tmp.idx].push_back(tmp);
 cout << "press any key to continue" ;
 getche();
 system("cls");
}

void Print( vector<list<List> > tmp )
{
 for(int i=0; i<10; i++)
 {
  cout << "[" << i << "]번차트" << endl;
  list<List>::iterator ptr = tmp[i].begin();
  while( ptr != tmp[i].end() ) {
   cout << ptr->name << "\t\t";
   cout << ptr->telnum << endl;
   ptr++;
  } 
 }
 cout << "press any key to continue" ;
 getche();
 system("cls");
}

list<List>::iterator Serch( vector<list<List> > tmp )
{
 string s_vel;
 cout << "찾으실 이름을 입력하세요" << endl;
 cin >> s_vel;
 
 for(int i=0; i<10; i++)
 {
  list<List>::iterator ptr = tmp[i].begin();
  while( ptr != tmp[i].end() ) {
   if( ptr->name == s_vel ){
    cout << ptr->name << endl;
    cout << ptr->telnum << endl;
    return ptr;
   }
   ptr++;
  }
 }
 return 0;
}

void Delete( vector<list<List> > tmp )
{
 string s_vel;
 cout << "찾으실 이름을 입력하세요" << endl;
 cin >> s_vel;
 
 for(int i=0; i<10; i++)
 {
  list<List>::iterator ptr = tmp[i].begin();
  while( ptr != tmp[i].end() ) {
   if( ptr->name == s_vel ){
   
   }
   ptr++;
  }
 }
}

void main()
{
 vector<list<List> >  tmp(10);
 char ch;
 
 while (1) {
  cout << "1. 입 력" << endl;
  cout << "2. 출 력" << endl;
  cout << "3. 검 색" << endl;
  cout << "4. 삭 제" << endl;
  cout << "5. 종 료" << endl;
  cout << "메뉴선택[ ]\b\b"; cin >> ch;
  system("cls");
  switch(ch) {
  case '1': Insert( tmp ); break;
  case '2': Print( tmp );  break;
  case '3': Serch( tmp );  break;
  case '4': Delete( tmp ); break;
  case '5': exit(0);
  default : cout << "다시 입력하세요" << endl;
  }
 }
}

Posted by 나비:D
:

들어가기 전에, 


*** 왜 서비스로 등록하려 하는가?

     서버가 부팅되면서 수행해야할 내용들을 시작프로그램에 등록해 두면 되지만,

     서버의 성격상 원격데스크탑으로 접속을 하게 되는데,

     접속할때마다 시작프로그램의 배치파일이 시작이 된다. 그러면 어떻게 될까? T_T;;;

     때문에, 정상적인 서버를 운영하기 위해 사용자 로그인과 무관하게 서버가 부팅되는 시점 한번만 실행되도록 하기 위한 것이다.

*** svcinst.exe 와 srvany.exe 를 사용해서 bat 파일이나 단순 exe파일들을 서비스로 등록하면,

     "1053 오류, 서비스가 시작이나 컨트롤 요청에 적시에 반응하지 못했습니다"

      메세지와 함께 서비스 시작이 안되는 경우가 많다. 윈도우버그니 어쩌니만 하고 답은 없고.... ㅡ.ㅡ

*** 아래 내용에서 레지스트리 부분은 윈도우서비스등록수정.reg 파일을 열어서 사용하세요.

*** 아래 내용중 레지스트리 편집할때 실행파일 경로를 c:\\temp 이런식으로 하지 않으면 서비스 시작시 아래와 같은 오류를 보게 된다

     "로컬 컴퓨터에서 WindChillService 서비스를 시작하지 못했습니다." 오류 0xffffffff: 0xffffffff

Posted by 나비:D
:

심실풀이게임

2008. 5. 15. 22:47
출처 : 노라라
 
【 0 ~ 9 】
 
360 도 블럭깨기
 4초게임
 
【 ㄱ 】
 
 가디언 엔젤
 건마스터 도시전쟁
 경찰차도망다니기
 공간점프
 군사지대
 균열
 그림맞추기
 금빛화살 2
 개미배틀
 계란올리기
 괴짜 파이터
 
【 ㄴ 】
 
 나인볼
 농구
 뉴메탈슬러그
 닌자맨
 닌자의 모험
 
【 ㄷ 】
 
 닭 가두기
 더블 와이어
 던전탈출
 도둑왕들
 도시계획
 도전
 돌고래 올림픽
 동물퍼즐 주키퍼
 드로우 플레이
 대격돌
 대포 포격
 
【 ㄹ 】
 
 레고 헬리콥터
 로봇줄타기
 로케트인간
 로테이션
 롱보우
 링과 스틱
 
【 ㅁ 】
 
 마리오의 모험
 마술공
 마이크로 탱크
 머리 튕기기
 멀록
 멀리차기
 모프로
 목각인형1 - 탈옥
 목각인형2-삐에로
 목각인형3 - 해골왕
 목각인형4
 목각인형5
 몽키 볼링
 물고기 타이쿤
 물방울들
 미니골프 new
 미니골프 old
 미니 자동차
 미니축구
 미스테리 박물관1
 미스테리 박물관2
 미스테리 박물관3
 미생물 박멸
 미션 마스
 밀치기
 매직잼
 매직타워
 매트릭스 파이터
 맥도널드 시물레이션
 맥주골프
 맥주의 제왕
 메가맨 Project-X
 메가빌 전투
 
【 ㅂ 】
 
 바퀴벌레
 버블 트러블
 범버맨
 범버맨2
 벽돌깨기
 보스 때리기
 볼링
 봅슬레이
 부시 무력전쟁
 불면증 기사
 불빛
 붐잭
 붉은 전쟁
 블러디레이지
 블럭스
 블랙드래곤
 비열한 공격
 빌리밥
 빗속의 닌자
 배틀쉽

【 ㅅ 】
 
 사막전쟁
 산타 스키점프
 살인자
 성 지키기
 수호자2
 술먹은 후 귀가길
 술먹은 후 귀가길2
 슈팅 라이크 베컴
 슈퍼 파이터
 스나이퍼
 스노우보드PGX
 스케이트 보드
 스타크래프트 FA 3
 스타크래프트5
 스틱 스케이터
 스틱 스트라이크
 스폰지 밥
 세계지배
 세포없애기
 쉐도우 팩토리
 
【 ㅇ 】
 
 아드레날린
 아이탈출1
 아이탈출2
 아이탈출3
 아쿠아 슬러그
 아빠와 나
 영토전쟁
 올아웃
 우주선 착륙게임
 유령 캐스퍼
 에미넴 매니아
 에어리언의 반란
 에일리언 어택
 
【 ㅈ 】
 
 자동차 광기
 자물쇠
 전사의 그림자
 전선 위의 벌레
 전쟁의 왕자
 조심해
 졸라메탈슬러그
 주차 게임
 주차
 진주구슬 없애기
 제드
 쥐들의 파티
 
【 ㅊ 】
 
 착륙선
 천공대전
 총격전
 추억의 오락 킹콩
 축구게임
 축구공 던지기
 축구공 오래버티기
 축구장 난투극
 침략 3
 챔피온
 최후의 소닉
 최후의 심판일2
 
【 ㅋ 】
 
 카 드라이버
 카운터 스트라이크
 카타펄트
 커브 볼
 컴퓨터 속 탈출
 컵라면 물붓기
 큐브버스터
 크래쉬다운
 클락스
 킴파서블
 킹어브파이터즈
 캠퍼스트라이크
 
【 ㅌ 】
 
 타이어 던지기
 탁틱스 코어
 터렛디펜스
 특수기동대
 테니스
 테니스게임
 테트리스
 
【 ㅍ 】
 
 파이어맨vs바스
 파이어맨
 파이프 통과하기
 팡 2004
 포인터
 폭탄
 폭탄 비치발리볼
 패닉
 팬더 골프
 페인트 볼
 펭귄던지기1
 펭귄던지기2
 펭귄아케이드
 페인방 치우기
 
【 ㅎ 】
 
 하버봇 아레나
 한다발
 함정여행
 홈런경기
 후레쉬맨
 휴지넣기
 휴지던지기
 헬기공격
 헬리콥터
 
【 ㄲ ~ ㅉ 】
 
 꿈꾸는 아저씨 - 겨울이야기
 꿈꾸는 아저씨 - 괴수들
 꿈꾸는 아저씨 - 놀이공원
 꿈꾸는 아저씨 - 바닷속
 꿈꾸는 아저씨 - 연구실
 꿈꾸는 아저씨 - 우주
 꿈꾸는 아저씨 - 지붕
 꿈꾸는 아저씨 - 타임머신
 씽씽 아레나
 
【 A ~ Z 】
 
 BMX트릭스
 DDR
 WpnFire
 X바운드
Posted by 나비:D
:

C++/C :: 강좌

2008. 5. 14. 10:05

출처 : 네이버 :: 지식iN




C++을 배우신다면 C는 배우셨는지 모르겠네요.


일정이 바쁘신게 아니라면 씨부터 배우는 것을 추천합니다.


물론 C++부터 배운다고 나쁜거는 아니지만 C부터 배우면


정말 기본 부터 배울수가 있습니다.


일단 C 강좌는


http://www.chanywa.com/pl/ 자료 만땅!

http://goldkorea.x-y.net/frame.htm 강좌.있는곳.

http://cprogramming.ce.ro/ 강좌있는곳..가끔 18x같은배너떠서 짜증남.

http://ns2.dongju-c.ac.kr/~syhong/teaching/c/c13.htm# 책처럼 자세한 강좌

http://loveisstar.hihome.com/홈페이지/공부방/c.htm 포인터 강좌, 캠퍼스 C강좌, 정복 터버C강좌 있음.. 여기가 강좌로만 치면 제일많음..

http://romeo.hufs.ac.kr/~dondek/ 상돈형님의 사이트 포인터 부분..

http://www.terms.co.kr/ 용어사전 텀즈..강추

http://www.winapi.co.kr/ pdf자료 만땅. 강좌도 쓸만함.

http://spnode10.knou.ac.kr/computer/html/08.htm 걍 함번 가보면 좋음.
음성이 나옴-_______-;


이렇게 있습니다.


완전 초보시라면 크레듀(http://www.credu.com) 와 같은 교육 싸이트의 동영상 강의도


좋습니다. 초보에 맞게 진행되고 씨와 씨뿔뿔 어려 과목이 있습니다.


C++ 싸이트로는 아래의 링크를 이용해 주세요


윈도우즈 API(Win32 API) 전문 사이트 : http://winapi.co.kr/


프로그래머를 위한 C++ : http://higasijoe.nasse.net/Main/index2.htm


C언어 길라잡이 : http://www.c-language.wo.to/


ProGramma : http://www.hanpoi.wo.to/


C++언어 강좌(기초) : http://cplus.ubedu.com/


C++ 온라인 동영상 강좌(무료) : http://cla.ib96.com/study/index.php


C 구조대 : http://www.sosc.nuri.cc/


지키미 : http://www.zikimi.co.kr/


워킹 C : http://workingc.com/


골드코리아 : http://goldkorea.x-y.net/html/frame.htm


민호의 프로그램 공부방 : http://oa.colorn.com/


지니야닷넷 : http://www.jiniya.net/bbs/portal.php


Standard C++ Library : http://oopsla.snu.ac.kr/~sjjung/stl/


생각하는 C++ : http://tc.pukyung.co.kr/index.htm


김중태의 C언어 이야기 : http://www.dal.co.kr/chair/c/c.html


데브피아 : http://www.devpia.com/


C 언어 길라잡이 : http://www.web-reader.co.kr/c-vb/c-edu.htm


C : http://hanuri.jnu.ac.kr/lecture/language/clang/


C 강좌 : http://www.mydosu.com/LEC/cpp/main_cpp.asp


http://fhl.com.ne.kr/school/C/cm.html

1주차 강의 C 의 기초지식,소개
2주차 강의 C 의 기본 문법
3주차 강의 기본적인 입출력 함수
4주차 강의 제어구조
5주차 강의 배열
6주차 강의 포인트
7주차 강의 포인트 배열
18주차 강의 8주는 시험
9주차 강의 함수의 이해
10주차 강의 데이터형과 기억 클레스
11주차 강의 구조체와 공용체
12주차 강의 프리프로세서
13주차 강의 표준 라이브러리 함수
14주차 강의 파일처리


동주대학 전산과 C : http://www.dongju-c.ac.kr/~syhong/teaching/c/


----------------------------------------------------------------------------------

C C++ 무료 개발툴 다운로드

----------------------------------------------------------------------------------


MS Visual C++ Toolkit 2003 : http://msdn.microsoft.com/visualc/vctoolkit2003/


볼랜드 BC++ 컴파일러 : http://www.borland.com/products/downloads/download_cbuilder.html


아래의 Compiler 라고 써있는 링크를 클릭하면 다운로드 받을 수 있음.

Compiler Windows 5.5 08/24/2000 8.7 Mb

 







Posted by 나비:D
:

난 게임을 만들고 싶은 사람이다.


예전부터 컴퓨터 게임을 할 때마다 '내가 이런 게임을 만들어 보면 어떨까' 하고 생각했었다.


나름대로 수많은 pc게임을 접해오면서 느낀건


"버그 없이, 빠르게 잘 돌아가야 한다" 는 것이었다.


게임은 아무리 잘만들어도 느리면 소용없다. 하고 싶은 맘이 싹 달아달게 분명하다.


이런 이야기를 하는 이유는 오늘 이야기 할 것이 바로


"참조자로 매개변수에 객체 전달" 이기 때문이다.


이런 말들은 정말 많이 들어보셨으리라 믿는다.


Call by reference

Call by value


설명하자면...

하나는 값으로 전달하는 방법이고, 하나는 참조로 전달하는 방법이다.


값으로 전달하는 놈은 복사를 행하고,

참조로 전달하는 놈은 단순히 원래 객체에 이름표만 붙인다는 점이 다른것이다.


아직 무슨말인지 모르시겠다면 다음을 보면서 이야기 하겠다.



위에서 CData형 클래스는 멤버변수로 int형 배열을 가지고 있다.

그리고 생성과 동시에 복사가 일어났을 경우에 콘솔창에서 직접 확인하기 위해

복사생성자를 재정의 해주었다

이 클래스로 객체를 생성했을 경우 그 객체의 사이즈는 4byte(int) * 10 = 40byte인 것이다.


자 이제 이 클래스형을 매개변수로 받는 함수 FuncA를 작성해보자.


지금 현재 이 함수 FuncA에서는 그다지 하는 일이 없지만,

우리는 이 함수가 1프레임에 100번이상 호출되는 중요한 함수라고 가정하자.



메인에서 이런식으로 FuncA 함수를 사용하였다. 콘솔창에 출력되는 결과값은 어떻게 될까.

한번 예상해보고 아래쪽을 보시기 바란다.



생성과 동시에 복사가 이루어질 경우만 호출되는 복사생성자가 함수 한번 실행에

무려 3번!이나 호출되었다.


한번은 당연히 CData형 객체 temp가 생성됨과 동시에 같은 타입의 _data를 복사하기 때문에

복사생성자가 호출되었다.


그렇다면 나머지 두번은 어디에서 호출되는것일까.


답은

하나는 매개변수에서 호출되고

다른 하나는 리턴할 때 호출된다는 것이다.


위와같은 코드가 있을 경우 컴파일러는 이런 코드를 생성해낸다.


(FuncA함수의)  CData _data((main함수의)oData); -> 매개변수에서의 코드

...

CData abcd(_data) 을 main함수내에 생성 -> 리턴에서의 코드

(여기서 abcd는 임의의 변수 이름)


이렇듯 FuncA 함수내의 temp객체가 생성되는 과정 이외에도 2번의 복사가 더 일어나는 것이다.


자 그럼 이것이 뭐 어쨌다는 것인가.


생각해보자. 40byte짜리 객체를 3번 복사하는건 120byte정도의 복사비용이 든다.

뭐 이정도도 컴퓨터가 워낙빠르기 때문에 감당할 수 있다고 하자.

그런데 우리가 이 함수를 사용하려는 게임에서는 프레임당 이 함수를 100번이상 호출한다고 해보자.

그러면 상황은 달라진다. 1프레임당 12,000byte의 복사가 계속해서 이루어지는 것이다.

그렇게 되면 게임은 우리가 의도한것과는 다르게 느려지게 되는 것이다.


그럼 우짜란 말인가.


아 일단 이 글을 읽으시는 분이 참조자나 포인터에 대해서

어느정도 잘 알고 계신다고 믿고 설명하는것이다.


이제 값에 의한 전달이 아닌 참조에 의한 전달을 해야 할 순간이 온 것이다.


자 이제 복사가 일어나려는 부분을 수정해보자.


일단 매개변수에서의 복사를 없애야 할 것이다.



이제 위의 값에 의한 전달에서 행하여 지는 일과 비교를 해보자.


(FuncA함수의)  CData& _data = (main함수의)oData; -> 매개변수에서의 코드


CData의 참조자 _data를 만들어 줌과 동시에 oData를 참조하고 있다.

참조자는 생성과 동시에 반드시 초기화 되어야 하는데,

매개변수는 생성과 동시에 모든일을 진행하므로 참조자로 넘겨주는 것이 가능하다는 이야기다.


그렇다면 이제 다시한번 결과를 보자



이제 40byte의 복사 비용 하나를 줄였다.


그리고 리턴에도 참조자를 적용해보자.


결과는 또 아래와 같다.


오오...이제 80byte의 복사비용을 절감한 것이다.

복사를 하지 않고 참조자를 이용해서 이름표를 붙여줌으로써 정말 확실한 효과를 봤다.


그러나 한가지 걱정되는건, 매개변수로 넘겨온 값을 사용은 하되, 그 참조되는 실제 객체의

값 자체는 바꾸고 싶지 않을 때다. 그것도 문제가 될 것이 없다. 넘겨오는 매개변수의 참조자를

상수화시키면 된다.



이제는 함수내에서 그 넘겨온 참조자 객체의 값을 모르고 변경할 위험에서도 벗어나게 되었다.

하지만 이코드는 오류를 하나 뿜어낼 것이다.

왜냐하면 매개변수에서 상수화를 시켜서 값 변경이 불가능하게 했는데

리턴할때는 값이 변경 가능한 참조자로 바꾸려고 해서다.

그래서 리턴값도 상수화가 필요하니 리턴 타입 앞에 const를 붙이면 땡이다.


이렇게 매개변수에서의 참조자는 간단하지만 정말 초강력한 기능을 발휘한다는 점이 참 멋지다.


리턴에서는 또 리턴 값 최적화라는 컴파일러에서 많이 지원되고 있으므로 그 부분이 궁금한

사람들은 또 전문서적이나 인터넷을 뒤져서 읽어보는것도 많이 도움이 될 듯하다.


그럼 모두모두 즐코딩!


작성자 : kaltznnnyyy

Posted by 나비:D
:
출처 : http://kwon37xi.egloos.com/2521260
Subversion svn+ssh PuTTY Subclipse/TortoiseSVN 설정
Subversion svn+ssh 방식으로 설정해서 PuTTY/Subclipse/TortoiseSVN으로 접속하기

Subversion을 써볼까 하여 테스트 중이다.
Subversion은 CVS에 비해서 장점이 많다.
1. 파일명 변경이 히스토리에 남는다.(CVS는 기존 파일을 삭제한 것으로 간주해버린다)
1. 원자적 커밋(모든 파일이 커밋되면 되는거고 아니면 모두 롤백)
1. 커밋 단위별 버저닝.(CVS는 각 파일별로 버전을 메기지만 SVN은 커밋단위로 버전을 메기기 때문에, 직전 커밋상태로 모든 파일을 되돌리는 것이 가능하다)
뭐 대충 이런 장점들이 있다.

하지만 Subversion을 지금 바로 우리 회사 프로젝트에 도입하는 것은 흠.. 아직 CVS를 갈아 엎고 도입하기에는 무리 같다. Subversion 자체가 문제가 아니라 현재의 Eclipse용 Subversion Client인 Subclipse(1.0.3) 때문이다.
CVS Client에서 안보이던 버그들 때문에 다른 개발자들이(나부터도) 짜증 날 듯 하다.
기존에 CVS가 없었고, 처음으로 버전 관리 시스템을 도입하려 한다면, 도입해도 무관할 듯하다. 버그가 있다고 해도 (이미 CVS클라이언트에 익숙하지 않다면)그렇게 짜증날 정도는 아닌 것 같다.

참조

 * http://tortoisesvn.sourceforge.net/?q=book/print/5&PHPSESSID=856b2d1ca0e8ec705ff96309ac6ffcff
 * http://subclipse.tigris.org/servlets/ReadMsg?list=users&msgNo=3334
 * KLDP Wiki Subversion

서버측 설정

서버는 Linux, Unix, Cygwin 을 사용하고, SSH를 통해 보안이 강화된 접속을 사용한다.

지난번에 CVS는 pserver로 보안이 안되는 접속방식을 사용했는데, Subversion은 SSH를 사용하는 이유는, 첫째는 SSH를 사용하는 것이 안쓰는 것보다는 여러모로 좋다는 사실엔 이견의 여지가 없으며, Subversion은 SSH를 사용하지 않고 svnserver를 직접 사용할 경우 각 사용자와 사용자의 비밀번호를 지정할 때 전혀 CVS와 같은 방식의 비밀번호 암호화 조차도 하지 않기 때문에 좋지 아니하다~

Subversion 패키지와 openssh 패키지를 설치해 두면 되며, 대부분의 배포판이 패키지를 제공하므로 설치상의 어려움이 전혀 없다.

* 키 생성하기
각 사용자 별로 Linux/Unix에 계정을 만들고 자신만의 키를 생성해야 한다. 즉, 아래 작업은 각 사용자별로 다 해야하는 것이다.

$ ssh-keygen -b 1024 -N mypassword -f kwon37xiKey
mypassword는 Passphrase라고 부르며 비밀번호 같은 것으로 자신만 알도록 임의로 만든다.

kwon37xiKey(개인키), kwon37xiKey.pub(공개키) 파일 생성된다.

공개키를 자기 Unix/Linux 계정에 등록한다.
$ mkdir ~/.ssh
$ cp kwon37xiKey.pub ~/.ssh/authorized_keys

그리고 kwon37xiKey(개인키) 파일을 자신의 컴퓨터(Eclipse 등을 실행하는)로 다운 받는다.

* 리포지토리 생성
$ cd
$ svnadmin create repos --fs-type fsfs

결과 /home/username/repos 리포지토리가 생성되었다.
리포지토리의 경우 해당 리포지토리를 여러 사용자가 공유하기 위해서는 Group을 만들고 그 Group에 대해 rwx 권한을 줘야 한다.
그리고, 그 리포지토리를 사용할 사용자들은 모두 해당 Group에 속해야 한다.

클라이언트 측 설정

* Subclipse 설치
Eclipse에서 Subclipse를 사용한다.
Subclipse 설치문서를 참조하여 설치한다.

* TortoiseSVN을 다운로드한다.
TortoiseSVN은 Windows 용 SVN 클라이언트로, 탐색기를 이용해서 Subversion을 매우 편리하게 이용할 수 있다. Eclipse에서 Subclipse를 사용해서 SVN을 접속할텐데 TortoiseSVN을 일부러 설치하는 이유는? 아래에 나온다.

* PuTTY 설정
영문판 PuTTY 혹은 한국어판 PuTTY를 설치한다.

PuTTY는 SSH/Telnet 접속도구이고, SSH 키 관리를 하는 기능과 SFTP를 이용한 안전한 파일 송수신 기능 등을 갖고 있다. 우리가 사용할 기능은 SSH 키 관리 기능이다.

클라이언트에 개인키 설정

개인키를 사용하기 위해서는 PuTTY가 인식할 수 있는 형태로 변환하는 것이 필요하다.
puttygen을 실행하고 메뉴에서 "Conversions -> Import Key"를 선택한다. kwon37xiKey 파일을 선택하고서 Passphrase로 아까 키 생성시 지정했던 "mypassword"를 입력한다. "Save private key" 버튼을 클릭해서 kwon37xiKey.PPK 정도의 이름을 줘서 저장한다. 확장자는 PPK이다.

C:\Documents and Settings[user_name]Application Data\Subversion\config 파일을 열어서 아래와 같이 PuTTY의 PLINK경로를 가리키도록 변경한다. Eclipse의 SVN 플러그인인 Subclipse나 TortoiseSVN이 PLINK를 이용해서 SSH접속을 하도록 하는 것이다. 헌데, 여기서는 PuTTY의 PLINK가 아니라 TortoiseSVN의 PLINK를 사용했다.
[tunnels]
ssh = C:/Program Files/TortoiseSVN/bin/TortoisePlink.exe

TortoisePlink.exe는 PuTTY의 plink.exe를 변경한 것이라고 한다. PuTTY의 plink를 사용하지 않은 이유는 PuTTY의 plink는 SSH관련 작업이 있을 때마다 귀찮은 화면이 자꾸뜨는데, TortoisePlink는 그렇지 않다.
그리고 경로를 지정할 때 유닉스 식으로 지정했음에 주의하라. 디렉토리 구분은 /이고, 경로에 공백이 나올 때는 을 이용해서 이스케이핑을 해야 한다.

PuTTY Pagent를 실행하면 시스템 트레이에 아이콘이 생기는데, 해당 Pagent 아이콘의 Add Key 메뉴를 통해 이용해서 개인키(아까 저장한 kwon37xiKey.PPK) 를 저장한다. 개인키 저장시 키를 만들지 지정한 Passphrase를 물어보면 그것을 입력한다.

Pagent를 "시작 프로그램"에 등록하여 항상 시작되게 해 두면 이제부터 PuTTY를 쓰거나 Eclipse의 Subclipse를 이용할 때 해당 서버에 로그인 시도시 자동으로 로그인 된다.

그리고 Pagent의 개인키는 Pagent를 새로 시작할 때마다 다시 지정해야 한다.

Subclipse

Subclipse의 SVN Repository Perspective로 전환하여 svn+ssh://username@yourhostname.com/home/username/repos를 새로운 리포지토리로 등록한다.

1. 프로젝트를 생성하고, 해당 프로젝트를 SVN에 import 할 때(프로젝트를 최초로 SVN에 올릴 때) 프로젝트명에서 오른쪽 단추를 클릭해서 "Team -> Share Project"를 통해 Import를 한다.
2. Repository Type에서 SVN을 선택한다.
3. SVN 리포지토리의 폴더 네임을 선택하는 항목에서 "Use specified folder name"을 선택하고, 폴더명을 "Project명/trunk"로 지정한다. 이렇게 하지 않으면 Branch나 Tag를 생성할 수가 없다. (약간 짜증난다..)

기타 참조할 점으로,
CVS에서 "add to .cvsignore" 와 같이 특정 파일을 리포지토리에 등록하지 않도록 지정하려면, "Team -> Add to svn:ignore"을 하면된다. 이것은 "svn:ignore" 프라퍼티를 지정하는 것으로, 이렇게 할경우에는 프로젝트를 Commit 해야 이에 관한 사항이 SVN 리포지토리에 전달된다. 그래서 좀 헷갈린다. CVS처럼 .cvsignore 파일 같은 것을 커밋하는게 아니라 프로젝트를 선택해서 Commit 해야한다.

지금까지 Subclipse(1.0.3)를 사용한 결과는, 아직은 약간 불안정하다는 것이다. 뭔지 모를 파악 안되는 행동들을 가끔씩 한다.
그래도 사용을 못할 정도의 문제는 없는 것 같다.

그외에 Subversive 라는 것도 있다. SSH를 이용한 접속에는 아예 실패하여 그냥 포기했다. Subversive의 경우 메일링 리스트를 보니 Eclipse 공식 프로젝트로 진입하기 위한 노력을 하고 있는 것으로 보인다.
Posted by 나비:D
:

출처 : http://www.dalbong2.net/46

프로덕트 XML 파일


부트스트래퍼(Bootstrapper)는 ClickOnce 애플리케이션이 구동되기 전에 애플리케이션에서 필요로 하는 필수 프로그램(prerequisties)이 먼저 설치되어 있는지를 확인하는 작은 부피의 프로그램을 말한다. Visual Studio.NET 2005에는 내장된 부트스트래퍼 기능이 있다. 우리는 이 기능을 사용하여 ClickOnce 애플리케이션이 실행되기전에 필요한 다른 컴포넌트를 설치할 수 있다.
달봉이는 지금까지 알고 있는 방법중에서 이전의 COM 컴포넌트나 .NET 어셈블리나 가리지 않고 클라이언트로 배포를 할 수 있는 가장 쉬운 방법중의 하나로 여기고 있다. 단점은 ClickOnce에서만 가능하다는 것이다.[현재 2006.09.16]

VS.NET의 부트스트래퍼 기능을 사용하기 위해서는 우선 컴포넌트를 설치하는 설치 프로그램(.exe or .msi)을 작성해야 한다. 그런 다음 이 설치 프로그램을 부트스트래퍼에 등록해야 한다. 그러기 위해서는  XML형식의 프로덕트 파일(product file)을 제작해야 한다.  

프로덕트 파일
(파일을 클릭하면 선명한 그림이 뜹니다)

프로덕트 파일은 ClickOnce 프로그램이 실행되기 전에, 어떤 필수 프로그램들이 설치되어 있어야 하는지를 설명해주는 부트스트래퍼용 manifest 파일을 생성해준다. 프로덕트 파일에는 ClickOnce 애플리케이션이 필요로하는 필수 컴포넌트들을  설치하는 설치프로그램들에 대한 정보를 여러개 포함시킬 수 있다.
이 그림처럼 프로덕트 파일을 생성해서 설치 프로그램과 같이 적절한 위치에 두면  ( 달봉의 경로는 다음과 같다. C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages ) 아래 그림처럼 VS.NET의 게시 디자이너에서 필수 구성 요소 버튼을 클릭했을때 선택할 수 있는 박스에 나타나게 된다. 이제 필요한 프로그램을 선택해서 게시를 하면 된다.

VS.NET에서 필수 구성 요소 선택
(파일을 클릭하면 선명한 그림이 뜹니다)

이제 이 프로덕트 XML 파일을 제작하는 방법을 알아본다.

프로덕트 파일 제작

프로덕트 파일을 제작하기 위해서는 부트스트래퍼가 이해할 수 있는 규칙에 맞도록 작성해야 한다. 이런 XML 스키마는 다음 링크에서 찾아볼 수 있다.
Product and Package Schema Reference - msdn
http://msdn2.microsoft.com/en-us/library/ms229223.aspx(새 창으로 열기)

그렇지만 이 스키마를 이해하고 직접 손으로 작성하라고 하면 MS에 짜증이 날것이다. 이런 스키마가 있다면 이런 것을 제작할 수 있는 편집기도 주면 좋잖은가. 근데 아직 공식적으로 출시된 유틸 프로그램은 없는 것으로 안다. 다행히도 이 XML 파일을 생성해주는 편집 툴을 제공하는 훌륭한 분이 계시다.

프로덕트 파일 생성 툴
ClickOnce Bootstrapper Manifest Generator

자세한 내용은 Powertoys blog(새 창으로 열기)에서 볼 수 있다.

이제 이 툴을 사용하는 방법을 소개한다. 툴을 실행시키고 File->New를 선택한다.

(파일을 클릭하면 선명한 그림이 뜹니다)

Package Manifest 프로젝트 타입을 선택한다.

(파일을 클릭하면 선명한 그림이 뜹니다)

(파일을 클릭하면 선명한 그림이 뜹니다)

그림처럼 package 노드가 하나 기본적으로 생성되면 적절하게 package 이름을 입력한다. 이 이름은 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages 아래에 생성되는 폴더명이 될 것이다.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 위 그림처럼 "Add Install File" 버튼을 클릭하면 아래처럼 설치파일을 추가할 수 있는 창이 뜬다.


적절한 설치파일을 검색해서 선택한다. 이 설치 파일은 ClickOnce 애플리케이션이 실행되기 전에 미리 설치되어 있어야 하는 컴포넌트를 클라이언트 PC에 설치하게 될 것이다. 달봉이는 임시로 iis60rkt.exe라는 파일을 선택하고 있다. ClickOnce 애플리케이션과는 전혀 상관없는 셋업 파일이긴 하지만.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 적절한 display 명을 준다. 이 이름은 VS.NET의 필수 구성요소 선택하는 창에 출력될 것이다.

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 System Checks 탭을 선택한다. 이 탭에서는 이 컴포넌트가 이미 설치되었는지를 체크하는 로직을 선택할 수 있다. 설치 여부를 체크하는 로직은 여러가지를 제공하고 있다. 그림의 아이콘에 커서를 올려놓으면  설치 여부를 체크하는 로직으로
"File Check",
"Registry Check",
"Registry File Check",
"MSI Product Check",
"External Check",
"Assembly GAC Check"

등이 있음을 알 수 있다. File Check라는 것은 앞의 그림처럼 "어떤 경로의 폴더에 지정한 파일이 있으면 이미 이 PC에는 원하는 셋업이 이뤄져있다"는 것으로 간주하겠다는 것이다. 레지스트리에 특정 값이 있는지를 판단해서 설치여부를 판단할 수도 있다. 시스템 체크 로직에 대한 다른 구체적인 방법에 대해서는 앞에서 알려준 MSDN 링크 페이지(새 창으로 열기)를 통해서 알아보길 바란다.
달봉이는 단순히 그림과 같은 경로에 iisTools.chm 파일이 있는지를 판단해서 그 결과값을 IIS60rktInstalled에 받아 두도록 하고 있다.

(파일을 클릭하면 선명한 그림이 뜹니다)

다음은 Install Conditions 탭을 선택한다. 이곳에서는 System Checks 탭에서 시스템의 상태를 체크한 값을 이용해서 값에 따라서 어떻게 할 것인지를 설정할 수 있다. 그림은 앞에서 설정된 IIS60rktInstalled 값이 0보다 크거나 같으면 그냥 설치를 통과하도록 설정하고 있다. IIS60rktInstalled 같은 변수에 어떤 값이 저장될 지는 시스템 체크 로직에 따라 다르다. 이런 구체적인 값도 앞에서 알려준 msdn 링크(새 창으로 열기)를 참조하기 바란다.

(파일을 클릭하면 선명한 그림이 뜹니다)

다음은 Exit Codes 탭을 선택한다. 설치 파일이 exit code를 리턴하고 그것에 따라 실패, 성공, 재부팅들을 설정해줄 수가 있다. 달봉은 exit code에 대한 설정을 해 주지 않고 있다. 다만 아래 부분을 보면 "Use Default System Exit Codes"가 선택되어 있고 결과값으로 Fail이 선택되어 있는데, 이것은 설치 후 상태를 기본적으로 설치 실패로 설정하겠다는 것이다. 우리는 이것의 체크를 없애 줘야 한다.  

(파일을 클릭하면 선명한 그림이 뜹니다)

그런 다음 저장 버튼을 클릭하면 지금까지 설정한 내용을 저장할 수 있다. 이때 저장된 내용은 우리가 원하는 xml 형식의 프로덕트 파일은 아니다. 이렇게 저장된 내용은 언제든지 다시 불러와서 재 편집을 할 수 있다(근데, 이 기능이 아직은 제대로 작동하지 않는듯하다)

(파일을 클릭하면 선명한 그림이 뜹니다)

우리가 원하는 xml의 프로덕트 파일을 최종적으로 만들어 내기 위해서는 위 그림처럼 "Project->Build" 메뉴를 선택해야 한다. 이 메뉴를 선택하고 나면 아래 그림처럼 결과가 나타난다.

(파일을 클릭하면 선명한 그림이 뜹니다)

이 그림은 최종적으로 프로덕트 파일이 저장된 경로(기본적으로 C:\Program Files\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages )와 프로덕트 파일을 생성하는과정에 남긴 로그를 보여주고 있다. 프로덕트 파일의 저장 경로는 "Project->Properties"에서 변경할 수 있다.

이렇게 해서 최종적인 프로덕트 파일이 생성되었고 적절한 폴더에 위치시켰다. 이제 VS.NET을 실행시키고 게시 디자이너를 통해서 필요한 설치 프로그램을 선택한 후 게시를 하면 된다.

--------------------------------------------------------------------------------

참조 문서

Product and Package Schema Reference - msdn
http://msdn2.microsoft.com/en-us/library/ms229223.aspx(새 창으로 열기)
ClickOnce Deployment Technology - Peter Bromberg
http://www.wise.com/Library/ClickOnce.pdf(새 창으로 열기)
ClickOnce : Bringing Ease and Reliability to SmartClient Deployment
http://www.code-magazine.com/article.aspx?quickid=0601041&page=1(새 창으로 열기)
msdn : Deploying applications
http://msdn2.microsoft.com/en-us/library/6hbb4k3e(VS.80).aspx(새 창으로 열기)

Posted by 나비:D
:
메시지 필터를 이용하여 F1, F2, F3 .. 키 입력을 후킹하기.
 
 
public class MessageFilter : System.Windows.Forms.IMessageFilter
{
    public bool PreFilterMessage(ref Message m)
    {
        switch(m.Msg)
        {
            case 256 : // WM_KEYDOWN    
 
<==== windows message 를 C# 형태로 쓰고 싶었지만..
딱히 만들어져있는게 없더군요 그래서 인터넷에서 windows.h 파일을 검색해서 찾았습니다. WM_KETDOWN = 256 번이더군요.
 
                System.Console.WirteLine(m.LParam.ToInt32());      
                // 이걸로 F1 부터 여러가지 키를 차례데로 눌러본 값들이
                if( m.LParam.ToInt32() == 3866625 ) // F1 Key            
                // <===  이 값들입니다. 3866625 가 F1 이군요.. 이런식으로 Key 값을 찾아서
                {                                                                            
                // 계속 추가하면 키보드 후킹.. 그다지 어려운건 아닐거 같군요 ^^;;
                    System.Console.WriteLine("F1 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3932161 )    // F2 Key
                {
                    System.Console.WriteLine("F2 Press");
                    return true;
                }
                else if( m.LParam.ToInt32() == 3997697 )    // F3 Key
                {
                    System.Console.WriteLine("F3 Press");
                    return true;
                }
                break;
        }
        return false;
    }
}
 
//
//     만들어 놓은 MessageFilter 는 반드시 AddMessageFilter 메서드를 통해 추가해줘야 합니다.
//    static void Main 함수는 기본 Form 에 포함되어 있습니다.  :) 아시죠?
 
static void Main()
{
    Application.AddMessageFilter(new MessageFilter());
    Application.Run(new JapExamples());
}
 
 
아래 있는 것은 windows.h 파일에 정의된 windos message 들입니다. windows.h 파일은 visual studio 안에 INCLUDE_ROOT 에 있습니다.
어딘지는 아시죠?
 
 
WA_ACTIVE 1
WA_CLICKACTIVE 2
WA_INACTIVE 0
WM_ACTIVATE 6
WM_ACTIVATEAPP 28
WM_AFXFIRST 864
WM_AFXLAST 895
WM_APP 32768
WM_ASKCBFORMATNAME 780
WM_CANCELJOURNAL 75
WM_CANCELMODE 31
WM_CAPTURECHANGED 533
WM_CHANGECBCHAIN 781
WM_CHAR 258
WM_CHARTOITEM 47
WM_CHILDACTIVATE 34
WM_CLEAR 771
WM_CLOSE 16
WM_COMMAND 273
WM_COMMNOTIFY 68
WM_COMPACTING 65
WM_COMPAREITEM 57
WM_CONTEXTMENU 123
WM_COPY 769
WM_COPYDATA 74
WM_CREATE 1
WM_CTLCOLORBTN 309
WM_CTLCOLORDLG 310
WM_CTLCOLOREDIT 307
WM_CTLCOLORLISTBOX 308
WM_CTLCOLORMSGBOX 306
WM_CTLCOLORSCROLLBAR 311
WM_CTLCOLORSTATIC 312
WM_CUT 768
WM_DEADCHAR 259
WM_DELETEITEM 45
WM_DESTROY 2
WM_DESTROYCLIPBOARD 775
WM_DEVICECHANGE 537
WM_DEVMODECHANGE 27
WM_DISPLAYCHANGE 126
WM_DRAWCLIPBOARD 776
WM_DRAWITEM 43
WM_DROPFILES 563
WM_ENABLE 10
WM_ENDSESSION 22
WM_ENTERIDLE 289
WM_ENTERMENULOOP 529
WM_ENTERSIZEMOVE 561
WM_ERASEBKGND 20
WM_EXITMENULOOP 530
WM_EXITSIZEMOVE 562
WM_FONTCHANGE 29
WM_GETDLGCODE 135
WM_GETFONT 49
WM_GETHOTKEY 51
WM_GETICON 127
WM_GETMINMAXINFO 36
WM_GETOBJECT 61
WM_GETTEXT 13
WM_GETTEXTLENGTH 14
WM_HANDHELDFIRST 856
WM_HANDHELDLAST 863
WM_HELP 83
WM_HOTKEY 786
WM_HSCROLL 276
WM_HSCROLLCLIPBOARD 782
WM_ICONERASEBKGND 39
WM_IME_CHAR 646
WM_IME_COMPOSITION 271
WM_IME_COMPOSITIONFULL 644
WM_IME_CONTROL 643
WM_IME_ENDCOMPOSITION 270
WM_IME_KEYDOWN 656
WM_IME_KEYLAST 271
WM_IME_KEYUP 657
WM_IME_NOTIFY 642
WM_IME_REQUEST 648
WM_IME_SELECT 645
WM_IME_SETCONTEXT 641
WM_IME_STARTCOMPOSITION 269
WM_INITDIALOG 272
WM_INITMENU 278
WM_INITMENUPOPUP 279
WM_INPUTLANGCHANGE 81
WM_INPUTLANGCHANGEREQUEST 80
WM_KEYDOWN 256
WM_KEYFIRST 256
WM_KEYLAST 264
WM_KEYUP 257
WM_KILLFOCUS 8
WM_LBUTTONDBLCLK 515
WM_LBUTTONDOWN 513
WM_LBUTTONUP 514
WM_MBUTTONDBLCLK 521
WM_MBUTTONDOWN 519
WM_MBUTTONUP 520
WM_MDIACTIVATE 546
WM_MDICASCADE 551
WM_MDICREATE 544
WM_MDIDESTROY 545
WM_MDIGETACTIVE 553
WM_MDIICONARRANGE 552
WM_MDIMAXIMIZE 549
WM_MDINEXT 548
WM_MDIREFRESHMENU 564
WM_MDIRESTORE 547
WM_MDISETMENU 560
WM_MDITILE 550
WM_MEASUREITEM 44
WM_MENUCHAR 288
WM_MENUCOMMAND 294
WM_MENUDRAG 291
WM_MENUGETOBJECT 292
WM_MENURBUTTONUP 290
WM_MENUSELECT 287
WM_MOUSEACTIVATE 33
WM_MOUSEFIRST 512
WM_MOUSEHOVER 673
WM_MOUSELEAVE 675
WM_MOUSEMOVE 512
WM_MOUSEWHEEL 522
WM_MOVE 3
WM_MOVING 534
WM_NCACTIVATE 134
WM_NCCALCSIZE 131
WM_NCCREATE 129
WM_NCDESTROY 130
WM_NCHITTEST 132
WM_NCLBUTTONDBLCLK 163
WM_NCLBUTTONDOWN 161
WM_NCLBUTTONUP 162
WM_NCMBUTTONDBLCLK 169
WM_NCMBUTTONDOWN 167
WM_NCMBUTTONUP 168
WM_NCMOUSEMOVE 160
WM_NCPAINT 133
WM_NCRBUTTONDBLCLK 166
WM_NCRBUTTONDOWN 164
WM_NCRBUTTONUP 165
WM_NEXTDLGCTL 40
WM_NEXTMENU 531
WM_NOTIFY 78
WM_NOTIFYFORMAT 85
WM_NULL 0
WM_PAINT 15
WM_PAINTCLIPBOARD 777
WM_PAINTICON 38
WM_PALETTECHANGED 785
WM_PALETTEISCHANGING 784
WM_PARENTNOTIFY 528
WM_PASTE 770
WM_PENWINFIRST 896
WM_PENWINLAST 911
WM_POWER 72
WM_POWERBROADCAST 536
WM_PRINT 791
WM_PRINTCLIENT 792
WM_QUERYDRAGICON 55
WM_QUERYENDSESSION 17
WM_QUERYNEWPALETTE 783
WM_QUERYOPEN 19
WM_QUEUESYNC 35
WM_QUIT 18
WM_RBUTTONDBLCLK 518
WM_RBUTTONDOWN 516
WM_RBUTTONUP 517
WM_RENDERALLFORMATS 774
WM_RENDERFORMAT 773
WM_SETCURSOR 32
WM_SETFOCUS 7
WM_SETFONT 48
WM_SETHOTKEY 50
WM_SETICON 128
WM_SETREDRAW 11
WM_SETTEXT 12
WM_SETTINGCHANGE 26
WM_SHOWWINDOW 24
WM_SIZE 5
WM_SIZECLIPBOARD 779
WM_SIZING 532
WM_SPOOLERSTATUS 42
WM_STYLECHANGED 125
WM_STYLECHANGING 124
WM_SYNCPAINT 136
WM_SYSCHAR 262
WM_SYSCOLORCHANGE 21
WM_SYSCOMMAND 274
WM_SYSDEADCHAR 263
WM_SYSKEYDOWN 260
WM_SYSKEYUP 261
WM_TCARD 82
WM_TIMECHANGE 30
WM_TIMER 275
WM_UNDO 772
WM_UNINITMENUPOPUP 293
WM_USER 1024
WM_USERCHANGED 84
WM_VKEYTOITEM 46
WM_VSCROLL 277
WM_VSCROLLCLIPBOARD 778
WM_WINDOWPOSCHANGED 71
WM_WINDOWPOSCHANGING 70
WM_WININICHANGE 26

출처 : 데브피아

Posted by 나비:D
:
 

안녕하세요. 굿띠입니다...

 이번 포스트는 Property에 대해 얘기를 해보고 활용방법에 대해 간단하게 정리를 해볼까 합니다... 이것도 팁이 될수 있을까 모르겠네요..^^

Property는 어떤 구조로 되어 있다는거는 누구나 다 아실 겁니다.. 하지만 어떤 property를 얘기하는거지??? 라고 말하시는 분도 있을수도 있기 때문에 한번 다음과 같이 간단하게 소스를 만들어보도록 하겠습니다.


  class TestProperty
  {
    private string m_Test;

    public string Test
    {
      get
      {
        return m_Test;
      }
      set
      {
        m_Test = value;
      }
    }

    public TestProperty()
    {
    }
  }


 아~ 이것은 프로그램 하신 분이라면 누구나 많이 보던 소스아닙니까??? 그쵸??^^ 그럼 제가 한번 정리 해보겠습니다.

일반적으로 필드가 public이면 다른 개체가 해당 필드에 직접 액세스가 가능하고 수정 할 수 있지만 위와 같은 Property는 다른 개체를 통해 수정할수는 있으나 해당 필드를 소유하는 개체에 접근하지 못 하도록 합니다. 그리고 필드의 전용값을 읽고 쓰고 융통성 있는 메커니즘을 제공하는 멤버입니다. 이 Property는 멤버변수 처럼 사용할 수 있지만 실제로는 접근자를 통해 구현이 가능 한것이죠! 접근자는 위의 소스내용을 보시면 get, set을 생성하여 private 데이터에 엑세스 한다는것을 보실수 있습니다.


하지만 여기서 Property와 필드의 명확한 구분이 필요할 것 같습니다. 이 Property와 필드는 모두 개체에 정보를 저장하고 검색합니다. 이런 두개의 속성과 필드 기능의 유사성으로 인해 다음과 같은 경우에 서로 구분하여 프로그래밍 방식을 결정합니다. 다음 내용은 MSDN의 한 부분을 발췌했습니다.


다음 경우는 Perperty를 사용합니다.

  • 값이 설정되고 검색되는 시기와 방법을 제어해야 하는 경우

  • 속성에 유효성을 검사해야 하는 잘 정의된 값 집합이 들어 있는 경우

  • IsVisible 속성처럼 값을 설정했을 때 개체의 상태가 크게 변경되는 경우

  • 속성을 설정했을 때 다른 내부 변수나 다른 속성의 값으로 변경되는 경우

  • 속성을 설정하거나 검색하기 전에 일련의 작업 단계를 수행해야 하는 경우


    다음 경우에 필드를 사용합니다.

  • 값이 자체적으로 유효성을 검사하는 형식인 경우. 예를 들어, Boolean 변수에 True 또는 False 이외의 값이 할당되면 오류가 발생하거나 자동 데이터 변환이 수행됩니다.

  • 데이터 형식에서 지원하는 범위의 값이 유효한 경우. Single 또는 Double 형식의 여러 속성에도 적용됩니다.

  • 속성이 String 데이터 형식이고 문자열의 크기나 값에 대해 제약 조건이 없는 경우

     

    링크 : http://msdn2.microsoft.com/ko-kr/library/9d65as2e(VS.80).aspx




    다음으로 Property의 접근자에 대해서 한번 알아보도록 합시다. get 접근자는 속성 값을 반환하는 데 사용되고, set 접근자는 데이터를 저장할때 사용합니다. 여기서 get접근자는 방금 말씀드렸다시피 Property를 정의할때도 사용되지만 인덱서 요소를 검색하고 정의할때 사용되기도 합니다. 인덱서의 자세한 내용은 여기를 참조하시면 될거 같습니다.^^ http://msdn2.microsoft.com/ko-kr/library/6x16t2tx(VS.80).aspx

     

     

     

    활용 : Property를 활용하여 TextBox의 DataBindings속성을 구현하자(따라하기)

     

    그럼 한번 Property를 이용하여 TextBox컨트롤과 데이타바인딩을 한번 시켜보겟습니다. Control.DataBindings속성은 필드의 데이터와는 바인딩이 되지 않지만 Property와는 데이터 바인딩이 가능하기 때문에 코드의 가독성과 효율적인 프로그래밍을 할 수 있습니다.



    1. 먼저 응용프로그램 프로젝트를 하나 만듭니다. 이름은 TextDataBinding으로 합니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    2. 다음 폼디자인 화면에서 다음과 같이 컨트롤을 배치합니다. 이름의 텍스트 박스 컨트롤의 네임은 txt_name, 나이의 텍스트 박스 컨트롤의 네임은 txt_age로 지정합니다.




    3. 다음 두개의 텍스트박스와 데이터 바인딩 되는 Property를 만듭니다. 소스는 다음과 같습니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    4. 폼 로드 이벤트에 텍스트박스와 Property가 데이터 바인딩 될수 있도록 다음과 같이 작성합니다.

     

     

     

     

    Add메서드의 3개의 인자중 첫번째는 데이터 바인딩 되는 속성을 말합니다. 저는 텍스트 박스의 Text속성과 데이터바인딩을 하기위해 Text라고 적었습니다. 2번째 인자는 데이터 소스와 3번째 인자 데이터 멤버이므로 현재 클래스의 this와 Property이름을 넣었습니다.




    5. 버튼 컨트롤을 더블 클릭하여 Click이벤트를 등록하고 다음과 같이 작성합니다.

     

     

     

     



    그럼 전체 소스를 보여드리고 테스트를 한번 해보겠습니다.

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    테스트를 해볼까요??? ^^ 프로그램을 실행한뒤 텍스트박스에 이름과, 나이를 입력하고 확인을 눌러봅시다.




     

     

     

     

     

     

     

     

     

     

     

     

     

    짠~~ 올바른 결과가 나왔네요...

    정리 : 버튼을 눌렀을경우 Property를 출력하라고 했습니다.  어때요??  Property는 TextBox와 데이터 바인딩이 되어 있기 때문에 Property를 통해 TextBox의 Text의 내용을 간단하게 출력할 수 있는 것입니다. 더 이상 정리는 필요 없을 것 같군요..

     

    한번 여러분도 따라 해보세요...^^!!

     

     

     

    TIP : VS2005의 리페터링으로 Property를 쉽게 만들자!!!

    여러분은 Property를 처음부터 끝까지 입력하시는건 아니죠??? Property를 10개나 만든다고 생각해보세요. 코딩 제대로 못하고 반복되는 Ctrl + C,V를 하면서 고친다면 프로그래밍의 재미를 보기전에 흥미를 잃어버릴수도 있을 겁니다. 저도 처음에는 열심이 입력했답니다.^^

    VS2005 이상 에서는 이러한 귀찮은 작업을 쉽게 만들수 있도록 도와주는 기능이 있습니다. 바로 리펙터링이라는 기능중에 필드 캡슐화라는 기능 인데요. 사용법은 다음과 같습니다.

     

    1. 먼저 private 멤버변수를 하나 만듭니다.








     

     

    2. private 멤버변수에서 우클릭 -> 리펙터링 -> 필드 캡슐화를 선택합니다.



     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    3. 다음 아래 그림과 같이 필드 이름을 적어주고 확인을 눌러줍니다.


    4. 짜잔~~! Property가 쉽게 만들어지는걸 볼 수 있습니다.


     VS2005는 이러한 반복적인 작업을 최소화 하기 위해 여러가지의 리펙터링 기능이 존재합니다. 이러한 리팩터링 작업을 사용하면 기존 필드에서 신속하게 속성을 만든 다음 문제 없이 코드를 새 속성에 대한 참조로 구현할 수 있습니다.^^

  • Posted by 나비:D
    :

    BLOG main image
    by 나비:D

    공지사항

    카테고리

    분류 전체보기 (278)
    Programming? (0)
    ---------------------------.. (0)
    나비의삽질 (5)
    Application (177)
    SQL (51)
    Web (27)
    etc. (14)
    Omnia (0)
    ---------------------------.. (0)

    최근에 올라온 글

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함

    달력

    «   2024/12   »
    1 2 3 4 5 6 7
    8 9 10 11 12 13 14
    15 16 17 18 19 20 21
    22 23 24 25 26 27 28
    29 30 31
    Total :
    Today : Yesterday :