XML...eXtensible MarkUp Language
일단 용어는 각설하고 본론으로 들어간다.
테이블이 지원되지 않는다는 가정하에 생각을 해보자..
가령 게임 주인공이 한마리 있다
기본 속성으로는
이름: name = "MCHELLO"
공격력 attackPower = 10.5
체력 maxHealth = 200
레벨 level = 1;
정도가 있다고 가정해보자.
사용자는 게임을 하다가 Save하기를 원한다. 게임을 재 가동했을때 자기 캐릭터의 능력치가 초기화 되어있는 x같은 상황은 꿈도 꾸기 싫다.
가장 원초적인 방법은 다음과 같은 속성들을 통 스트링으로 묶는것이다
string saveData = "MCHELLO#10.5#200#1"
그리고나서 완성된 이 통 스트링을 바이너리 형태로 저장한다.
"저장완료"
로드시에서는 이렇게 될것이다.
/*주석
통 string의 구조 0번째 이름, 1번째 공격력, 2번째 체력, 3번째 레벨
*/
1. 바이너리 데이터를 불러와서 다시 string형태로 바꾼다.
2. 통스트링을 구분자( # )기준으로 배열에 담는다.
ex) arr[ 0 ] = MCHELLO, arr[ 1 ] = 10.5, arr[ 2 ] = 200, arr[ 3 ] = 1;
3. 다시 이 값을 속성에 적용해준다
name = arr[ 0 ];
attackPower = arr[ 1 ];
.
.
.
이게 가장 원초적인 방법이다. 간단한 게임에서는 이와 같은 방법이 매우 효율적이다. 하지만 데이터의 종류가 늘어날 수록 파싱하기가 x같아진다..
그럴때 사용하는것이 바로 Dictionary다
Dictionary는 key, value형태로 데이터를 물고 있다, 인덱스가 중요하지 않다.
saveDic.insert( "name", "MCHELLO" );
saveDic.insert( "attackPower", 10.5 );
.
.
.
가져올때도 매우 직관적이다
name = valueForKey( "name", saveDic );
attackPower = valueForKey( "attackPower", saveDic );
하지만 저장되는 캐릭터가 추가된다면 어떨까??
"name", "attackPower"로 사용하던 key값을 한 Dictionary에 때려박기 위해서는 다음과 같이 해야할 것이다.
"mchelloName", "mchelloAttackPower", "tomName", "tomAttackPower"
매우 작업이 비 효율적으로 진행된다.
로컬만 예로 들어도 이런데 Web으로 접근하면 머리 아파진다.
그래서 우리는 DB를 사용한다
DB에 대한 설명은 생략한다.
하지만 개발자들은 꼭 DB에 접근하지 않아도 보기좋게 정리된 파일 포맷을 주고 받기를 원한다.
그래서 나온게 XML이다.
위의 데이터를 XML형태로 바꾸면 다음과 같다
<main>
<character>
<name>MCHELLO</name>
<attackPower>10.5</attackPower>
</character>
</main>
캐릭터가 한명 더 추가되어도 문제없다
<main>
<character>
<name>MCHELLO</name>
<attackPower>10.5</attackPower>
</character>
<character>
<name>TOM</name>
<attackPower>20.2</attackPower>
</character>
</main>
매우 직관적이다. 어떻게 파싱하고 어떻게 쓰는지 몰라도 일단 눈에 딱 들어온다. 최고다!!
하지만 XML 역시 문서파일이기 때문에 글자 수에 따라서 파일용량에 차이가 난다.
다음과 같은 형식으로 쓰는 사람도 많다
<main>
<character name="MCHELLO" attackPower="10.5"/>
<character name="TOM" attackPower="20.2"/>
</main>
이렇게 작성한 파일은 .xml의 확장자를 가지고 저장되며 왠만한 언어는 모두 기본적인 xmlParser를 제공한다.
Parser의 종류는 크게 DOM방식과 SAX방식으로 갈리는데
DOM은 XML데이터를 parser가 통짜로 긁어와서 트리화 시킨다. 개발자는 그 트리에 접근해서 XML을 사용하면 된다.
ex) xml = new XML( "saveData" );
xml.character[ 0 ].name[ 0 ] // output :: "MCHELLO"
xml.character[ 1 ].name[ 0 ] // output :: "TOM"
SAX방식은 XML파일의 전체 노드를 긁으면서 이벤트를 발생시킨다. 그 때 그때 상황에 맞게 개발자가 data를 정리하면된다.
ex)
xml.parse( "saveData" );
void StartElement( string _nodeName, string _value )
{
if( _nodeName == "attackPower" )
{
myList.push( _value ) // output :: 10.5
}
}
확실히 DOM방식보다 SAX방식은 개발자에게 손이 많이간다.
적당한 크기의 XML이라면 DOM방식이 쓰기 훨씬 수월할 수 있으나 XML의 용량이 크다면, SAX방식의 처리가 훨씬 빠르다.
iOS 에서는 plist형태의 문서파일도 매우 선호한다. 이 역시 뜯어보면 XML이다.
JSon도 많이 쓰는 추세다.
모두가 각각의 장단점을 갖고 있으며 개발자 입맛대로 쓰면 되겠다.
끝.
P.S euc-kr 좀 쓰지마 ㅅㅂ
댓글 영역
획득법
① NFT 발행
작성한 게시물을 NFT로 발행하면 일주일 동안 사용할 수 있습니다. (최초 1회)
② NFT 구매
다른 이용자의 NFT를 구매하면 한 달 동안 사용할 수 있습니다. (구매 시마다 갱신)
사용법
디시콘에서지갑연결시 바로 사용 가능합니다.