세종사이버대학교 대학원은 여러분과 함께 희망찬 미래를 꿈꾸고 만들어 갈 것 입니다.
[정보보안특강] Tool & Language
2015.10.29
30189
우리 모바일 어플리케이션 개발학과는 제가 이야기 한대로 한 달에 한 번씩 이렇게 특강을 할 겁니다. 온라인으로 수업을 하지만 온라인에서 부족했던 부분을 특강을 통해서 좀 더 많은 내용을 이야기하고, 서로 배우면서 학우들도 만나는 알찬 시간을 갖겠습니다. 온라인으로 수업을 하게 되면 본인이 많이 아는 것도 있지만, 학우들이나 나한테 물어보면서 좋은 비전을 쉐어할 수 있어요. 여러분이 더욱 더 큰 꿈을 꾸고 미래를 개발하기에 좋은 시간이 될 겁니다. 성공의 법칙은 여러 가지가 있는데, 아시겠지만 성공하려면 최소한 만 시간을 투자하라는 말이 있어요. 만 시간이라고 하면, 여기 써 봅시다. 만 시간 성공의 법칙. 만 시간은 어떻게 나온 시간이냐 하면, 하루에 적어도 세 시간 곱하기 10년. 누구 계산기 가지고 계신 분 계산해 보세요. 10년 하면 만 시간이 될 거에요. 한번 계산해보세요. 맞나요? 박지성 선수도 그렇고, 골프선수 신지애, 최나연, 수영선수 누구에요? 국가대표 박태환. 이렇게 성공한 사람을 보면 하루에 세 시간씩 10 년. 즉, 만 시간을 투자해서 이룬 결과가 성공입니다. 꾸준한 노력과 집중을 해야 이룰 수 있다는 이야기인데, 물론 5천 시간으로 5년 내에 성공할 수도 있지만, 이 정도는 투자해야 성공할 수 있지 않느냐 하는 이야기가 있습니다. 여러분이 모바일 업계에서 성공하길 소망하겠습니다. 그럼 시작합시다. 오늘은 모바일 어플리케이션의 Tool과 Language에 대해 학습하는 알찬 시간이 되겠습니다. 제가 웹 개발언어, 웹 개발 방법론의 진화, 웹 어플리케이션 표준화 동향, 웹 개발사례, 그리고 무료 앱 순위까지 참고로 말씀 드리겠습니다. 그 다음으로 네이티브 웹 개발에 여러 가지 종류가 있지만 특히 XML, JAVA에 대해 관심이 많아서……. 저는 안드로이드 7주 과정을 수료했는데, 안드로이드 개발할 때 화면과 레이아웃은 XML로 하고, 로직은 JAVA로 했습니다. 우리 나승욱 강사가 여러분을 위해서 많은 준비를 했습니다. 이런 목차로 여러분과 학습하는 시간을 갖도록 하겠습니다. 먼저 웹 개발언어에 대해서, 우선 웹으로 하는 것도 있지만 네이티브 앱에 대해서 한번 봅시다. 네이티브 앱 개발언어는 잘 아시다시피 OS에 따라 4가지가 있습니다. 여러분, OS와 플랫폼을 잘 구분하셔야 합니다. OS+미들 웨어+UI까지가 플랫폼이고, OS는 그것보다 좀 더 작은 범위입니다. OS에 따라서 bada, 안드로이드, 애플 ios, 윈도우 모바일 7로 구분할 수 있습니다. 개발할 때의 사용언어로 바다에서는 c, c++ 네이티브 랭귀지, 이 안에 실행어를 다 포함하는 것이죠. 지금 삼성전자에서 준비를 많이 하고 있습니다. 우리나라의 대표 기업이 삼성전자인데, 나름대로의 OS와 플랫폼을 가지고 세계 시장의 하드웨어 연구를 많이 하고 있습니다. 애플이나 구글처럼. 핸드폰이 사실 하드웨어 비즈니스잖아요. 안드로이드는 사용언어가 JAVA인데, JAVA는 인터프렉터 랭귀지이죠. JAVA는 말씀 드렸다시피 XML하고 같이 하는데, 참 구글 진영의 머리가 좋아요. 안드로이드가 JAVA를 왜 로직 랭귀지로 사용했을까요? 왜 JAVA를 채택했을까요? 우리 나 대표는 아시겠지. 다 맞는 이야기인데 100점짜리 답변은 뭐냐 하면, JAVA가 뭐에요? 오픈 소스 아니야. 그렇죠? 공짜 아니야. 그러니까 안드로이드 진영에서 공짜를 가져다 쓰면 되잖아요. 오픈 소스니까, 그런 의미에서 오픈 소스를 쓴다는 안드로이드 진영의 머리가 좋은 거에요. 그리고 ios에서는 오브젝트 C를 가져다 쓰고, 마이크로소프트 진영의 윈도우에서는 C샵을 가지고 준비하고 있죠. 노키아가 지금 이쪽으로 줄 서 있어요. 전에는 노키아의 핸드폰 매출 순위가 1위였는데, 3위로 떨어졌어요. 지금은 1위가 삼성, 2위가 LG, 노키아가 3위에요. 노키아 진영도 윈도우 쪽으로 나름대로 경영 혁신을 꾀했는데, 지금은 4파전으로 보면 되겠습니다. 이제 여기에 홀 셀 어플리케이션 커뮤니티라고, 통신사끼리의 플랫폼이 있습니다. 이렇게 아시다시피 os에 따라 4가지, 사용언어별로 네이티브 앱을 개발할 수 있습니다. 어서 오세요! 지금까지 네이티브 어플리케이션을 개발하는 것을 말씀 드렸다면, 이번에는 웹, ‘web' 개발하는 것을 한번 봅시다. 웹은 html문서를 가지고 하는 겁니다. 사실 html은 1989년 팀 버너라는 사람이 내부문서 교환용으로 개발했습니다. 역사가 오래되었죠. 그러다 1994년 5월 www 컨퍼런스, 이게 바로 w3c 의 전신인데 제네바에서 처음으로 html이 나와서 버전을 거듭하다가 지금은 html 4.0을 제일 많이 쓰고 있죠. 그 다음에 xhtml 1.0, xhtml 2.0 버전이 나왔죠. 오페라, 사파리 진영에서는 웹 1.0이라는 것을 만들었습니다. 현재 html 5까지 나와 있습니다. 나중에 제가 커버하겠지만 html 5가 라스트 퀄이고, 조만간 표준으로 갈 겁니다. 먼저 90년대에 html 을 이용해서 시작했습니다. 이때는, 주로 그 당시의 인터페이스를 통해서 개발하기 때문에 마커브하고 프로그램 코드가 뒤섞여 있었죠. 그래서 업무분담이 전혀 이루어지지 않고, 이 안에서 혼용된 시대가 1990년대의 웹 문서 시대입니다. html 문서를 이용한 웹 개발이 이때부터 시작됐습니다. 2000년대 초반에 어떤 게 나오느냐 하면, 백앤드에서 나름대로 업무분장을 하자. 즉 mvc 모델. 모드, 뷰어, 컨트롤러. 이 모드로 이 안에 스트럭쳐를 html로 하고, 레이아웃은 css로, 이 안에 다큐멘터 오브젝트 모델로 팝업이라든지 띄우고, 비즈니스 로직이 분리된 코드를 통해서 생산성이 높아지게 됐습니다. 프론트앤드에서 하는 방법, 여기서 html, css, dom 스크럽트를 분리해서 www 웹 기반방식을 많이 사용하게 되었습니다. 그런데 여전한 단점이, 웹 서버에서 많은 작업이 일어나죠. 어쨌든 2000년대 초반에 여기서부터 좀 더 css라는 표현도 나오고…….이라는 책도 있는데, 한빛 미디어에서 나온 책이에요. css에 대해서 모르는 분들, html을 꼭 따라다니는 게 css에요. 그래서 이렇게 업무분장이 되었습니다. 2000년대 후반으로 가면, 아작스가 출현합니다. 아작스의 출현으로 프론트앤드 웹 콘텐츠가 전부 이쪽 서버에서 프론트앤드 따로로 넘어가기 시작해요. 스트럭쳐 프레젠테이션 뷰가 프론트앤드로 넘어가면서 그 서버하고 아작스하고, 서버에서는 오픈 하고 서로 프로토콜 통신하면서……. 프론트앤드 부분의 웹 혁신이 일어나기 시작합니다. 프론트 웹 콘텐츠가 기존의 단말 사용자 pc로 일단 로딩이 된 후, 웹서버에서 아작스를 호출하고 데이터를 받아오는 형태가 됩니다. 프론트앤드 이쪽에서 주로 개발이 이루어지잖아요. 그래도 어느 정도 웹 서버 이 부분에서 종속적인 거죠. 어느 정도 디펜던시를 가지고 왔습니다. 그러다가 드디어 html 5가 나오면서 프론트앤드 쪽으로, 이쪽 부담을 줄어주고 이쪽으로 넘어갑니다. html 5의 기능을 많이 이용해서 이쪽으로 넘어왔어요. 현재 상황입니다. 조금 이따가 html 5에 대해 말씀 드리겠지만, 서버와 저쪽, 서버단위이지만 이게 프론트앤드 단위이고, 저쪽이 서버단위. 그래서 서버와 독립적인 웹 어플리케이션 개발이 이때부터 가능해지기 시작합니다. 오프라인 기능도 쓸 수 있고, 이 안에 데이터베이스도 가지고 있습니다. 서버와 독립적인 기능을 만들어 줍니다. 그래서 html 5의 추가적인 기능들, 캔버스라든지. 그림을 그리는 거죠. 웹 폼, 웹 sql 데이터베이스, 지올로케이션, 웹 스트로지, 웹 워커, 웹 소켓, 웹 그래픽 랭귀지. 그래픽 라이브러리를 통해서 사용자 경험을 확대해줄 수 있다는 거죠. 그래서 여기 아작스가 있고, 여기는 레스트폴로 클라이언트의 상황을 여기서 체크해주는 거죠. 그렇죠? 또 html의 추가적인 기능들이 이쪽으로 많이 넘어갔습니다. 그래서 html5가 웹 개발의 표준이 됩니다. 캔버스라든지 웹 폼, 폼 디자인이 획기적으로 많이 개선됐고, 브라우저에서 sql 데이터베이스가 캐시기능을 처리할 수 있고, 그 다음에 지올로케이션. lbs 할 때 중요한 기능입니다. 키 태그라는 기능을 웹 스트로지에 저장할 수 있고, 웹 워커라든지. 시간이 많이 걸리는 것을 쓰레드라고 하죠. 쓰레드를 할 때 시간이 많이 걸릴 때 백단위로 걸릴 때 웹 워커를 씁니다. 또 웹 소켓, 기능 보안 쪽으로 많이 향상됐고, 웹 그래픽 라이브러리도 있고. html5의 기능이 많이 탑재돼서 현재 프론트앤드에서 많은 웹 개발이 진행되는 상황입니다. 혹시 html5 써 보신 분? 나 대표, 또? 그럼 html5에 대해서 보겠습니다. html5를 이용한 웹 어플리케이션 표준화 동향. 앞으로는 html5가 웹의 표준 개발 툴이 될 겁니다. 차세대 웹 표준이고, 별도의 프로그램을 설치하지 않고 웹 브라우저만으로 동영상과 음악을 재생하고, 애니메이션 효과를 구현하고. html5는 css3와 연동됩니다. 리치 웹 응용을 가능하게 하는 것이 목적이죠. html의 주요 기능은 말씀 드린 것과 같이 css3를 통해서 사용자 인터페이스, 실시간 통신기능, 웹 소켓, 오프라인 기능이 가능하고, 지올로케이션 등 디바이스의 위치 정비……. html5의 주요 기능이 많은데, 나중에 따로 자세히 학습할 시간을 갖겠습니다. 실제 웹 개발 사례가 있는데, 이거 네이버 지식 로그에 관한 것이거든요. 질문을 보내면 숙련된 답변자들이 3분 내에 검증된 답변을 주는 지식인 서비스의 숙련된 스마트폰 버전이라고 되어있는데, 한번 써보세요. 스마트폰을 통해서 내가 모르는 것의 답변을 주고받는 비즈니스입니다. 여러 가지를 검색할 수 있고, 문자 메시지로 답변이 오고, 개인화된 질문과 답변이 가능한 웹 개발서비스입니다.‘daum’이 한국에서 처음으로 음성검색 서비스까지 제공했다는데, 여러분도 이보다 더 좋은 어플리케이션을 개발할 수 있습니다. 또 하나의 사례는 차량, 텔레매트릭스라는 거죠. 앞으로 가장 큰 스마트 디바이스는 텔레매트릭스가 될 것입니다. 차량에 탑재된 스마트 디바이스가 텔레매트릭스에요. 차에 타고 이동하는 시간이 많으니까. 차량 IT, 스마트카드, 여러 가지 스마트 모바일 기술과 연동되어 이쪽으로 많은 비즈니스가 시작되고 있습니다. 현대 모비스와 마이크로소프트가 제휴했고, 최근에는 도요타와 현대자동차가 제휴를 맺어 이쪽으로도 스마트 모바일 기술이 많이 적용될 겁니다. 다음으로 인기 무료 앱인데, 앱 스토어에서 많이 다운되는 인기 순위입니다. 배경화면 저장 앱, 컬러테스트 - 색깔로 심리 테스트를 하는 기능이네요. 커플 기념일이나 가야금, 아이폰으로 가야금을 연주할 수 있는. 여러 가지가 있고, 여기는 sk텔레콤의 t스토어, 14일 이내, 1to50도 있고, 연예인 닮은 꼴 찾기 등. 여러 가지 앱이 있는데 여러분도 이보다 더 좋은 앱을 만들 수 있습니다. 그렇죠? 중요한 건 기술보다 아이디어입니다. 창의성, 그 다음에 내가 어떻게 하겠다는 목표를 잡고, 기술이나 협업이라든지 여러 가지 방법을 찾으면 됩니다. 여러분이 학습하면서 비즈니스 아이디어를 찾아가는 것도 좋은 방법이 아닐까 생각합니다. 이렇게 제가 어플리케이션, 웹의 여러 가지 진화된 모습이라든지 개발 사례에 대해 말씀 드렸고, 지금부터 나승욱 강사가 XML, java에 대해 설명하겠습니다. 나승욱 강사 XML 강의 시작하겠습니다. 저도 같은 학생이지만 여러분보다 좀 더 개발 경험을 했고, 교수님의 요청에 의해 제가 아는 부분을 공유하고자 강의를 하게 되었습니다. 시작하겠습니다. 목차부터 말씀 드리겠습니다. 먼저 XML에 대해 소개하고, 기본 문법, DTD, Namespace, XML Parser, 그리고 XML 활용 분야와 적용사례 순서입니다. 사례는 제가 직접 개발했거나 저희 회사 개발 사례 기준으로 뽑아왔습니다. XML 이란 웹 상에서 구조화된 문서를 전송 가능하도록 설계된 마크업 언어인데, 여러분이 많이 듣고 접하는 html 자체도 마크업 언어입니다. 실제 소스를 보면 텍스트 기반이고 변형된 사례로 XML, html, wml 등의 여러 가지가 있습니다. 중요한 것은 앞에 어떤 철자가 들어가던 끝에 ml이 들어가면 다 텍스트 기반의 언어라고 보면 됩니다. Sgml이라는 이것 모두의 부모 언어가 있는데, 그건 너무 광범위하기 때문에 빼고 XML에 한정된 내용으로만 설명하겠습니다. 문서의 요소, 속성, 개체를 정의하여 자료를 구조적으로 표현하고, 스타일시트를 이용하여 다양한 형태의 문서를 생성할 수 있습니다. 저도 초반에는 XML 자체만 알면 이 스타일시트가 가능할 줄 알았는데, XML 자체로도 가능은 하지만 그 외의 다른 언어나 여러 소프트웨어로 머지를 시킨다면 좀 더 강력하고 유연하고 내가 원하는 스타일대로 만들어 낼 수 있는 기초적인 언어라고 보면 됩니다. 물론 ‘기초적’이라는 말은 어폐가 있긴 한데, 이 자체만으로 여러분이 현재까지 나오지 않은 서비스를 새롭게 만들어 낼 수도 있습니다. 여러분이 이 XML을 개요만이라도, 활용 방법이라도 알고 있다면 나중에 본 개발을 할 때 유용하게 사용하거나 ‘아! 내가 예전에 배웠는데 이 내용이 여기서 활용되는구나!’ 하고 어느 순간 느낄 겁니다. XML의 특징은 먼저 제품 플랫폼의 독립성이고, html과 유사한 텍스트 기반문서의 마크업 언어이므로 텍스트 기반의 소프트웨어 도구를 비롯한 다양한 소프트웨어 도구를 사용하여 처리할 수 있습니다. 다음은 단순성. 아까 말씀 드린 Sgml이 거의 마크업 언어의 부모라고 보면 됩니다. 끝에 붙은 ml이라는 언어가 거의 Sgml 언어에서 파생된 것입니다. Html, XML, 스마일, wml, xhtml까지 모두 Sgml에서 파생된 언어입니다. 이것의 범위가 너무 방대하고, 멀티미디어 솔루션까지 다 포함되는 내용이기 때문에 이것을 제대로 아는 분은 전 세계적으로 몇 분 안 되는 것으로 알고 있습니다. 저도 한번 해보려다가 분량이 너무 많아서 다음으로 미뤘습니다. 그리고 확장성. 문서 타입의 정의 기능을 통하여 다양한 XML 기반 문서형식으로 정의하여 사용할 수 있고, Html 문서 타입도 문법에 약간의 제약을 가하면 XML 문서 타입 중 하나가 될 수 있습니다. 기본적인 부모 언어가 Sgml이기 때문에 이런 내용이 나온 것이기도 합니다. 정확성. 주어진 응용에 가장 적합한 문서 타입의 정의를 통하여 정보를 표현함으로써, 문서 정보를 가장 적절히 표현할 수 있습니다. 통일성. 다양한 XML 문서 타입을 정의하여 사용하더라도 기본 골격은 XML 문서 형식을 따른다. 그리고 다양한 XML 응용 소프트웨어에서 XML 내용을 재사용할 수 있습니다. 이것을 간단히 풀이하자면, 기본 언어 자체가 Sgml에서 파생된 언어이기 때문에 구조는 거의 동일합니다. 다만 html 문서의 예를 들면, XML 같은 경우에는 시작, 종료 태그, 기타 몇 가지 제약사항이 있는데 그게 좀 더 다변화되고 멀티미디어까지 정모 시킨 게 html 문서라고 보면 됩니다. html하고 XML이 약간 혼합된 형태가 xhtml 이라는 문서이긴 한데, 이것도 한 범주 내의 형식이기 때문에……. 좀 다른 길로 흐르긴 했는데, 같은 범주 내에 있어서 XML을 알면 비슷한 모든 형태의 언어를 이해하는데 큰 도움이 될 것이고, 큰 차이가 없다 봐도 무방합니다. 출력 매체의 독립성, 문서 내용이 특정 출력형식과 독립적이다. html 과는 달리 XML 문서가 최종 출력된 형태. 방금 설명한 겁니다. 문서 형태는 테이블, 그래프, 이미지, txt를 출력할 수 있다. XML 자체로는 테이블, 그래프, 이미지, txt 로 나올 수가 없지만, xxl 이나 스타일시트 형태와 결합되면 테이블, 그래프, 이미지, txt, 그리고 제 3의 언어까지도 생성 가능합니다. 다음으로 넘어가겠습니다. 기본 문법으로 들어가겠습니다. 오늘 XML은 최상위 선언문이 꼭 들어가야 하는데, 여기서 인코딩부터 Standalone까지는 빠져도 XML 문법상으로는 문제가 없습니다. 인코딩부터 Standalone까지는 옵션정보이기도 합니다. 기본적으로 XML 버전, 끝에 마감 태그까지만 해도 실제 XML Parser는 XML 문법을 읽기 시작합니다. 인코딩 선언을 통해서 현재 문서가 한글인지 영문인지, 공용 UTP-8 포맷을 썼는지 지정하는 겁니다. Standalone 속성 값을 no로 지정하면, 기본 역할과 동일합니다. Yes로 지정하면, 외부 DTD를 참조하지 않음을 의미한다고 합니다. 일반적으로 Standalone은 거의 선언하지 않고, 특수한 경우는 안드로이드 개발할 때나, 추가된 라이브러리를 좀 더 확장하고 싶을 때 이 태그 선언과 함께 조합하는 형태로 사용하게 됩니다. 요소, 요소는 정의부 바로 다음에 나오는 내용인데요. 요소는 시작태그와 종료태그로 선언을 하게 되구요. 태그 이름과 요소타입의 이름은 같은 의미라고 보시면 됩니다. 어떤데는 태크명이라 하고 어떤데는 요소명이라 말하기도 하는데요. 똑같은 의미로 생각하시면 되구요. 시작태그는 보시면 아시겠지만 html 문법에 거의 똑같습니다. 태그명 있고 속성명 있고 이 속성이 여러 개 있을 수도 있고 없을수도 있구요. 그 안에 내용이 들어가고 그 다음에 마감태그가 들어가구요. 첫 번째 태그 문법 같은 경우는 내용이 있을 경우에만 사용하는 문법이구요. 이 두 번째는 내용이 없고 태그명하고 속성명만 존재한다. 그럴 경우에는 시작은 여기까지는 동일하고 그 다음에 슬러시 마감 꺾쇠를 쳐주면은 사용하게 되면은 내용 없는 바로 태그가 가능합니다. 보통 이런 내용은 html 태그 중에서 br태그라는게 있을 겁니다. br태그는 거의 속성 없이 많이 사용하게 되거든요. 하게 되는데 그런 형태로 이해를 하시면 되구요. html과는 달리 대소문자를 명확히 구분합니다. 예를 들면 여기서 아이프레임이 시작태그는 아이프레임을 소문자로 시작하고 마감태그를 대문자로 하게 되었을 경우에 파서는 오류를 일으키게 됩니다. 제가 html를 시작하고 그 다음에 xml를 공부하기 시작했는데 제가 오타를 많이 내고 에러를 많이 내는 부분이 바로 이 부분입니다. 여러분들은 기존에 개발을 접하셨거나 아니면은 새로 시작하게 될텐데요. 대소문자를 구분하는 언어가 있고 구분하지 않는 언어가 존재를 합니다. 구분하지 않는 언어 같은 경우에는 사용자가 접하기 쉽고 유연하게 특별히 에러에 대한 고민을 안하는데 이 대소문자를 구분한다는 자체는 여러분이 똑같은 이름을 짓더라고 대소문자 한 두개 차이 때문에 다른 변수나 다른 객체로 인식을 하기 때문에 이거는 주의를 하셔야 하고 제가 추천을 드리고 싶은 거는 대소문자를 구분하지 않는 언어라도 대소문자를 스스로 구분을 해서 사용을 하세요. 그게 모든 언어를 사용할 때 기본적으로 사용을 하시고 또 실제 새로운 언어를 배우기 위해서는 습관이 중요한데 일단 대소문자를 구분을 하셔서 학습을 하시는게 저로써는 많이 도움이 됐고 알려드리고 싶은 부분입니다. 이 속성이라는 값은 바로 이 부분을 말하는 것인데요. 이 꺾쇠를 제외한 문자로 시작하는데는 문제가 없습니다. 숫자가 됐든 문자열이 됐든 기타 여러 형태의 하다못해 이미지 정보까지 집어 넣을 수 있는데 시작 안에는 꺾쇠로 시작하면 안되구요 대신 이 꺾쇠를 넣어서 표현을 꼭 하고 싶을 경우에는 바로 뒷 페이지에 나올 부분인데 16진수 코드를 변환해서 쓰거나 특정 형식으로 변환하는 룰이 있습니다. 그 형태의 문자로 변환을 해서 삽입해주면은 원하는 정보를 표현이 가능합니다. 요소의 내용은 이 부분을 말하는 겁니다. 이거와 이거의 사이에 내용이라고 하는데요 자식 요소가 있고 문자 데이터가 들어갈 수 있고 CDATA 섹션들이 들어갈 수 있습니다. 자식 요소라는 건 이 아이프레임 내에 또 다른 새로운 태그가 들어갈 수 있다는 얘기구요. 문자테이터라는 거는 바로 문자열이란 겁니다. 이름이라든가 학번이라든가 학교명이라든가 이런 얘기를 말하는 거구요. CDATA라는 거는 시작태그와 종료태그의 사이에 내용으로 이러한 태그를 집어넣을 수 있는 겁니다. 태그라는 건 html태그 보통 링크주소, 이메일주소 기타 여러 가지의 스크립트 라든가 그런 경우에는 해석을 하는데 이 특수한 코드 값으로 변경을 하게 될 경우에는 인식을 못하는 경우가 있어서 이 CDATA를 앞뒤로 해줬을 경우에는 그 태그를 정확히 인식하고 표현하는데 지장이 없도록 만들어주는 별도의 스펙으로 나온 형식입니다. 문자테이터라는 것은 꺽쇠라는 거 엠퍼센트에서 사용되므로 직접 표현될수 없고 대신 엠퍼센트 엘티나 엠퍼센트 에이엔피 같은 문자를 사용해서 대처를 해서 사용이 가능하구요 그리고 문자 참조라는 건 실제 이런 에이티라는 건 특수한 문자에 대해서 표현을 하는 거구요. 그 외에 유니코드라든가 해석하기 어려운 코드들이 있습니다. 그건 것들 주로 엠퍼센트 샵 10진수로 표현하거나 16진수로 표현을 할 수 있는데요. 이런 형태로 가공을 하는 거는 주로 어디서 쓰이냐 xml 문법 자체가 텍스트 기반인데 가끔가다 xml문서에 이미지를 포함하고 싶다거나 기타 암호화된 데이터를 넣고 싶다거나 이럴 경우에는 텍스트기반의 문서자체는 바이너리 같은 정보를 담지 못하기 때문에 그것에 대체 수단으로 십진수나 16진수로 변환을 하거나 아니면은 아예 중간에 다른 컨버터 베이스 육십사라는 인코더가 있는데 그 바이너리 정보를 텍스트 기반의 정보로 변환을 해서 내용이나 속성명으로 집어 넣었을 경우에도 나중에 다시 그 원 디코드에 거쳐서 미디어정보라든가 이미지든 포함해서 활용할 수 있는 강력하고 유연한 언어이기도 합니다. CDATA 섹션 전 페이지에서 설명해 드린 거구요. CDATA 태그 안에 제임스 카메룬이나 이름 같은 이 문자열이 이건 일반 문자열인데 이 안에 링크태그를 넣었다거나 메일주소나 기타 다른 주소로 점프를 한다거나 자바스크립트 문법을 통해서 넣을 수 있는 것들입니다. 그리고 마크 표시를 포함하는 언어로 해석하지 않고 일반 문자 데이터표로 표현할 때 사용을 합니다. 이것을 좀 더 풀어드리자면 이런식으로 선언을 하면 엑스엠엘 파서라는게 얘를 엑스엠엘 문법으로 인식을 안하고 그냥 일반 문자열로 가공처리한다는 것입니다. 그리고 요소내용으로 사용이 가능하다. 요 요소 내용이라는 건 시작태그와 종료태그의 사이에서 가능하구요. 속성 값으로도 넣을 수 없고 요소와 요소 사이에 넣을 수 없다는 얘기입니다. 즉 시작태그와 종료태그가 정확히 일치하는 곳에 그 사이에만 넣을 수 있다는 얘기이구요, 주석은 엑스엠엘 문서를 작성하다 보면 설명을 넣고 싶다거나 예를 들고 싶을 때 그 때 선언하는게 주석이긴 한데요. 이런식으로 요 사이에 문자열을 집어 넣으면 어떤 형태든지 다 표현이 되고 실제 문서상에서는 표현이 되지만 엑스엠엘파서는 자동적으로 주석을 해석하지 않고 스킵해서 실제 문법만 처리하게끔 부여되어 있으니깐 제가 권장해 드리는 건 주석을 많이 사용하셔야 합니다. 엑스엠엘 문서 외 자바언어 C 그런 것들도 나중에 내가 그 소스를 열어봐서 바로 아는 경우가 거의 없습니다. 뭐 하루 이틀 지나면 바로 알겠지만 서비스가 잘 되는데 중간에 업그레이드 한다거나 수정을 한다거나 이럴 때 소스를 열어서 보게 되는데요 그게 내가 짠 내용이긴 하지만 내가 이해를 모하는 부분이 있긴 하거든요. 그것을 좀더 이해를 빨리하고 내 소스를 타인이 봤을 때도 계발에 가이드를 잘 해 주기 위해서 이 주석이라는게 꼭 필수적인 요소입니다. 일단 지금까지 알려드린 내용을 기준으로 간단한 문서를 만든 겁니다. 일반적인 XML 시작 선언 태그 있고, 현재 버전은 1.0 밖에 없습니다. 그 이상의 버전이 있다는 것은 새로운 기술이 나왔다는 이야기인데, 현재는 1.0 통일이라고 보면 됩니다. 인코딩은 UTF 8 포맷입니다. 인코딩이 UTF 8 포맷으로 정의한다는 것은 여기에 있는 내용들의 유니코드 값들이 UTF 8로 저장됐다는 뜻입니다. 만약 여기 있는 문자열이 일반적으로 생성하면 보통 MS도스, 아스키코드, EUC KR 포맷을 사용하는데, 보통 EUC KR 포맷으로 저장하여 선언문을 빠뜨리게 되면, 이러한 한글 유니코드 값들이 깨져서 나오거나 아예 안 나오거나, 불안정한 XML Parser 같은 경우에는 문서 자체를 출력하지 못 한다고 에러를 내기도 합니다. 일반적으로 JAVA 계열은 이 부분에 아주 엄격합니다. PHP 같은 다른 언어 같은 경우에는 상냥하게 어디의 어느 위치에 에러가 났다고 알려주지만, JAVA 같은 경우에는 ‘에러 났습니다’ 하고, 에러 문구 띄워주고 끝나거든요. 보통 초급자가 자주 실수하는 게, 이 한글 문자열과 인코딩을 못 맞출 경우 그렇습니다. 그리고 JAVA 서비스를 하는 경우, 국내에서는 UTF 8 포맷과 EUC KR, 두 가지를 많이 사용합니다. 그런데 실제 XML 문서 자체가 나갈 때, 클라이언트가 EUC 포맷을 원할 수도 있고, 아닐 수도 있거든요. 그래서 클라이언트가 어떤 인코딩을 원하는지 먼저 파악하고, 만약 정해지지 않았다면 기본적으로 UTF 8 포맷으로 통일하는 게 국제화나 기타 등등 모든 서비스 측면에서 충돌이나 유니코드 깨짐 현상이 덜합니다. 간단히 설명을 드릴게요. 주석 부분입니다. 실제 이것은 제가 작성하고 편집해서 예를 들어 놓은 겁니다. XML 문서 자체를 MS 익스플로러 상에서 띄운 모습입니다. 실제 소스는 아니고, 이해하기 편하도록 익스플로러에서 띄운 것입니다. 주석은 아무데나 들어가도 됩니다. 위치가 형식이 없습니다. 대신 사이에 들어가면 안 되겠죠. 요소 안에 요소가 포함될 수 있고, 중복도 가능합니다. 대신에 이 아이템 요소명 내에 이런 식으로 콘텐츠가 바뀌게 되면, XML 문법 형식에 맞지 않기 때문에 에러를 냅니다. 항상 룰은 뉴스와 뉴스 태그 사이, 이 안에 꼭 들어가야 하고, 엇갈리는 구조는 절대 안 되니까 그 형식만 정확히 지켜주세요. 그리고 CDATA 부분. 문법이나 태그가 가능하다고 말씀 드렸잖아요. 일단 요소 내용은 여기서 꺾쇠를 쓰면 에러를 내지만, C태그 안에 꺾쇠로 시작해서 이미지, 링크 부분을 알려준다면 자체는 에러를 내지 않고 사용자에게 정상적인 결과 내역으로 보이게 되는 것입니다. DTD입니다. DTD는 Sgml 또는 XML 문서의 구조와 내용을 정의하기 위한 것으로 문서의 논리적 구조를 계층적으로 표현하는 역할을 합니다. 문서에서 허용되는 element type, 각 element에 할당된 속성의 정의, 문서에 허용되는 entity, XML 문서의 검증용으로 활용한다고 말씀 드렸습니다. 이것도 XML 형태의 또 다른 문법을 가지고 있습니다. 이것을 풀이하자니 내용이 너무 길고 방대해져서 간단히 개념만 알려드리겠습니다. XML이 있으면 어떠한 요소명을 써야 하고, 어떤 속성값을 가져야 하고, 어떤 내용을 포함해야 한다는 것을 정의해놓은 문서입니다. 예를 들어, HTML의 문법상에서 A라는 링크 태그가 있을 것입니다. 링크 태그 안에는 href라는 속성명도 있고, lt 라는 속성명도 있는데, 이런 부분이 들어갔나, 들어가지 않았나? 필수적으로 들어가야 하나, 옵션으로 들어가야 하나? 그 안에 있는 내용은 링크 형태 혹은 문자나 숫자 형태인가? 에 대해 틀을 잡아주는 역할을 하는 겁니다. 쉽게 풀이하면, DTD는 XML의 어떤 요소명과 속성, 내용을 만들어내야 하는 틀을 만드는 문서이다. 이 정도만 이해하고 가셔도 됩니다. 실제 DTD는 XML이 초반에 도입이 되었을 때 많이 활용되었습니다. 주로 신문사 같은 경우는 뉴스를 공유하게 되는데, 각 신문사마다 서로 다른 XML 구조를 가지고 있었습니다. A라는 회사에서 B라는 회사로 정보를 넘기고 싶으면 중간에 작업자가 일일이 수정해서 넘겨야 했던 불편함 때문에 이 DTD를 정의해서 뉴스의 제목, 내용, 등록된 시간, 기자의 이력 같은 정보들의 여러 가지 요소를 정하고, 그 외의 것은 Parser에서 인식하지 못하게 하거나 사용하지 않은 문법에 대해서는 처리하지 않도록 틀을 만들어서 공유하기 시작했습니다. 지금은 다른 형태로 서비스하고 있겠지만, 제가 XML 배울 당시에는 신문사에서 그런 식으로 데이터를 공유한다고 배웠습니다. 이렇게 공유하면서 팩스나 해외로 전송한다고 들었는데, 요즘 DTD는 거의 사용하지 않고 Namespace나 각 업체들이 정의한 구조적인 부분에 대해서 검증 없이 사용하는 예가 많습니다. 대신에 꼭 이런 부분을 써야 하겠다. 예를 들면, 스마트폰에서 내가 만든 어떠한 데이터를 보여주기 위해서는 꼭 이 형식을 맞춰줘야 한다. 그러면 XML 문서를 보내는 것이 아니라 DTD만 보내면 되거든요. DTD를 보내면 DTD에 의거한 XML 문서 자체를 자동으로 만들어주는 소프트웨어가 있습니다. XML 스파이라는 소프트웨어인데, 저는 초반에 배울 때만 써봤습니다. 그 소프트웨어가 대단한 놈입니다. 유용하게 많이 써먹기도 하고, 현재도 XML을 배우는 초급용 책에는 항상 XML 스파이라는 소프트웨어를 소개하거나 관련된 프로젝트를 진행하고 있습니다. Namespace. 이 부분은 빼려고 했는데, 안드로이드 어플 개발에서는 Namespace를 사용하게 됩니다. 그래서 간략하게 소개하고 개념만이라도 짚고 넘어가도록 포함했습니다. 솔직히 저도 개념만 알고 있고 실제로 문서를 만들거나 응용한 사례는 없습니다. 개념 정도만 공부해서 알려드리는 겁니다. Namespace란 XML 문서에서 element나 attribute의 이름으로 쓰일 수 있는 이름들의 집합인데, 논리적으로 이름을 구분하기 위해 사용합니다. 전 세계적으로 고유한 요소, 속성 이름을 생성합니다. 스키마, 네임스페이스 내의 DTD를 포함하거나 재사용하여 변환하는 형태인데, 경험이 없기 때문에 정확한 예를 들지는 못하겠습니다. 서로 다른 규격의 XML 문서들을 1개의 문서 내에 통합하여 사용합니다. 이 내용이라는 것은 XML 문서 내의 상당 부분에 Namespace의 내용 부분을 기재한다거나 DTD도 포함을 하여 같은 XML 문서 내에 XML 문서, Namespace, DTD 문법 등의 혼용이 가능하다는 말입니다 Namespace의 참조. 이름에 콜론이 사용된 경우, 앞부분이 이름 공간을 나타내는 접두어로 해석됩니다. Namespace의 선언을 보면, 요소의 속성으로 Namespace를 선언하고 하나의 요소에 여러 개의 Namespace 선언이 가능합니다. 하나의 XML문서 안에 Namespace가 여러 번 중복 가능하고, 단일로 써도 된다는 겁니다. Namespace 접두어, Namespace URL을 입력하게 되는데, URL에서 가져온 정보를 기준으로 접두어라는 것을 지정합니다. 하위 자손의 요소들은 접두어를 사용하여 하위 요소명의 선언이 가능합니다. 이 자손 요소의 요소 속성 이름에 Namespace 접두어를 붙여서 지정합니다. XML Namespace URI을 입력하게 되면, 이것은 별도의 접두어가 포함되어 있지 않기에 일반 요소명을 지정할 수 있는데, 그 요소명은 디폴트로 지정된다는 이야기입니다. 여기서 선언한 Namespace명으로 자동 지정되기 때문에 간혹 오류가 나는 부분이 있습니다. 이 오류는 위쪽의 Namespace를 지정했는데, 이 Namespace에 포함되지 않은 요소들을 지정하면 100% 에러가 납니다. 저도 이것을 찾으려고 시간을 보낸 적이 있는데, Namespace URL에 정확한 접두어가 붙었는지 붙지 않았는지, 활용할 수 있는 영역이 어느 정도 포함될 수 있는지 파악하셔야 합니다. Namespace가 정의된 영역을 해지하고 싶다면, XML Namespace 하고 공백을 집어넣으면 기존에 선언된 요소 및 속성이 모두 취소되고, 디폴트 XML 문법 형태로 Parser가 인식합니다. 제가 직접적으로 활용한 사례가 없기 때문에 설명이 부드럽지 않은 점에 대해서 양해바랍니다. 예제 설명 드릴게요. Namespace의 접두어가 없는 채로 URL을 지정하고, 범위는 여기서부터 여기까지입니다. 범위를 벗어나면 Namespace의 영역이 아니기 때문에 당연히 오류를 일으킵니다. 범위를 꼭 파악하셔야 하고……. HTML 요소명의 콜론하고 UL이라는 요소명이 들어갔습니다. 실제 사용되는 접두어입니다. Namespace에 정의된 접두어입니다. 여기 정의된 곳은 바로 이쪽입니다. 위에서도 지정했지만 중복 지정이 가능하기 때문에 새로운 Namespace를 지정하고, Namespace의 접두어는 HTML로 하겠다. 그러면 HTML로 정의된 Namespace의 접두어 다음에 콜론, Namespace 내에 포함된 요소명을 지정해주면 Parser가 해당 문법이 정확하다고 인식합니다. 그 외에 연속적으로 추가 지정이 가능하고, 중간에 Namespace 영역 내에서 새롭게 추가하는 것도 가능합니다. 대신 이것의 영역은 똑같이 섹션 내에 있는 영역이기 때문에, 밖에서 접두어를 사용하면 오류를 일으킵니다. 거의 막바지에 다다랐습니다. XML의 Parser, 크게 두 가지로 분류됩니다. SAX Parser와 DOM Parser라 합니다. SAX는 이벤트 기반, DOM Parser는 도큐멘트 오브젝트 형태의 Parser입니다. 두 Parser가 구분하는 가장 큰 특징은, SAX는 XML 문서상의 각 요소명이 있습니다. 요소명이 나왔을 때 알려주는 형태이고, 내용이나 마감 태그가 있을 때 알려주는, 순차적으로 말씀을 드렸습니다. 순차적으로 이벤트를 불러주기 때문에 프로그램 코딩이 쉽지 않은 단점이 있습니다. 특정 XML 문서 중간의 요소명 내에 있는 값을 얻고 싶을 때, SAX Parser 같은 경우에는 순차적으로 요소명을 읽어가면서 내가 원하는 위치까지 콜백이라는 함수가 불러집니다. ABC라는 요소 중에 C라는 요소명을 찾기 위해서 Parser를 돌리면, 바로 C라는 요소명에 접근하면 좋을 텐데 중간에 랜덤 액세스가 불가능합니다. 대신 장점은 큰 데이터 분석에 강합니다. 큰 데이터라는 것을 일반적으로 여러분이 수 메가, 수십 메가를 생각하는데, 제 경험으로 수 기가까지 확인해봤습니다. 예전에 제가 국세청 프로젝트를 해봤는데, 거기는 기본 정보가 수 기가 이상이기 때문에 분석을 하기 위해서 하나의 서버가 XML Parser를 돌리지는 않습니다. 너무 부하가 걸리고, 처리하기 위해서 몇 시간이 걸리기 때문에. 대신 대용량의 XML 문서를 쪼개서 여러 대의 서버로 나누어 처리하는 형태로 개발했습니다. 수 기가가 아닌 수백 메가라도 시간만 걸리지 다 가능합니다. 그리고 메모리는 적게 사용하기 때문에 성능이 작은 하드웨어에서 주로 사용되고, 안드로이드에서도 DOM Parser를 쓸 수는 있으나 권장하지 않습니다. 안드로이드 어플에 SAX Parser가 적용된 게, 풀 Parser를 보셨을 텐데 이것이 SAX Parser의 계량 버전입니다. 앞으로 개발을 하거나 여러분에게 추천하고 싶은 것은, 스마트폰이나 이동 단말에서는 SAX Parser를 권장하고 싶어요. 조금 속도가 느리고 퍼포먼스가 안 나올 수는 있지만, 만든 어플리케이션의 안정성을 위해서는 SAX Parser를 권장합니다. DOM Parser는 문서 전체를 구문 분석해서, 구문분석이라는 것은 SAX Parser와 동일한 의미이긴 한데, SAX Parser는 전체 구문을 분석하면서 나오는 태그들의 요소명이나 기타 값들에 의해 바로바로 콜백 함수로 호출합니다. 반면 DOM Parser는 중간에 콜백 함수 없이 처음부터 끝까지 읽습니다. 실제 DOM하고 SAX는 중간에 콜백이 있느냐 없느냐의 차이라는 것을 알면, Parser에 대한 정확한 구분이 됩니다. 모든 구문 분석을 다 해서 돔 객체 모델을 생성하는 분석기입니다. 대신 전체를 구문 분석하기 때문에 메모리를 많이 사용합니다. 그래서 큰 데이터, 수백 메가나 수 기가의 데이터를 처리하는 것에 상당한 시간이 걸립니다. 하지만 찾을 때는, DOM Parser로 올라갔을 때 특정 요소의 요소명을 가지고 오고 싶은 경우에는 랜덤 액세스가 가능합니다. SAX Parser의 경우에는 중간중간 요소명을 가지고 오는 형태이고, DOM Parser는 미리 분석해서 메모리에 띄워놓고 그 상태에서 내가 원하는 요소나 속성값을 가져오기 때문에 어떤 요소명을 달라고 할 때 바로 리턴해서 줍니다. SAX Parser는 파일 관련 처리를 하면서 가져오지만 DOM Parser는 메모리에서 꺼내오기 때문에 그만큼 액세스 속도가 빠릅니다. DOM Parser는 MS에서 제공하는 인터넷 익스플로러에서 주로 사용합니다. 제가 MS의 인터넷 익스플로러와 구글의 크롬을 테스트 해봤는데, 결과상으로 익스플로러는 DOM Parser를 사용하고, 크롬은 SAX Parser를 사용하는 것으로 판단했습니다. 관련 내용을 뒤져봤는데 맞더라고요. MS 는 DOM Parser, 크롬 브라우저에서는 SAX Parser를 사용하고, 대신 어느 것이 PC 상에서 더 좋은가? 예전에 웹 페이지 상의 내용이 적었을 때는 DOM Parser가 더 빠르고 좋았거든요. Parser의 정확성이나 오류 검출 같은 경우에는 MS 에서 사용한 Parser가 더 좋은데, 요즘은 내용도 대용량이고, HTML 5 기반에서는 이 메모리 방식이 스마트폰에서 상당히 부담되는 기능이기도 합니다. 그래서 스마트폰과 크롬 브라우저에서는 SAX Parser를 이용합니다. 여러분이 사용하는 아이폰이나 안드로이드 단말기는 대부분 SAX Parser를 이용할 겁니다. 내장된 브라우저에서는요. XML의 활용 분야입니다. 제가 경험했거나 취득한 정보를 기준으로 정리한 겁니다. XML과 XML용 스타일리스트라고 하는 XSL로 웹 페이지를 생성하여 이용해봤습니다, Flash와 Flex, 그 안의 데이터 처리는 텍스트 문서로 하게 되는데 약간의 라이브러리 개량을 하면 XML에서 연동이 가능합니다. AJAX5, HTML5, 그리고 RIA 서비스 이야기를 들으셨을 텐데, 그 기반으로 했었습니다. 그리고 XHTML, WML 자체는 XML의 구조와 형태가 거의 똑같습니다. Namespace 지정하는 것부터 속성, 요소 등 구조는 거의 똑같은데, 이 안에 Namespace를 정의해서 쓰거든요. XML은 Namespace를 사용하지 않는 것이고, XHTML, WML 문서 같은 경우0에는 내부에 Namespace를 정의해서 사용합니다. 앞으로 경험할 안드로이드 개발에서도 Namespace를 사용할 겁니다. 그리고 XML 기반의 데이터베이스도 활용이 가능한데, 실질적으로 용량이 작고 가볍거나 혹은 USB에 담아서 보여줄 정도의 XML 기반 데이터베이스로 주로 활용합니다. 대용량의 데이터를 XML 기반으로 처리하는 것은 거의 보지 못했어요. 그리고 플랫폼 상의 활용 예제는 스마트폰 어플에서 서버와 데이터 연동할 때 사용하고, 위치 정보, 날씨, 트위터, 뉴스, RSS, 보통 오픈 API 형태라고 통칭하는데 대부분 XML 문법도 사용하지만 새로 두각을 나타낸 제이슨 포맷이라고 있습니다. 이것은 XML의 요소명과 내용을 그대로 담고 있는데, XML에 정의된 내용보다 좀 더 경량이라는 장점이 있습니다. HTML은 텍스트 기반의 데이터이고, 제이슨도 데이터인데 실제로 같은 것을 각각 만들었을 때 제이슨 포맷의 용량이 약 3분의 1 혹은 50% 정도 가볍습니다. 제이슨 포맷의 단점은, 문법의 형식을 규격화하거나 Namespace를 사용하는 등 다른 방향으로의 응용이 불가능합니다. 오류 검증이나 다른 문서와의 결합 기능은 좋지 않아요. 지원이 안 되거나 이렇게 혼합하여 사용하는 것은 추천하지 않고 있습니다. 그리고 어플리케이션에서 사용하는 환경 및 속성 설정파일. 혹시 Tomcat이나 JSP 서비스 기반의 웹 서비스를 다뤄보신 분이라면 먼저 JAVA STK를 설치하고, Tomcat 어플리케이션을 설치한 다음, 웹 서비스를 올리기 위해서 WEB.XML 이나 DOMAIN.XML 파일을 열어서 속성을 변경하게 됩니다. Tomcat의 기본 환경 설정값은 대부분 XML 포맷을 사용하고 있습니다. 그 밖에 데이터 공유 서비스 NEWSML, CXML, VOICEXML, SMIL이 있습니다. XML 기반에서 파생된 SVG를 이용한 그래픽 처리가 가능한 포맷도 있습니다. XML 기반으로는 멀티 디스플레이 콘텐츠 제공 서버가 있습니다. 이건 제가 실제로 경험한 겁니다. IPTV 쪽에서도 쿡 TV라고 보면 되는데, 쿡 TV에 동영상을 올리면 하나의 서버에 올라가는 것이 아니라 먼저 메인 서버에 올리면 각 시·도마다 서비스를 제공하는 서버가 있거든요. 이것이 카피를 자동적으로 동기화하기 시작하는데, 이 동기화하기 위한 기본 문서가 XML입니다. 각 XML을 모든 지역 서버에 배포하면, 지역 서버는 XML 문서에 패싱을 해서 이 동영상이 새로 업데이트 되었구나, 그러면 동영상을 메인 서버에서 카피해서 서비스를 제공하고 있습니다. 스마트폰은 언급했으니까 넘어가겠습니다. 핸드폰, 초기에는 XML을 안 썼어요. 너무 열악했거든요. 속도도 안 나오고, 성능도 안 좋고, 휴대폰 쪽의 개발자들 중에 XML 자체를 모르는 분이 많았어요. 그런데 핸드폰의 화면이 커지고, 메모리 용량이 커지면서, CPU의 성능이 높아지면서 사용하기 시작했습니다. PMP 쪽의 메뉴나 MP3 같은 경우에는 플레이 리스트를 만들 거에요. A라는 가수의 몇 곡, B라는 가수의 몇 곡을 연속 재생해서 들을 때, 그러한 요소를 XML을 통해 만듭니다. 전자사전 같은 경우에는 특정 단어와 내용이 포함되어 있는데, 그 안에 중간중간 발음기호나 이미지, 약어 같은 이미지가 포함됩니다. 실질적으로 XML 내에서는 자주 사용하지 않지만 전자사전 내에서 내용을 입력하는데 기호의 경우 이미지를 사용하거든요. 그 기호를 어떻게 XML 문서 내에 포함하느냐? 아까 말씀 드린 인코딩을 걸어서 텍스트화 시키고, 실제 내용과 중간에 붙이는 형태로 전자사전의 내용을 혼합하게 됩니다. 보통 네이버 영어사전이나 국어사전에 입력하면, 텍스트는 빨리 뜨는데 이미지 내용이 늦게 뜨는 경우가 있어요. 동기화를 맞추고 싶으면 HTML5 기반에서 XML 문서 내에 이미지 포맷이 별도로 지정되어 있는데, 그 형태를 지정하면 문서 내에 이미지를 포함시키고, 텍스트와 이미지가 동시에 뜨게 만들 수 있습니다. 정확히 말하면 HTML5 내에서는 텍스트 기반으로 이미지 포맷이 저장되어 있어요. 형식이 JPG, BMP, PNG 등 어떤 것이든 여러 가지 형식으로 변환하여 사용 가능하도록 정의되어 있습니다. 이제 실제로 제가 만든 프로젝트입니다. XML과 XML 스타일시트를 이용한 겁니다. 실제 사용된 건 이런 것입니다. 이게 사진, 링크 정보, 내용, 가격, 그리고 탭들. 이런 것들이 이 회사 메인 서버에 XML로 존재하거든요. 이러한 정보들은 실시간 서버는 아닙니다. 매일 하루에 한번 정도 메인 서버에서 카피해 로컬에 저장했다가 사용자가 웹 문서를 열 때 XML과 XML 스타일시트와 결합하여 이런 UI를 만들어낸 겁니다. XML 스타일을 이용한 장점으로는, 모든 웹 사이트가 동일한 형태로 서비스 하지 않고 가로 형태로 된 것을 세로 형태로 서비스가 가능하고, 다른 유형이나 별도의 메뉴를 포함한 서비스도 가능하거든요. 또 하나, 스킨도 마음대로 변경이 가능합니다. 웹 개발을 자주 하는 분은 요즘 AJAX를 이용해서 많이 하지만, 저는 완전 솔루션이나 규격화가 필요할 때는 XML 스타일시트의 활용을 권장하고 싶습니다. 이건 Flash에서 XML을 로드하여 사용한 겁니다. 실제 콜센터에서 통계를 낸 정보인데, 콜센터에 사용자가 전화를 하면 로그 기록이 남거든요. 그것을 카운트하여 그래프화 한 것입니다. DB에서 통계 정보를 가져오면, 이 Flash라는 웹 어플리케이션이 서버로 요청합니다. 어떤 XML 문서를 던져줘, 하면 받아와서 각 수치 값을 만들고, 문서 내에 타이틀이 존재하거든요. 그 타이틀을 그래프화 하여 화면에 노출하는 형태로 만들었습니다. 실제로 활용하는 응용분야가 많기는 한데, 업체에서 노출을 꺼리는 게 있어서 간단하게 소개했습니다. 이건 제가 최근에 개발한 것인데, 광고는 아니고 휘닉스파크 쪽 모바일 웹을 처음부터 끝까지 개발한 사례입니다. 모바일 웹사이트는 70% 이상 HTML5를 적용했습니다. 상단의 메뉴와 하단의 이 부분을 제외하고는 거의 AJAX와 HTML5, 웹 소켓을 이용했고, 그 안의 데이터 교환은 XML로 이루어졌습니다. 그리고 여기 있는 기타 리스트 정보 같은 경우에는, 서비스업체의 별도의 메뉴를 구성해주는 서버가 있는데, 거기서 XML을 가져와서 저장해두었다가 사용자가 보고 싶을 때 가져와서 쓰는 것입니다. 며칠이나, 몇 달 동안 변하지 않는 메뉴입니다. 그래서 HTML5 같은 경우에는 웹 캐시 기능을 지원하기 때문에, 저런 메뉴들은 실제로 여러분이 사용하는 스마트폰에 내장되어 있습니다. 캐시를 저장하거든요. 그래서 저 메뉴들은 매번 화면에 들어갈 때마다 서버에 로드하지는 않고, 내 스마트폰에 저장되어있는 정보를 가져와서 화면에 뿌리기 때문에 사용자가 느끼는 체감 속도는 빠릅니다. 새로운 정보 갱신은 JAVA 스크립트를 이용하는데, JAVA 스크립트에서 서버에 저장되어 있는 문서가 새로운 것인지 여부를 먼저 질의하게 됩니다. 갱신된 정보가 없으면 캐시 된 파일을 로드하고, 아니면 새로운 정보를 로드하여 뿌립니다. 그리고 아까 XML의 재사용성이 언급됐는데, 실시간 교통 같은 경우에는 교통정보를 제공하는 사이트가 있거든요. 그 사이트에서 정보를 가져다가 사용하라고 노출한 경로가 따로 있습니다. 그 XML의 교통정보를 로컬 서버에 저장하고, 그 XML 자체를 이 페이지에서 RIA 기반으로 끌어와서 가공시켜준 겁니다. 이건 스마트폰이라도 한번 본 분은 기본적으로 보셨을 겁니다. 그 안에 있는 음식점 정보, 교통정보, 기타 사진 정보 등은 서버에 실시간으로 XML 정보를 요청해서 화면에 서비스하는 겁니다. 이건 제가 개발하지는 않았지만 저희 회사에서 담당했던 것입니다. 아이폰 어플리케이션 내에서 리스트 정보를 가져오는데, 리스트는 실제 서버에서 XML문서로 가져와서 뿌려주고, 그 안에는 해당 위치의 IP와 포트 등 부가정보가 포함된 형태로 구성되어 있습니다. 그리고 XML에서 이미지를 만드는 방법도 있고 포함시키는 방법도 있는데, 이것은 XML에서 이미지를 만드는 방법입니다. 일단 XML에서 만드는 이미지 포맷은 SVG라는 것도 있고, 여러분이 잘 아는 Flash가 있는데, 그것도 이 벡터 기반의 그래픽을 응용한 어플리케이션입니다. SVG를 잘 알면 Flash를 분석하는 것에 아주 유용합니다. 지금 여기서 태그, 텍스트는 SVG로 하고, 이미지의 폭, 높이, 폰트 사이즈, 컬러, 백그라운드 컬러, 텍스트 베이스 라인은 75로 지정해주면, 실제로 이렇게 지정했다고 이런 이미지가 나오는 것은 아닙니다. 이렇게 정의하고 나서 SVG라는 전용 뷰어가 따로 있거든요. 브라우저에서 플러그인 기능을 제공해주거나 소프트웨어가 따로 존재하는데, 그 플러그인 쪽에 XML 데이터 값을 넘겨주면 이러한 이미지를 생성합니다. 보통 3D나 이미지 프로세싱, 그리고 시뮬레이션 할 때 많이 이용하는 것으로 알고 있습니다. (블랙아웃) 일단 목차부터 알려드리면 JAVA란 무엇인가, JAVA 언어의 특징, JVM - JAVA Virtual Machine이라고도 하고, JAVA의 개발도구, 변수의 타입, 연산자, 조건문, 반복문, 배열, 개발 언어를 학습하겠습니다. 제 개인적인 의견을 조금 담았고, 나머지는 QnA로 진행하겠습니다. JAVA란 Sun Microsystems에서 개발해서 1996년 1월 공식 발표한 객체지향 프로그래밍 언어입니다. JAVA로 작성된 프로그램은 운영 체제의 종류에 관계없이 실행이 가능하여 운영 체제가 변경되어도 작성된 프로그램을 그대로 사용 가능한 장점이 있습니다. JAVA는 풍부한 클래스 라이브러리를 통해서 어떻게 활용하느냐에 따라서 멋진 결과물을 만들 수 있습니다. JAVA는 Sun 의 전폭적인 지원으로 성능이 많이 개선되고 있고, 모바일 J2M이라는 버전이 따로 있습니다. 대규모 기업 환경, XML 등 다양한 최신 기술을 지원하거나 도입, 그리고 머지시키는 형태까지 이르러 활동 영역을 넓혀가고 있습니다. JAVA의 특징은 운영 체제가 독립적이다. 이 의미는 어느 운영 체제든지 JAVA를 돌릴 수 있다는 것입니다. 윈도우 계열, 리눅스 계열, 맥 등 가리지 않고, 인비디드 OS 자체에서도 JAVA가 실행 가능하기 때문에 독립적이라고 말한 겁니다. 객체지향 언어. C 언어의 경우에는 절차적 언어라고 하는데, 객체지향 언어는 특정 사물의 성질을 파악해 각각에 맞는 기능으로 구현된 것이라고 이해하면 됩니다. 일단 초급자가 배우기 용이합니다. 쉽다는 게 아니라 다른 언어에 비해 거부감도 덜하고, 개인 PC 내에서도 배우기에 크게 불편함이 없습니다. 그리고 자동 메모리 관리가 있습니다. C를 예로 들자면, C는 메모리를 만들고 사용하고 지우는 것을 각각 개발자가 해줘야 하거든요. 하지만 JAVA는 virtual machine 자체가 관리해주기 때문에 머리 쓰는 게 덜해서 개발 진행이 수월합니다. 네트워크와 분산 처리를 지원한다는 것은, JAVA에서 제공하는 클래스 라이브러리가 워낙 다양하고 많거든요. API를 어떻게 조합하느냐에 따라서 분산 처리를 한다거나 네트워크를 할 수 있습니다. 네트워크 프로그래밍만 간단하게 구현한다면, C 언어로 이야기 했을 경우에는 짧게는 50 ~ 100줄 가량이 필요한데, JAVA는 10 ~ 20줄 사이면 간단한 네트워크 클래스를 만들 수 있습니다. JAVA에서 그런 식으로 자주 사용하는 기능이나 특수 기능을 클래스로 만들어 놨기 때문에 여러분이 JAVA를 익히기 수월할 거라고 생각됩니다. 아, 동점 로딩 지원. 동점 로딩은 JAVA 어플리케이션이 실행되는 도중에 새로운 JAVA 어플리케이션을 실행하거나 내 어플리케이션 내로 포함하는 것이 가능하다는 말입니다. 예를 들어, 웹 서버를 운영하는데 특정 계정을 추가하고 싶다. 기존의 경우에는 웹 서버를 중단하고 새로 웹 서비스를 포함시켜서 다시 시작하는 형태로 진행했는데, 요새는 웹 서비스를 종료하지 않고 서비스 되는 중간에 컨텍스트를 추가하고 몇 번의 조작으로 바로 서비스에 참여시키는 기능을 제공합니다. 이 부분은 나중에라도 많이 사용할 것 같은데, 이런 기술들이 현재 안드로이드 단말에서 어플을 기동할 때, 동점 로딩 기술을 이용해서 어플리케이션을 로드하고 관련 제어까지 가능하게 되는 것입니다. JAVA Virtual Machine은 JAVA를 실행하기 위한 가상의 기계라는 의미입니다. 가상 기계는 소프트웨어로 구현된 하드웨어라고 할 수 있습니다. 일반적으로 C, C++, 네이티브 언어 같은 경우에는 특정 언어로 만든 문서를 컴파일 하면 실행파일은 나오는데, 실행파일이 OS에 직접적으로 명령 수행을 요청하거나 기타 정보를 직접 받게 되거든요. 그런데 JAVA 같은 경우에는 여러 플랫폼에서 소스의 수정 없이 사용이 가능하도록 OS와 어플 사이에 virtual machine이라는 것을 집어넣었습니다. 소스는 동일하고 각각의 OS에 맞도록 virtual machine을 제공하거든요. 이 JAVA Virtual Machine만 있다면 어느 OS나 상관 없이 돌아갈 수 있는 서비스를 제공하기 때문에 OS뿐만 아니라 안드로이드 단말기도 이 형태를 지니고 있습니다. 실질적으로 안드로이드 같은 경우, 시뮬레이터나 폰에 올라가는 것도 코드는 동일한 코드로 실행합니다. 대신 디바이스, virtual machine만 다른 겁니다. 아이폰 같은 경우에는 PC용 애뮬레이터 컴파일이 약간 다르고, 스마트폰에 탑재되는 컴파일과 또 다르거든요. JAVA Virtual Machine은 항상 코드와 OS 사이에서 중요한 역할을 하는데, 파라미터 같은 것만 알기 때문에 눈으로는 확인이 잘 안됩니다. 그렇지만 이 의미는 꼭 이해하셔야 합니다. 이게 실제 JAVA의 기술을 만들어 주는 근간이 되거든요. JAVA 개발도구. JAVA를 프로그래밍 하기 위해서는 기본적으로 JDK를 설치해야 합니다. JDK는 java.sun.com에서 제공하고, 다운로드 받은 다음에 프로그램을 설치하면 프로그램 내에서 사용하는 환경 변수가 있습니다. 환경 변수는 사용자가 직접 에디터를 열어서 수정하고 변경해야 하는데, 제가 환경변수 설정과 JDK 설치하는 동영상을 구해서 링크를 걸었습니다. 동영상은 카페에 올릴 테니까 여기서는 생략할게요. 그리고 JAVA API문서를 설치하면 각 클래스의 사용방법이나 기타 예제가 나오는데, API 문서는 꼭 설치하는 것을 권장합니다. API문서를 보면, 문서 내에 클래스의 구조가 나옵니다. 현재 내가 스트링이라는 클래스에 있다면, 이 클래스가 어느 상위 클래스의 상속을 받았는지를 알아야 응용하거나 변형이 가능하거든요. 그러니까 이 API 문서는 꼭 다운을 받아서 개발에 도움을 받으시기 바랍니다. 변수의 타입. 변수 타입은 크게 기본형과 참조형으로 나눌 수 있습니다. 기본형은 실제 값을 저장하고, 참조형은 변수의 어떤 값이 저장된 주소 값을 갖는다고 합니다. 이 기본형은 여기서 말한 것처럼 boolean, char, byte, short, int, float, long, double 형 등이 있고, 여기 있는 것을 제외한 나머지 변수는 다 참조형으로 보면 됩니다. 예를 들면 참조형은 string 같은 것입니다. 객체, 객체라는 자체를 다 참조형 변수라고 이해하면 됩니다. 참조형 변수는 기본형 변수에서 지원하지 않는, 프로그래머가 직접 만들거나 개량 혹은 상위 클래스의 새로운 구성도 가능합니다. 그것이 실제 참조형 변수에 반영이 가능한 것입니다. 기본형 타입의 구분을 좀 더 디테일 하게 설명하겠습니다. 논리형은 TRUE와 FALSE의 값을 갖는 것입니다. 문자형은 하나 이상의 값만 저장하는데, 실제 문자가 여러 개 있을 경우에는 참조형 변수로 나올 수 있거든요. 하나의 문자는 char, 정수형은 byte, short, int, long, 실수형은 실수 값만 저장할 수 있는 float, double 형이 있습니다. 논리형은 실제 JAVA Virtual Machine 상에서 처리하는 메모리 단위입니다. Boolean 값은 1byte를 사용하고 byte 형 변수도 1byte를 사용합니다. 2byte짜리는 char와 short, 4byte짜리는 int와 float, 8byte짜리는 long, double이 있습니다. 이 byte가 중요한 것이, 지금 여기서는 2byte라는 값을 int 값에서 이쪽으로 전환하지 못하거든요. 4byte는 2byte로 가기에는 공간이 작기 때문에 잘라서 넣거나 다른 형태로 가공 혹은 넣지 못하게 처리합니다. 실제 byte 단위도 가져갈 수 있는 최대값이 존재하고 있습니다. 1byte는 256개의 값을 가져갈 수 있는데, 이 변수가 가져갈 수 있는 최대값입니다. 오른쪽으로 갈수록 최대값이 높아지고, 디테일 한 변수 타입에 따라서 실제 활용 범위나 응용에 약간의 차이가 있습니다. 형 변환이라는 것은, A라는 자료형을 B라는 자료형으로 변경하는 겁니다. 기본형인 Boolean 타입의 형 변환은 절대 불가능하고, Boolean이라는 변수의 타입은 True와 False 값만 저장할 수 있습니다. 일반형 변수 타입에서는 정수나 실수 형태로만 처리해야 하는데, Boolean형은 정수나 실수로 표현하지 못하거든요. 그래서 Boolean값은 형 변환에서 제외됩니다. 기본형은 기본형으로, 참조형은 참조형으로만 형 변환이 가능합니다. 자료형이 큰 값이 작은 값으로 형 변환을 할 경우에는 그 값이 손실될 수 있습니다. 자료형이 작은 것을 기준으로 값이 허용 범위를 고려하여 낮은 자료 범위로 형 변환을 할 때는 반드시 주의해야 한다는 이야기입니다. 자료형이 작은 값이 큰 값으로 형 변환을 할 경우에는 거의 손실이 없고, 캐스팅 연산자도 생략이 가능합니다. 여기서 값의 손실이 거의 없다는 의문점이 있을 텐데, 보통 정수형 타입은 자료형 변환을 할 때 손실이 없어요. 그런데 실수형 같은 경우에는, 소수점 자릿수에 따라 잘림 현상이 있거나 기타 연산하는 방식에 따라 일부 손실이 있을 수 있습니다. 그래서 거의 손실되지 않는다고 설명한 겁니다. 그리고 연산자. 일반적으로 산수나 수학에서 자주 봤죠. 어떠한 계산이나 역할을 알려주기 위해서 기호를 이용해서 연산을 만드는데, 연산 순위가 높으면 높을수록 먼저 계산하게 됩니다. 단항 연산자, 산술 연산자, 비교 연산자, 논리 연산자, 상황 연산자, 대입 연산자가 있는데, 어느 정도 순서를 익혀야 합니다. 그렇지 않으면 개발할 때 A라는 값을 얻어야 되는데, A 이외의 값이 나올 수가 있거든요. 실제 공식으로는 문제가 없는데, 우선순위에 따라서 계산 방식이 아예 변경될 수 있어요. 오류를 방지하기 위해서 괄호를 넣어주는데, 괄호를 넣어주면 그나마 명시적으로 개발자가 해독하기에 용이합니다. 그래서 연산자를 꼭 알아야 하지만, 힘들다면 괄호를 적절히 활용하여 우선순위 자체를 바꾸는 방법도 있습니다. 연산자의 우선순위는 약간 틀린 것이 있는데 위의 표에 나타난 것처럼 단항 연산자와 대입연산자는 우에서 좌로, 그 밖의 나머지는 좌에서 우로 계산합니다. 예를 들어 볼게요. 괄호의 우선순위가 제일 높고, 대입<논리<비교<산술 순으로 높아집니다. 삼항<이항<단항 순으로 다시 세분화 되어 우선순위가 높습니다. 연산자의 연산 진행방향은 오른쪽에서 왼쪽, 다만 단항과 대입은 왼쪽에서 오른쪽으로 진행됩니다. 이런 연산자에서 3*4를 먼저 계산하고, 그 결과값에 5를 곱하게 되는데, 좌측에서 우측으로 진행되는 방식입니다. 이건 조건식이나 기타 연산이 필요한 곳에서 이런 식으로 나옵니다. 대입 연산자의 경우에는 우측에서 좌측으로, 먼저 7이라는 값을 Y라는 값에 저장하고, 그 결과값을 X에 저장하는 형태입니다. 이런 형태는 기본형, 일반형 변수에서 int a 라는 값을 저장하고, 거기에 값을 초기화 해줄 때 이런 식으로 정의합니다. 이제 본격적인 문법에 들어갑니다. 조건문은 조건식과 문장을 포함하는 블록으로 구성되어 있으며, 조건식의 연산 결과에 따라 프로그램의 흐름을 변경할 수 있습니다. 일단 일반적으로 자주 사용되는 조건문입니다. if문 하나만 있을 때는 실행될 문장이 하나만 있고, 조건식 자체가 참일 경우에는 이 실행문을 실행하고, 참이 아닐 경우에는 false 문장을 실행합니다. 조건문을 여러 개 실행하고 싶다면, 조건식 A, B 순으로 else if의 형태로 여러 개가 나올 수 있습니다. 대신 if는 무조건 한번은 나와야 하고, else는 한번만 나와야 합니다. else if는 여러 번 나와도 되고, if문의 중첩도 가능합니다. if문 안에 if문이 중간에 들어갈 수도 있습니다. 즉, 중첩이라는 것은 블록 안에 새로운 if문이 또 들어갈 수 있다는 이야기입니다. 일반적으로 if문의 중첩 수에 제한이 있는데, JAVA 같은 경우에는 30 여 번 이상 중첩하지 말라는 권고사항이 있는 것으로 알고 있습니다. if문 다음으로 자주 쓰는 것은 switch문입니다. 조건인 경우의 수가 그룹 단위의 분류가 필요할 경우에 사용하고, if문에 비해 수행 속도가 빠릅니다. if문에 비해 메모리를 많이 사용하게 되는 단점이 있습니다. 그래서 어떤 프로그램을 개발할 때, 이 switch case문을 권장하지는 않습니다. 보통 펌 웨어는 스위치가 없는 경우도 있거든요. 메모리를 많이 사용하면 생산 비용이 많이 들기 때문에 존재하지 않기도 하지만, 요즘은 하드웨어가 좋아지고 메모리 값 자체가 예전보다 다운되었기 때문에 크게 고려하지 않고 사용할 수가 있습니다. if문은 True와 False로만 판단하지만 switch는 결과값인 int형으로만 판단 가능합니다. 즉, int로만 판단하는 것은 값들이 int로 와야 한다는 거예요. 문자열이나 실수형의 경우는 안 되고, 조건식 자체도 이 안에 포함된 정수형 값을 가져야 합니다. 만약 if문처럼 else, 전혀 조건이 없을 경우에는 default 형태로 빠지게 됩니다. 간단히 풀이하면, 만약 조건식의 값이 1일 경우에는 이 문장을 실행하고, 2일 경우에는 이 블록이 실행됩니다. 그리고 1과 2가 아닌 나머지 값들은 default로 빠지게 됩니다. 대부분 쓰지 않지만 if문의 대체 로직으로 쓸 경우에는 default가 if문의 else 역할을 한다고 보면 됩니다. 반복문은 어떠한 작업이 반복적으로 수행되도록 할 때 사용합니다. 종류는 for문, while문, do while문이 있습니다. 조건문과 반복문은 서로 중첩 가능합니다. for문은 초기화, 조건식, 증감식 같이 네 부분으로 이루어져 있습니다. for문의 진행 순서는 초기화, 조건식, 수행문, 끝나면 다시 증감식으로 갔다가 조건식, 이런 식으로 순환이 이루어집니다. 초기화는 처음 한번만 수행하고, 조건식, 실행문, 증감식 다음에 조건식, 증감식, 이런 식으로 순환하기 때문에 언어를 처음 접하는 분들은 이해하기 어려운 부분입니다. 하지만 확실하게 연습해두면 이것만큼 확실하고 유용한 반복문은 없습니다. 솔직히 while문보다 for문을 훨씬 많이 쓰거든요. 반복문을 빠져나오는 것은 조건식 자체가 false일 경우입니다. 중간에 break문과 continue문이 있는데, 밑에서 다시 설명하겠습니다. 그리고 for문은 주로 사용자나 프로그램이 알고 있을 때 반복횟수를 사용합니다. 구구단 같은 경우에는 1단부터 9단까지 출력한다는 기본 룰이 있잖아요. 그 룰이 정확할 경우에는 for문을 쓰는 겁니다. 만약 1단부터 90단, 100단 이상을 사용할 때는 while문이나 do while문을 사용하는 경우도 있습니다. 김정범 교수) 아시다시피 시작에서 이것을 막아주지 않으면 에러가 납니다. 아시죠? 꼭 막아줘야 합니다. while문으로 바로 들어가겠습니다. for문과 달리 조건식과 수행문이 존재하지 않습니다. 변수의 사용이나 초기화 위치가 잘못 지정되는 경우, 무한반복에 빠지면 작성한 프로그램이나 OS가 멈춤 혹은 종료되는 현상이 나타납니다. 일반적으로 PC나 스마트폰에서는 무한반복에 빠져도 타이밍만 빠르면 사용자의 조작에 의해서 프로그램을 종료할 수 있습니다. 그런데 하드웨어 성능이 아주 열악한 경우에는, for문도 빠질 수 있지만 while문을 잘못 써서 무한루프에 빠지면 하드웨어 자체가 망가지는 경우가 있거든요. virtual machine이 알아서 해주기도 하지만 virtual machine이 불안정할 때는 하드웨어 자체가 망가지는 사례가 있습니다. 저도 경험했어요. 그래서 저는 if문보다 for문이나 while문을 쓸 때 다른 코딩보다 2~3배 신경 써서 개발하고 있습니다. 아! 위의 내용을 설명하지 않았네요. while문의 조건식은 여기에 정의하고, 이 조건이 false가 나올 때까지 문장을 계속 수행하게 됩니다. 진행 순서는 조건식을 수행해서 true면 수행문을 실행하고, 끝나면 다시 조건식으로 재확인을 합니다. true or false? false 결과값이 나오면, 이 루프문을 빠져 나오는 형태로 진행하게 됩니다. do while문입니다. while문이 변형된 형태로, 먼저 수행문이 1회 수행된 다음에 조건식 판단을 하는 겁니다. break문은 switch문, for문, while문, do while문에서 조건문이나 반복문 중간에 임의로 벗어나고 싶을 때 사용합니다. continue문은 반복문 내에서만 사용이 가능한데, 여러 줄의 수행문 중간에 반복문 끝으로 이동하고 싶을 때 사용합니다. 먼저 while문과 다르게 do라는 것을 실행하고, 수행문을 실행합니다. 기존의 while문과 for문의 경우에는 조건식을 먼저 실행하고 수행문으로 넘어가는데, continue문은 수행문을 먼저 실행하고 조건문을 실행합니다. 조건식에서 false가 나오면 빠져 나오고, true가 나오면 다시 올라와서 수행문을 실행합니다. break 같은 경우에는 여기서 빠져나올 수도 있지만 여러 줄의 수행문이 있을 경우에는, 중간의 특정 조건 if문상의 조건이 맞아서 더 이상 실행하지 말아야 할 경우 break를 이용해서 while문 뒤로 빠져 나오는 겁니다. 그리고 continue문은 반복문 내에서만 사용합니다. 여러 줄의 수행문이 있을 때는 중간 이후 건은 실행하지 않고, break문과 여기까지는 비슷합니다. 방금 수행된 줄 위의 기준으로 다시 수행하고 싶을 때 continue문을 정의하면, 이 위쪽으로 올라와서 실행하게 됩니다. 여기서 주의 사항은 무한 루프에 빠지는 경우가 있습니다. do while문에서 수행될 문장에 continue문을 집어넣으면 그게 무한 루프입니다. 무한루프는 전 페이지에서 언급했듯이 실제 OS가 동작하지 않거나 치명적인 오류가 발생할 수 있기 때문에 do while문에서 continue문은 절대로 사용하지 말아야 합니다. 그리고 변수 타입의 응용입니다. 여러분이 프로그램에 입문하면 기본형 변수와 참조형 변수가 있는데, 그 이상 혹은 중급자로 가거나 여러 가지 덩치가 큰 프로젝트를 진행하려면 이 배열이 들어간 것은 꼭 집고 넘어가야 됩니다. 이 배열이 아니라 다른 방법도 있지만 기본 원리를 알아야 개량된 자료형이나 응용 표현에 상당한 장점이 있거든요. 배열 자체는 여러분이 다른 언어를 습득하더라도 거의 마스터해야 합니다. 모든 프로젝트에 이 배열이 들어가지 않는 건 없어요. 작은 것 말고 중·소형급 이상은 배열이 거의 다 들어갑니다. 또 하나, 배열 자체가 참조형 변수보다 속도가 빠릅니다. 예를 들어 for문을 돌 때, 참조형 변수를 사용하는지 기본형 변수를 사용하는지에 따라서 속도 차이가 나는데, 그 안에서 배열 관련 처리를 하면 속도에 더욱 이점이 있습니다. 더 나간 감이 있는데, 배열이라는 것을 어느 언어에서든 중요하게 생각해야 된다는 의미에서 말씀 드렸습니다. 같은 타입의 여러 변수들을 하나의 묶음으로 다뤄놓은 것을 배열이라 합니다. 변수의 타입이 기본형인지 참조형인지에 따라서 배열로 선언이 가능합니다. 물론 내가 만든 참조형 변수도 배열 형태로 다 가능합니다. 예를 들면 int 형의 num1, num2, num3, num4, num5를 정의했을 때, 각각의 네이밍도 기억해야 하거든요. 이것을 배열로 만들면 num이라는 변수 하나만 나오고, 하나로 합쳐졌기 때문에 나머지는 기억할 필요가 없어요. 헝태는 중괄호 내에 선언하고, new int [5]를 지정하면 됩니다. int 0 똑같이 하고, 변수 개수를 지정합니다. 다음으로 개수 지정만큼 new라는 생성자가 있는데, 이 생성자 기준으로 만들면 다섯 개가 메모리상에 적재됩니다. 배열의 초기화. 생성된 배열은 기본형 값으로 자동 설정됩니다. 만약 score라는 배열 생성을 int형으로 했으면, 정수값은 기본적으로 0이 생성됩니다. 클래스, 참조 변수는 null 이라는 값으로 자동 초기화됩니다. 이런 식의 다른 형태로 바로 사용하는 경우도 있지만 초기값을 가져가고 싶은 경우에는 각각의 배열에 인덱스값을 지정해서 하나씩 대입하는 방법도 있습니다. 그리고 한 번에 선언하는 부분에서 일시적으로 값을 초기화하는 방법이 있는데, 그건 다음 페이지에서 설명하겠습니다. 이건 기본형 변수이고 다음은 클래스, 참조형 변수입니다. 참조형 변수도 형태는 동일합니다. 역시 초기값은 생성하는데, 기본형은 바로 값 대입이 가능하고, 참조형은 객체를 생성해야 합니다. 스트링 같은 경우 바로 대입하면 참조오류가 발생하기 때문에 참조형 변수는 new라는 생성자를 이용 객체로 만들어서 대입해야 합니다. 다차원 배열입니다. 이제까지 설명한 것은 1차원 배열이고, 그 이상의 것을 다차원 배열이라 합니다. JAVA에서는 1차원이 아닌 다차원까지 지원합니다. 2차원을 이해하면 3차원 이상의 배열을 이해하는 것은 어렵지 않습니다. 하지만 실무에서는 1, 2차원 배열을 가장 많이 사용하고 3차원 이상은 특수한 경우에만 사용합니다. 특수한 경우라는 것은 3D 게임에서 많이 사용하는데, 평면적인 작업이 아닌 삼면을 보고 앞뒤 좌우를 보기 때문에 깊이까지 계산해야 하거든요. 그 때 3차원 이상을 이용해서 연산 처리합니다. 아까 1차원 배열에서는 이 부분이 없었는데, 그 부분만 추가해주면 됩니다. 똑같은 것은 3개일 경우에는 3차원, 개수만큼으로 나눌 수 있습니다. 1차원처럼 생성은 하되 지금 배열 개수는 이렇게 보면 3개인데, 하나의 5를 집어넣으면 5*3해서 15개의 배열이 생기는 것입니다. 총 배열은 1차원에서는 거의 직선형태인데, 이것은 격자의 타일 형태로 메모리상에 생성됩니다. 이 앞의 5는 앞부분 열의 인덱스 값을 의미하고, 뒷부분은 그 열의 1차원 개수를 의미합니다. 이것 같은 경우에는 각각의 변수에 대해서 하나씩 지정해주는 겁니다. 이것 같은 경우에는 배열 생성과 동시에 값을 설정해주는 것입니다. 즉, 이런 것들은 중간에 값들의 변경이 자주 일어나지 않을 때 용이하고, 이것은 처음에 생성해놨다가 필요할 때만 사용하는 형태이기 때문에 사용하는 방법이 서로 다릅니다. 가변 배열은 기존에는 개수를 맞춰서 했는데, 2차원 배열 내에 1차원 배열 자체의 개수를 가변적으로 만들어주는 것입니다. 즉, 일반적인 배열은 이러한 형태로 1차원 배열을 생성하지만 가변 배열을 위해서는 앞부분의 값은 넣어주고 뒷부분 값은 공백으로 둬야 합니다. 만약 여기서 3차원의 배열을 만들고 싶으면 어떠한 정수 값을 집어넣고, 다시 중간에 어떠한 값을 넣고, 마지막은 항상 비워 두면 됩니다. 5차원 배열은 이러한 형태 4개의 맨 마지막에 정수 값이 들어가지 않는 형태로 정의하면, 그 해당 차수에 맞는 배열이 생성됩니다. 그리고 끝 부분의 크기는 지정하지 않았기 때문에 여기서 원하는 개수만큼 만들어 낼 수 있습니다. 보통 이 가변 배열은 알고리즘이 다르지만, 해시 테이블이 가변 배열 형태로 구성한 것이라 원리는 같습니다. 이것은 개발 학습 팁입니다. 제가 이제껏 학습하거나 여러분에게 도움이 되고자 만든 내용을 추가했습니다. 어떠한 언어든지 장?단점, 개발환경, 운영환경, 변수의 타입, 기본 문법을 먼저 파악해야 합니다. 이 부분은 어느 책이든 나와 있어요. 거의 이 순서대로 진행하거든요. 책을 사보면 언어의 탄생 배경, 언어의 장?단점, 설치, 어떻게 사용할지의 타입, 문법 순으로 나옵니다. 이게 중요한 이유가 여러 언어를 다루는 건 알겠지만 간혹 혼동되거든요. JAVA 문법과 C 문법이 비슷한 것도 있지만 다른 것도 있습니다. 그렇기 때문에 이 부분을 먼저 파악해야 합니다. 명확히 이해하면 다른 언어를 추가적으로 배워도 혼동하지 않습니다. 좀 더 난이도가 높은 개발을 하거나 상위 레벨로 올라가고 싶으면 미니 프로젝트를 스스로 정하고, 프로젝트에 쓰이는 기능 위주로 먼저 클래스나 함수를 찾아서 학습해야 합니다. 실제 미니 프로젝트는 간단합니다. 예를 들어 5*5라는 값을 출력하려면, 먼저 프로그램에 5*5라는 문법을 넣고 프린트 형태로 출력합니다. 내가 선언한 형태로 값을 출력한 거잖아요. 더 업그레이드 하고 싶다면 내가 숫자를 입력해서 해당 계산값을 출력해라, 이런 식의 단계별로 올라가는 것입니다. 즉, 이런 식으로 순서 레벨을 정해서 올라가고, 또 단순 곱하기 연산을 출력하는 것이지만 그 안에 출력하는 메소드와 입력 받는 메소드가 필요합니다. 그리고 곱하기 결과값만 출력하는 것이 아니라 앞의 수식도 출력하고 싶을 때가 있거든요. 그런 식으로 하나씩 추가하는 게 좋습니다. 클래스 및 메소드 함수 중에서 문자 열, 네트워크, 이벤트, 쓰레드, 이미지 등 사용법을 꼭 익힌다. 먼저 첫 번째 팁을 파악한 후에 기본 문법을 익히는 정도입니다. 그 다음에 바로 응용편에 들어가기 위해서는 이 부분을 알아야 합니다. 예를 들면, 잡에서는 일반적으로 사용할 수 있는 메소드가 3~5가지 될 것 같은데, 그 외의 많은 메소드들은 어떻게 사용하느냐에 따라 다양한 응용처리가 가능하거든요. 그래서 말씀 드렸던 것처럼 API 문서를 설치하고, 시간이 날 때마다 보세요. C언어에서는 함수, 객체지향 언어에서는 메소드라고 하는데, 어떤 언어든지 항상 문자열은 나오기 때문에 언급하는 겁니다. 안 쓸 수가 없어요. 그리고 네트워크는 거의 기본적이에요. 네트워크 연동이 옛날에는 비용이 많이 들거나 취약해서 안 쓸 수도 있었는데 요즘은 거의 기본이에요. 그리고 이벤트. 이벤트는 쓸 수도 있고 안 쓸 수도 있어요. 기본형으로 알아서 돌게 하는 것도 있지만 스마트폰에서는 터치를 한다든가 서버에서 데이터를 보내는데, 자연적으로 화면상에 띄우기 위해 이벤트를 등록합니다. 그런 형태의 이벤트 사용법을 알아야 합니다. 이 쓰레드라는 것은 여러분이 개발하는 프로그램 중에서 연속적으로 돌아갈 때 화면 갱신이 안 되는 경우가 있어요. 메인 로직의 루프문을 돌렸을 경우에는, 그 루프문이 끝나기 전까지 화면이 갱신되지 않습니다. 만약 사람이 달려가는 게임을 만들었는데, 계속 달려가는 횟수를 지정했다면 그 횟수가 끝나기 전까지는 화면이 갱신되지 않거든요. 메인 쓰레드와 별도의 쓰레드가 있는데, 기본적으로 실행되는 것은 메인입니다. 계산이 필요하거나 네트워크 할 때도 일시 정지 같은 갑작스러운 부하가 있는데, 메인 쓰레드에서 네트워크를 연결하면 100% 네트워크 부분이 실행 종료될 때까지 멈춰있어요. 그래서 이 쓰레드와 네트워크는 꼭 붙어 있어야 합니다. 요즘은 멀티미디어가 강세이기 때문에 문자열만이 아니라 이미지도 화면에 뿌려줘야 될 겁니다. 사진 앨범을 만든다거나 작은 버튼을 만드는 것들은 항상 이미지에서 함수를 이용해야 하거든요. 저는 언어를 새로 배울 때 이런 부분을 먼저 하고, 기본적으로 어떻게 사용할지, 어떻게 응용해서 써야 하는지 익히고, 문자열과 쓰레드부터 익힙니다. 이것 외에도 많은 기능들이 있거든요. 하지만 먼저 기본적인 것을 파악하면 나머지는 부수적으로 필요할 때마다 찾아서 하면 되기 때문에 저는 이런 식으로 학습합니다.