출처 : http://kukuta.tistory.com/86

 

1. Shell?

  shell이란 kernel 프로그램 사용자 인터페이스를 제공하는 중간 매개체이다.

  사용자가 shell에서 제공하는 프롬프트를 이용하여 명령어를 입력하면 shell 입력 받은 명령어를 kernel 실행 있는 언어로 변환하여 전달 실행되기 때문에 보통 shell 명령어 해석기라고 한다.

 

2. Shell 변경 확인


 

2.1. 사용 가능한 Shell 확인

  # chsh –l or 또는 cat /etc/shells 입력하면 사용 가능한 shell 출력된다.


 

2.2. Shell 변경

  다른 쉘로 변경하기 위해서는 프롬프트 상에서 “chsh” 입력하면 새로운 프롬프트를 생성한다. 이때 바꾸고자 하는 쉘이 있는 패스를 적어주면 된다. 이렇게 쉘을 변경하게 되면 /etc/passwd 파일 내에서도 기존의 쉘이 새로 지정한 쉘로 변경된다. 또한 “chsh –s /bin/csh” 실행하면 현재 로그인한 쉘을 변경하게 된다.


 

3. Shell 명령어


명령어

설명

:

항상 명령어의 실행 값은 참을 반환하며 아무런 액션도 발생하지 않는다. 참값을 반환하기 때문에 “while : ; do” 같은 형태로 루프문에서 무한 루프를 설정하고 사용된다.

.

지정한 파일로부터 읽거나 실행

alias

명령에대한 앨리어스 지정

bg

특정한 프로세스를 백그라운드로 진행

bind

readline에서의 또는 함수, 매크로에 순서를 결합하고자 사용

break

루프문에서 루프문을 탈출하고자 사용

builtin

내부 명령어나 함수를 실행할 사용할 있으며 스크립트에서 외부명령어와 내부명령어가 같은 이름으로 존재할 내부 명령어만을 실행한다. 만일 지정한 내부 명령어나 함수가 존재하지 않는다면 에러를 출력한다.

cd

디렉토리 이동 명령어

command

내부 명령어 외부 명령어를 실행하며 세부적인 정보를 출력할 있는 명령어

continue

루프문에서 루프문의 처음으로 되돌아 사용하는 명령어

declare

변수를 선언하거나 속성을 부여하고자 사용하는 명령어

dirs

현재 저장되어 있는 디렉토리 리스트 목록 출력

disown

쉘에서 활성화 되어 있는 작업 테이블에서 특정한 작업 목록을 삭제

echo

입력된 문자열의 출력

enable

내부 명령어의 활성화 비활성화

eval

설정되어 있는 인자를 명령어로 변환

exec

현재 프로세스를 치환

exit

종료

export

지정한 환경변수를 하위 프로세스까지 전달

fc

히스토리 편집 출력

fg

포그라운드에서 실행

getopts

명령어의 옵션을 분리하는 명령어

hash

입력한 명령어에 대한 경로를 해쉬 테이블에 저장하여 명령어를 다시 호출할 시스템 패스 $PATH에서 검색하지 않고 해쉬 테이블에서 검색

help

내부 명령어 도움말 출력

history

이전에 사용한 명령어의 출력

jobs

실행중인 작업 목록을 출력

kill

현재 실행중인 프로세스 중단

let

산술 논리 계산

local

로컬 변수의 선언 호출

logout

로그 아웃

popd

저장된 디렉토리 스택으로 부터제거

printf

정형화된 데이터의 출력

pushd

디렉토리 스택으로 저장

pwd

현재 디렉토리 출력

read

프롬프트로부터 데이터 입력

readonly

프롬프트로부터 읽기 전용의 데이터 입력

return

호출한 부모 프로세스로 반환 되는

set

변수 설정

shift

위치 매개 변수의 이동

shopt

옵션의 출력 설정

source

지정한 파일로부터 읽거나 실행

suspend

특정한 신호를 받을 까지 일시 중지

test

조건식을 평가

times

프로세스가 사용한 시간을 출력

trap

명령어 실행 도중 특정한 신호가 입력되었을 때의 처리

type

지정한 명령어가 내부 명령어인지 외부 명령어인지를 출력

typeset

declare 같은 의미

ulimit

시스템 자원을 제한

unmask

파일 디렉토리에 대한 생성 마스크 설정

unalias

앨리어스 해제

unset

함수 변수의 초기화

wait

하위 프로세스가 종료 까지 대기


3.1. 기본적인 입력 명령어


 

3.1.1. 문자 출력 echo

-n

마지막 문자 “\n” 출력 하지 않는다

-e

\(역슬래쉬) 문자 번역

 

3.1.2. 정형화된 문자 출력 printf

C에서 제공하는 printf 비슷한 기능을 제공

사용법 : printf format [argument]

#!/bin/bash

com=”computer”

printf “$com\n” à computer

printf “%s” $com à computer

printf “%s\t” com à com

printf “%s\n” “computer” à computer

printf “%s\n” “$com” à computer

 

3.2. 기본적인 출력 명령어


 

3.2.1. 사용자로부터 값을 입력 받는 read

사용법 : read [-t timeout] [-p prompt] [-a array] [-n nchars] [-d delim] 변수명

-t

사용자로부터 입력 받을 시간을 설정하여 입력한 시간을 초과하면 자동으로 넘어간다.

-p

입력 프롬프트의 형태를 지정하며 문자열을 이용하여 출력

-a

입력 받은 변수가 배열임을 정의

-n

입력 받을 값의 크기 설정(문자의 개수)

-d

지정한 문자열을 입력 때까지 입력 받음

-r

입력한 이스케이프 문자를 인식

-s

사용자로부터 입력 받은 문자를 프롬프트에 echo 하지 않기 때문에 주로 패스워드 입력에 이용. 같은 명령어로 “sty –echo” 프롬프트 echo 기능을 정지 하며 “sty echo” 프롬프트 기능을 활성화 한다.

 

ex) #read –p “Input name : “ –t 10 –n 5 read_value

 

주의 : 변수를 대입 변수 = 같은 형태로 사이에 스페이스를 넣게 되면 대입연산이 아니라 비교 연산이 된다.

4. 기본적인 스크립트

4.1 스크립트의 실행

 만들어진 쉘을 실행하는데 sh 명령어를 이용하거나 또는 스크립트 파일의 실행권한을 활성화 하여 일반 실행 파일처럼 사용하면 된다.

 

4.2. 스크립트의 구분 인자

  스크립트는 명령어와 명령어의 옵션 매개변수로 구분되며 명령어와 명령어의 구분인자로는 Enter 또는 ; 이며 명령어의 옵션 매개변수는 tab 또는 하나 이상의 space 구분 있다.

 

4.2.1 IFS인자 구분 매개 변수

 IFS 구분 인자를 저장하고 있는 변수로, 기본적으로 “space, tab, newline”이다. 만일 특정 문자를 구분인자로 설정하기 위해서 IFS 값을 다른 값으로 지정하여 사용 있다.

 

 

'Programing > etc' 카테고리의 다른 글

Bitbucket - SourceTree OpenSSH 키 등록  (0) 2014.04.03
$'\r': command not found  (0) 2014.04.02
addr2line 사용법  (0) 2014.03.25
tinyxml 문제점??  (0) 2013.01.08
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
Posted by 부우산사나이
:

1.  Cygwin에서 아래와 같이 입력해준다.

    $ ssh-keygen -t rsa


2. 처리가 잘되면 C:\cygwin64\home\(사용자아이디)\.ssh   이 폴더안에

 id_rsa
 id_rsa.pub
 known_hosts

이 세가지 파일이 생긴다.

id_rsa.pub 이파일은 BItbucket에 넣어줘야 할 키값이고

id_rsa 이 파일은 SourceTree에 넣어줘야 할 키값이다.

 

 

빨간색 부분 Manage account 클릭한다.

 

 

 

 

여기까지하면 Git 서버에 키값이 등록 완료 된다.

 

이제 SourceTree에 키값 등록만 하면 된다.

 

 

 

이렇게 하면 모든 것이 끝.

'Programing > etc' 카테고리의 다른 글

쉘 스크립트(shell script) - 명령어  (0) 2014.10.23
$'\r': command not found  (0) 2014.04.02
addr2line 사용법  (0) 2014.03.25
tinyxml 문제점??  (0) 2013.01.08
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
Posted by 부우산사나이
:

cygwin 에서 쉘을 실행 시킬 때 나오는 에러

 

윈도우 환경에서 텍스트 작업으로 \n을 리눅스 환경에서 인식 되지 않는 문제

 

해결 방법

 

dos2unix 원하는파일명

 

'Programing > etc' 카테고리의 다른 글

쉘 스크립트(shell script) - 명령어  (0) 2014.10.23
Bitbucket - SourceTree OpenSSH 키 등록  (0) 2014.04.03
addr2line 사용법  (0) 2014.03.25
tinyxml 문제점??  (0) 2013.01.08
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
Posted by 부우산사나이
:

addr2line 사용법

Programing/etc 2014. 3. 25. 18:07 |

http://www.novasky.net/1435

'Programing > etc' 카테고리의 다른 글

Bitbucket - SourceTree OpenSSH 키 등록  (0) 2014.04.03
$'\r': command not found  (0) 2014.04.02
tinyxml 문제점??  (0) 2013.01.08
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
obb  (0) 2012.05.22
Posted by 부우산사나이
:

tinyxml 문제점??

Programing/etc 2013. 1. 8. 19:33 |

tinyxml을 이용해서 안드로이드 게임 개발 중인데

 

윈도우 환경에서는 xml로딩 문제가 전혀 없었다

 

하지만 안드로이드 환경에서는 가끔씩 파일을 로드 할수 없는 경우가 생겼다.

 

그래서 찾아보니 좋은 글이 있어서 적용 해봤는데 결과는 지켜보면 알듯!!

 

xml데이터 자체가 딱 <?로 시작하지 않고 \r이나 \n이 포함 되는 경우가 생겨서 문제가 생길수 있다는 글이였다.

 

std::string temp = (char*)pData;

 int startidx = temp.find("<?");
 temp = temp.substr(startidx, temp.length());

 Parse( temp.c_str() );

 

제발 문제 발생 안했음 좋겠다.

 

참고 블로그 : http://blog.naver.com/superchangho?Redirect=Log&logNo=70130447378

'Programing > etc' 카테고리의 다른 글

$'\r': command not found  (0) 2014.04.02
addr2line 사용법  (0) 2014.03.25
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
Posted by 부우산사나이
:

http://blueasa.tistory.com/465

'Programing > etc' 카테고리의 다른 글

addr2line 사용법  (0) 2014.03.25
tinyxml 문제점??  (0) 2013.01.08
obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
Posted by 부우산사나이
:

obb

Programing/etc 2012. 5. 22. 18:35 |

struct ST_OBB // OBB구조체
{
     D3DXVECTOR3 vCenterPos; // 상자 중앙의 좌표
     D3DXVECTOR3 vAxisDir[3]; //상자에 평행한 세 축의 단위벡터
     float  fAxisLen[3]; // 상자의 평행한 세 축의 길이 fAxisLen[n]은 vAxisDir[n]에 각각 대응한다.

};

 

 

 // ST_OBB 구조체 두개의 포인터를 각각 인자로 받아, 두 OBB의 충돌 여부를 체크하는 함수

// 충돌 시 TRUE리턴, 충돌하지 않으면 FALSE 리턴

BOOL CheckOBBCollision( ST_OBB* Box1, ST_OBB* Box2 )
{
     double c[3][3];
     double absC[3][3];
     double d[3];

     double r0, r1, r;
     int i;

     const double cutoff = 0.999999;
     bool existsParallelPair = false;

     D3DXVECTOR3 diff = Box1->vCenterPos - Box2->vCenterPos;

 

     for( i = 0 ; i < 3 ; ++i )
     {
          c[0][i] = D3DXVec3Dot( &Box1->vAxisDir[0], &Box2->vAxisDir[i] );
          absC[0][i] = abs( c[0][i] );
          if( absC[0][i] > cutoff )
               existsParallelPair = true;
     }
     d[0] = D3DXVec3Dot( &diff, &Box1->vAxisDir[0] );
     r = abs( d[0] );
     r0 = Box1->fAxisLen[0];
     r1 = Box2->fAxisLen[0] * absC[0][0] + Box2->fAxisLen[1] * absC[0][1] + Box2->fAxisLen[2] * absC[0][2];

     if( r > r0 + r1 )
          return FALSE;

 

     for( i = 0 ; i < 3 ; ++i )
     {
          c[1][i] = D3DXVec3Dot( &Box1->vAxisDir[1], &Box2->vAxisDir[i] );
          absC[1][i] = abs( c[1][i] );
          if( absC[1][i] > cutoff )
               existsParallelPair = true;
     }
     d[1] = D3DXVec3Dot( &diff, &Box1->vAxisDir[1] );
     r = abs( d[1] );
     r0 = Box1->fAxisLen[1];
     r1 = Box2->fAxisLen[0] * absC[1][0] + Box2->fAxisLen[1] * absC[1][1] + Box2->fAxisLen[2] * absC[1][2];

     if( r > r0 + r1 )
          return FALSE;

 

     for( i = 0 ; i < 3 ; ++i )
     {
          c[2][i] = D3DXVec3Dot( &Box1->vAxisDir[2], &Box2->vAxisDir[i] );
          absC[2][i] = abs( c[2][i] );
          if( absC[2][i] > cutoff )
               existsParallelPair = true;
     }

     d[2] = D3DXVec3Dot( &diff, &Box1->vAxisDir[2] );
     r = abs( d[2] );
     r0 = Box1->fAxisLen[2];
     r1 = Box2->fAxisLen[0] * absC[2][0] + Box2->fAxisLen[1] * absC[2][1] + Box2->fAxisLen[2] * absC[2][2];

     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( D3DXVec3Dot( &diff, &Box2->vAxisDir[0] ) );
     r0 = Box1->fAxisLen[0] * absC[0][0] + Box1->fAxisLen[1] * absC[1][0] + Box1->fAxisLen[2] * absC[2][0];
     r1 = Box2->fAxisLen[0];

     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( D3DXVec3Dot( &diff, &Box2->vAxisDir[1] ) );
     r0 = Box1->fAxisLen[0] * absC[0][1] + Box1->fAxisLen[1] * absC[1][1] + Box1->fAxisLen[2] * absC[2][1];
     r1 = Box2->fAxisLen[1];

     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( D3DXVec3Dot( &diff, &Box2->vAxisDir[2] ) );
     r0 = Box1->fAxisLen[0] * absC[0][2] + Box1->fAxisLen[1] * absC[1][2] + Box1->fAxisLen[2] * absC[2][2];
     r1 = Box2->fAxisLen[2];

     if( r > r0 + r1 )
          return FALSE;

 

     if( existsParallelPair == true )
          return TRUE;

 

     r = abs( d[2]*c[1][0] - d[1]*c[2][0] );
     r0 = Box1->fAxisLen[1] * absC[2][0] + Box1->fAxisLen[2] * absC[1][0];
     r1 = Box2->fAxisLen[1] * absC[0][2] + Box2->fAxisLen[2] * absC[0][1];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[2]*c[1][1] - d[1]*c[2][1] );
     r0 = Box1->fAxisLen[1] * absC[2][1] + Box1->fAxisLen[2] * absC[1][1];
     r1 = Box2->fAxisLen[0] * absC[0][2] + Box2->fAxisLen[2] * absC[0][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[2]*c[1][2] - d[1]*c[2][2] );
     r0 = Box1->fAxisLen[1] * absC[2][2] + Box1->fAxisLen[2] * absC[1][2];
     r1 = Box2->fAxisLen[0] * absC[0][1] + Box2->fAxisLen[1] * absC[0][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[0]*c[2][0] - d[2]*c[0][0] );
     r0 = Box1->fAxisLen[0] * absC[2][0] + Box1->fAxisLen[2] * absC[0][0];
     r1 = Box2->fAxisLen[1] * absC[1][2] + Box2->fAxisLen[2] * absC[1][1];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[0]*c[2][1] - d[2]*c[0][1] );
     r0 = Box1->fAxisLen[0] * absC[2][1] + Box1->fAxisLen[2] * absC[0][1];
     r1 = Box2->fAxisLen[0] * absC[1][2] + Box2->fAxisLen[2] * absC[1][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[0]*c[2][2] - d[2]*c[0][2] );
     r0 = Box1->fAxisLen[0] * absC[2][2] + Box1->fAxisLen[2] * absC[0][2];
     r1 = Box2->fAxisLen[0] * absC[1][1] + Box2->fAxisLen[1] * absC[1][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[1]*c[0][0] - d[0]*c[1][0] );
     r0 = Box1->fAxisLen[0] * absC[1][0] + Box1->fAxisLen[1] * absC[0][0];
     r1 = Box2->fAxisLen[1] * absC[2][2] + Box2->fAxisLen[2] * absC[2][1];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[1]*c[0][1] - d[0]*c[1][1] );
     r0 = Box1->fAxisLen[0] * absC[1][1] + Box1->fAxisLen[1] * absC[0][1];
     r1 = Box2->fAxisLen[0] * absC[2][2] + Box2->fAxisLen[2] * absC[2][0];
     if( r > r0 + r1 )
          return FALSE;

 

     r = abs( d[1]*c[0][2] - d[0]*c[1][2] );
     r0 = Box1->fAxisLen[0] * absC[1][2] + Box1->fAxisLen[1] * absC[0][2];
     r1 = Box2->fAxisLen[0] * absC[2][1] + Box2->fAxisLen[1] * absC[2][0];
     if( r > r0 + r1 )
          return FALSE;

 

     return TRUE;
}

'Programing > etc' 카테고리의 다른 글

tinyxml 문제점??  (0) 2013.01.08
킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
Posted by 부우산사나이
:

가상함수를 사용하지 않는다면..

여러 파생클래스를 가지는 CTimekeeper라는 기본 클래스가 있다고 가정해보자.

이 클래스에 getTimeKeeper라는 팩토리함수( 새로 생성된 파생 클래스 객체에 대한 기본 클래스 포인터 반환 함수 ) 을 만들었다면,

   CTimeKeeper* ptk = getTimeKeeper();     // CTimeKeeper클래스 계통으로부터 동적으로 할당된 객체를 얻는다.

위와 같이 사용을 한뒤 삭제를 해야한다.

   delete ptk;

하지만 위와 같이 삭제를 할 경우 문제가 발생한다.

   1. getTimeKeeper함수가 반환하는 포인터가 파생 클래스객체에 대한 포인터이다.

  2. 이 포인터가 가르키는 객체가 삭제될 때는 기본 클래스 포인터를 통해 삭제된다.

  3. 결정적으로 기본 클래스에 들어있는 소멸자가 비가상 소멸자이다.( 기본 클래스( CTimeKeeper )의 소멸자가 비가상 소멸자라는 가정 하에 )

위와 같은 상황에선 파생클래스(상속받은)의 멤버들은 삭제되지 않고 소멸자도 실행되지 않는다. 

 

해결방법

가상 소멸자를 사용하면 된다.간단하다..

   ps. 가상 함수를 가진 클래스를 보면 거의 가상 소멸자를 사용해야한다.

 

가상함수 남발로 인한 문제점

클래스에 별도의 자료구조( 가상 함수 테이블 )이 들어가게 된다.

   ps. 가상 함수 테이블 : 가상 함수 테이블 포인터 배열 ( 프로그램 실행 중 주어진 객체에 대해 어떤 가상 함수를 호출해야 하는지 판단하는 정보 )

그로 인해 C 등의 다른 언어로 선언된 동일한 자료구조와 호환성이 없어지고 객체 자체의 크기도 커지게 된다.

   ps. 클래스에 가상 함수가 하나라도 들어 있는 경우에만 가상 소멸자를 사용한다.

 

 가상 소멸자가 없는 것들에 주의하자

 STL 컨테이너 타입 전부 ( vector, list, set 등 ), string클래스 등

이러한 것들을 상속하여 사용하지 않도록 주의 하도록 한다.

 

순수(pure)가상 소멸자

경우에 따라 순수 가상 소멸자를 두면 편리하게 사용할 수 있다.

   ps. 추상 클래스( 그 자체로는 자신 타입의 객체를 생성할 수 없는 )로 만들려고 하지만 마땅히 넣을 순수 가상 함수가 없을 경우 순수 가상 소멸자를 만든 다.

   class AWOV

   {

 public :

virtual ~AWOV() = 0;

   };

   주의점 : 반드시 순수 가상 소멸자의 정의를 해 두어야 한다.

 

 

 

* 다형성을 가진 기본 클래스에는 반드시 가상 소멸자를 선언해야 한다. 즉 어떤 클래스가 가상 함수를 하나라도 갖고 있으면, 이 클래스의 소멸자도가상 소멸자이어야 한다. 

* 기본 클래스로 설계되지 않았거나 다형성을 갖도록 설계되지 않은 클래스에는 가상 소멸자를 선언하지 말아야 한다. 

'Programing > etc' 카테고리의 다른 글

킹스툴즈 2008 ( 비주얼스튜디오 문서화 )  (0) 2012.06.12
obb  (0) 2012.05.22
xml 장점 단점  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
STL Map  (0) 2012.05.21
Posted by 부우산사나이
:

xml 장점 단점

Programing/etc 2012. 5. 21. 12:19 |

간편성

일단 간편성이란, XML의 단순한 문법과 형식을 뜻합니다. Tagging과 tree구조라는 것만 잘 알면 XML구조의 전부를 이해했다고도 할 수 있지요. 그리고 XML파일은 텍스트 형식이기 때문에 컴파일도 필요하지 않은 아주 간편한 언어입니다.


호환성

유니코드로 작성되는 텍스트 형식이기 때문에, XML문서는 호환성도 매우 좋습니다. XML문서는 유니코드를 인식하는 모든 운영 체제 상에서 호환성 있는 문서가 됩니다.


확장성

확장성은 HTML언어와 비교하면 쉽게 이해하실 수 있습니다. HTML의 경우 정해져 있는 tag외의 다른 tag를 우리가 정의할 수 없습니다. 하지만 XML은 메타 언어이기 때문에 얼마든지 새로운 tag를 정의해서 사용할 수 있지요. 이것이 XML의 확장성입니다.


누구나 알 수 있는 Context 정보

XML문서는 data와 meta-data가 tag형식으로 동시에 저장됩니다. 따라서 누구나 쉽게 data와 meta-data를 구분할 수 있고, 따라서 쉽게 이해할 수 있는 구조를 가지고 있지요.


내용과 표현의 분리

또한 XML 문서 자체는 데이터의 표현을 어떤 식으로 할지 컨트롤 하지 않습니다. XML 문서가 다루는 것은 오직 데이터내용의 구조화이지요. 우리는 XSL같은 또 다른 언어를 사용하여 XML문서의 data를 표현하게 됩니다. 즉, data의 내용과 표현이 완전히 분리되어 있기 때문에 우리는 data를 좀더 쉽게 다룰 수 있게 됩니다.


데이터의 비교와 연산이 간편

Tree구조인 XML 문서는 데이터 검색 시에 비교, 연산 과정이 간단하기 때문에 원하는 결과를 더욱 빨리 얻게 할 수 있습니다.


네, 하지만 아직도 그리 와 닫지는 않을 겁니다. 왜냐하면 여러분이 실제로 XML을 많이 써보지 않았기 때문이죠. 그럼 한번 고수들의 경험담을 들어볼까요? 사실 저도 XML을 거의 써보지 않았기 때문에 인터넷에서 몇 가지를 퍼왔습니다.


 

 

단점

 

관리는 편해도
직접열어서볼때 난해한것도 있지
구조가 플밍에 맞춰져있어서
트리형태로 저장되니
직접 에디팅하기엔 좀 무리지
데이터 + 구조 = xml
덕분에 용량커지고 내부 텍스트 복잡도가 올라가서 데이터량이 많아지면 사람이 직접보기엔 힘듬

용량이 크다.

'Programing > etc' 카테고리의 다른 글

obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
순수, 가상함수 차이 활용  (0) 2012.05.21
STL Map  (0) 2012.05.21
run-time error  (0) 2012.05.21
Posted by 부우산사나이
:

class AA 
{
public:
 virtual void Jaeho() = 0;  순수가상 함수
};

class A : public AA
{
public:
 virtual void Jaeho()  가상함수
 {
  printf ("나는 재호야\n");
 }
};

class B : public AA
{
public:
 virtual void Jaeho()
 {
  printf ("나는 진호야\n");
 }
};

int main()
{
 AA* jaeho = new A();
 AA* jinho = new B();
 AA* jjj = new B();

 jaeho->Jaeho();
 jinho->Jaeho();
 jjj->Jaeho();
 return 0;
}

 

순수 가상함수는 상속 받은 자식들이 꼭 정의해서 써먹어야 할때 써먹음 인터페이스같이 사용

가상함수는 오버라이드개념 자기에 맡게 내용 정의하면 됨

 

사용 예 )

 

액션일 경우

기본 baseaction이라는 클래스를 만들어

onStart() =0

onEnd()=0

onUpdate()=0

이런식으로 액션의 시작 끝 업데이트 순수 가상 함수를 만들어 놓은다

 

그다음 죽는액션 이동액션 공격액션등 baseaction을 상속 받아

onstart등 액션마다 다른 행동 할것을 코딩하면 된다.

 

'Programing > etc' 카테고리의 다른 글

obb  (0) 2012.05.22
소멸자를 가상함수로 해야 하는 이유  (0) 2012.05.21
xml 장점 단점  (0) 2012.05.21
STL Map  (0) 2012.05.21
run-time error  (0) 2012.05.21
Posted by 부우산사나이
: