PROGRAMMING WORKSHOP

Skip Navigation Links. Skip Navigation Links.

Android|
처음으로 멍청한 App하나 띄워보기

스마트폰도 화면으로 구성된다
엑셀에서 워크시트가 있다
메모리만 허락한다면 수도 없이 똑같은 개체를 찍어내서 사용한다
또한 안드로이드 폰의 화면에 더 가까운 것은 UserForm이라고 볼수 있을 것이다

UserForm을 사용하는 것이나 스마트폰의 화면을 사용하는 것이나 같다
이것을 안드로이드폰에서는 Activity라고 부른다
하나의 화면을 구성하는 개체를 Activity 라고 부른다
처음 안드로이드 폰을 만나면 다루어야 할 것이 Activity라는 개체이다
Activity개체를 여러 개 만들어서 어떤 때는 이 화면 불렀다가, 저 화면불렀다가
할 수도 있고, 딱하나의 Activity개체로 개체내부적으로 작은 콘트롤들을
프로그래밍적으로 다루어서 처리하기도 하고

또한 Activity는 다양한 성격의 것들이 있다
워크시트도 챠트시트도 있고, 매크로 시트도 있듯이 다양한 Activity를 갖고 있다
하나, 하나 생각해보면서 구현 해보도록 하자
구현 해보는 것은 정말로 간단하다
USB코드로 안드로이드폰 연결하면 실행을 하면 안드로이드 폰에 실행이 되고
아직 안드로이드 폰이 없다면 가상폰인 에뮤레이터를 사양에 맞게
구성하여 실행시킬수도 있으니 흥미롭게 진행해 볼수 있다

프로젝트 만들기

아래의 그림과 같은 순서로 이크립쓰를 실행하고
만들고자 하는 Application의 이름등을 입력한다



Application Name
Project Name
Package Name
위의 3개중 Applicaiton Name을 입력(두문자는 대문자)하면
나머지 Project, Pacakge 는 자동으로 입력된다
물론 각자 나름대로 입력하여도 되지만 그냥 디폴트로 나타나는 것을
처음 이니까..그대로 유지한다

다음에는 전화기에 나타나는 아이콘을 지정하는 것
자신의 만든 아이콘화일을 사용할수도 있지만 제공하는
아이콘에서 맘에 드는 것을 하나 선택한다



그리고 아이콘의 배경색이나 전경색등의 속성을
살펴보면서 지정하고 OK..다음으로..

다음 창은 App의 초기화면(Activity)을 구성하는 옵션인데
그냥 건들지 말고 디폴트로 정해진 대로 Next 버튼 크릭
다음 창에서도 디폴트로 정해진 이름들 그대로 유지하고



ActivityName은 Java크래스화일의 이름이고
activity_main은 화면을 구성하는 xml화일이름이다
이것은 엑셀에서 워크시트가 있으면 워크시트는 눈에 보이는
인터페이스이고 이 워크시트뒤에 모듈시트가 붙어 있는 것과
마찬가지로..화면을 구성하는 인터페이스인 xml화일과
모듈을 구성하는 쟈바화일 두개가 항상 쌍을 이룬다
물론..화면을 구성하는 xml화일 없이 쟈바크래스화일만으로도
화면을 띄우고 죽이고 하게 되지만 우선은 그냥 디폴트로
제공되는 것을 그대로 받아들이도록 한다

대화상자 모두 완료되면 아래와 같은 창이 뜬다



프로젝트창에는 다양한 구성화일이 만들어지고
Package Explorer라는 창이 있고 나중에 보면 또
Project Explorer라는 창이 있다
두개의 창의 성격이 약간 다르지만 디폴트로 Package Exporer라는
이름의 창으로 열린다
아래의 그림과 같이 창의 왼쪽 하단 조그만 아이콘을 오른쪽마우스
메뉴로 보면 Pacakge, Project두가지가 보인다



궁금하면 두개를 번갈아 열어보면서 관찰하여보셔도 좋다
어느 것을 열러도 작업하는데는 상관 없으니까..
나중에 섬세한 작업에 들어갈때..왜 비슷해 보이는 것이 두개가
있는지 알게되도록 하고..우선은 디폴트로 열어주는대로
사용한다

조금 낯섫어 보이지만 VBA편집기와 유사한 것이다
조금 습관되면 자연스러워진다
VBA편집기에서 한번도 사용하지 않았던 창이 있듯이 이 곳에서도
죄다 신경쓸 것이 없다, 복잡한것 버리고 그냥 우선 가면 된다

중요한 것은 화면구성창(Activity편집창),
activity_main.xml이라는 탭으로 열려있는 가운데 창의 내용은
실제는 xml화일이다
xml화일로 그냥 텍스트문서편집하듯이 하여도 화면이 구성이 된다


그림의 오른쪽의 XML문을 편집하거나
그래픽창에서 콘트롤을 끌어다가 화면에 놓던가..
두개가 연동이 된다
실은 xml편집기를 더 많이 사용하게 된다
이것을 이해하고 친숙해지면 윈도우의 WPF,Silverlight,윈도우폰
모두 같은 것의 컨셉도 자연스럽게 알수 있게 된다

오른쪽 그림은 xml버전으로 열린 상태의 내용이다
LayOut은 화면의 제일 상위 콘트롤(android에서는 콘트롤이라고 하지 않고 View)이다
종류가 다양한다, AbsoluteLayout, RelativeLayout, TableLayout등의 다양한
레이아웃이 있다
엑셀에서 절대주소와 상대주소의 의미를 잘 알면 AbsoluteLayout이나 RelativeLayout의
의미를 감을 잡을 것이다
이 Layout콘트롤내에는 다양한 콘트롤(View)가 배치될것이니까..
서로 배치되면서 배치되는 방법이 좀 달라지는 것이다
기본적으로 LinearLayout이라고 하는 Layout이 만들어진다
그 안에 TextView 라고 하는 것이 들어 있다 .이것은 UserForm의 Label콘트롤
같은 것이다 ...자꾸 습관이 되어 콘트롤이라고 하지만 안드로이드에서는 View!!
TextView는 UserForm의 Label과 같이 텍스트를 나타나게만 하지 입력을
하거나 하지는 못하는 콘트롤(View)이다
기본적으로 TextView하나가 들어가 있고 , 값은 "Hello World"라고 들어 있다
좀 사용하다 보면 Graphical LayOut을 사용하기 보다는 XML문을 더 많이 사용하게 된다
빠르고 편리하니까..

<TextView
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_centerHorizontal="true"
     android:layout_centerVertical="true"
     android:padding="@dimen/padding_medium"
     android:text="@string/hello_world" />

개체이름과 더불어 개체의 속성들을 주욱 표현한 것이다
VBA에서 개체에 속성값 주는 것과 같은 것이다
VBA에서의 속성(Property)여기에서는 속성(Attribute) 죄다 같은 소린데..
각자 자기들이 정한 이름을 사용한다는 것..
android:layout_width="wrap_content"
android:layout_height="wrap_content" 폭이나 높이를 내용물에 맞추어 사이즈를 자동조정
VBA에서 셀의 WrapText=True라고 주었던 기억이 나시면 된다..같은 소리다
content(내용)을 Wrap(감싸다) 즉 내용에 맞추어 자동조정된다는 것
그런 식이다, 뭔가 복잡해 보이지만 UserForm에서 속성창에 속성을 준것을
XML문의 규칙에 따라서 속성명=속성값 이라는 한쌍의 정보를 주욱 때려 넣는 것이다
참 쉽다!!!
생각하면서 입력하면 되는 것이다
버튼을 하나 그려 넣으면 그냥
<Button
     속성명=속성값
     속성명=속성값
     속성명=속성값
     속성명=속성값 />

VBA를 상상해보시면서 보시면 쉽다
물론 위의 내용은 VBA에서 버튼을 그려넣지 않고 프로그램이 돌아가면서
VBA로 실시간으로 버튼을 만들수 있듯이
위의 것들도 마찬가지이다 런타임에 만들어 넣을수도 있고
그려 넣고 직접 속성값등을 설정하여도 되고..

위의 그림의 XML문에서 아래와 같은 것이 있다

android:text="@string/hello_world"

@표시가 있는 것은 무엇인가???
@는 AT라는 전치사를 의미하는 말이다
즉 android:text 속성의 정보가 @string/hello_world ..string의 hello_wordl라는 값에
들어 있는 것을 참조한다는 소리다
그럼 string/hello_world 라고 하는 것은 어디에 보관되어 있나???
일정의 자원정보를 어딘가에서 보고 하고 있는 것이다
엄밀히 말하면 문자열(string)정보를 어딘가에서 보관하고 있다
자원만 보관하고 있는 자원창고가 있다..
자원은 Resource...이것의 약자는 Res..아래의 그림을 보자



res는 그림화일, 오디오화일등 위와 같은 문자열정보등 모든 자원을
보관하고 있는 곳이다
어떻게 보면 불편할 것 같지만 습관이 되면 참 편리한 것이고 이렇게
사용하는 것이 원칙이다
VBA에서는 상수를 선언하던, 말던, 아주 많은 자유로움을 주는 곳이다
그래서 이렇게 검문이 철저한 환경에 오면 좀 낯섫다
아마도 VBA는 가장 자유로운 코딩환경이라고 보시면 좋을 것이다
그래서 좀 게을러지게 하고, 또한 잘못사용하면 에러가 끊임없이
터지는 것이다
그래서 이렇게 까다로운 환경에서 코딩을 하던 습관을 갖는다면 VBA도
스스로 철저히 코딩하여 에러나 좀 엉성함을 방지하는 습관을 얻을 것이다
그러니...안드로이드 폰 이야기는 단순히 안드로이드 폰만의 이야기가 아니라는점을
아시고 취미삼아 달려 들어 보시기 바란다
뭐가 어떻게 까다롭냐고 하신다면 예를 들면..
android:text="@string/hello_world"
와 같이 resource폴더에서 값을 갖여 오라고 하는 것을
귀찮아서...그냥
android:text="Hello World!!!!"
라고 그냥 문자열을 직접 입력하였다고 치자..
아래와 같은 표시가 나타난다
이것은 실행하면서 에러를 내지는 않는다..
그렇지만..제대로 코딩습관을 갖으라는 경고표시인 것이다



경고표시!!! 기분 나쁜 것이다!!그러니 자원폴더내에 사용할 문자열을 보관하고
불러서 사용하는 것이 좋다
Hard Code String "Hellp World!!" should use @string resource
"Hello World!!"라고 하드코딩한 것은 string 자원을 사용하세요!!!
라고 하는 경고를 주는 것이다..
그러니 VBA에 비하여 잔소리가 심하다..
VBA는 잔소리 안한다..돌다가 그냥 에러를 내면 냈지..절대 잔소리 안한다
심지어 Option Explicit를 지워버리면
변수선언도 하지 않아도 뭐라고하지 않는 정말 착한 VBA이다
그러나..
본래 잔소리 심한곳에서 트레이닝을 받아야 내공이 쎄진다..
얼마나 좋은 비교인가..
자신이 살고 있는 나라가 얼마나 좋은지..알고 싶으면 다른 나라에 나가서
개고생을 해야 실감하듯이...다른 것을 비교하여 학습하는 것이 좋다

VBA로 좋은 소루션을 만들려면 어떻게 해야 하나
스스로 통체하는 코딩을 습관하여야 한다
그렇지 않으면 자신이 만들어서 돌리면 잘되는데..남에게 주면 백발백중 에러가 난다
엄격한 환경이 아니라서 그런 것이다
앞으로 안드로이드의 Java언어를 보면서 다양한 잔소리 환경을 느끼면서
이런 잔소리 환경을 습관화하여 VBA코딩할때도 습관화한다면
정말 좋은 소루션이 만들어 질 것이다

한 곳에 자원을 관리한다..
변경이 생기면 이곳에서만 바꿔주면 해당 자원을 참조하는 것은 모두 바뀐다
엑셀셀이 참조하고 있는 값(Refering Value)이 바뀌면 이것을 수식으로 참조하고
있던 모든 셀이 바뀌는 것이나 마찬가지 요령이다
아래의 그림과 같이 기본적으로 만들어지는 자원관리용 xml화일을 더 보면



dimens는 다양한 dimension(규격,사이즈)정보를 담는 것
예를 들어서 위에서 padding-small=8dp라고 한것은 주변과 지정된 개체간격을
8dp로 띄워서 그린다..!! 라는 속성을 주기 위한 것이다
8dp라고 값을 주는 것 보다는 설명적인이름 padding-small이 좋지 않은가..
dp는 픽셀과 같은 안드로이드에서 사용하는 하나의 단위이니까..그렇게 알고 가면되고
또 다른 styles는 화면의 제공되는 여러가지 화면모양을 지정하는 것
이런 것들을 이미 만들어져서 제공되는 것을 지정만 잘해주면 좋은 모양의
것을 만들어 갈 수 있는 것이다
이곳에 다양한 배열정보를 저장하고 사용하기도 하고
하나의 xml화일에 모두 모아서 관리하기도 하고
res 폴더내에 다양한 자원폴더를 편리하게 만들어서 사용하기도 하고
어떤 주어진 규칙만 지켜나가면 되는 것이다

지금까지 본 것은 화면의 구성이였다
엑셀로 치자면 워크시트라고 해도 좋고, UserForm의 화면이라고 해도 좋다
이 각각의 개체(워크시트,UserForm)는 각각 자신을 프로그래밍적으로
콘트롤하는 모듈시트를 갖고 있다는 것은 VBA를 하시는 분들은 모두 알고 있다..
뭔소린지 모르신다고..??!!알기는 아는데 아직 감각이 안붙은 것..
이 모듈시트에 해당하는 것을 android는 어디에 보관하나.???
이 모듈시트는 무조건 android에서는 크래스모듈이다!!!
참으로 흥미로운 부분이 이곳에서 벌어진다
아래의 그림과 같이



src폴더내에 java확장자를 갖고 있는 화일이 크래스모듈이다
기본적으로 MainActivity라는 이름을 갖고 하나 만들어진다
물론 다른 이름으로 만들어도 되고 삭제하고 다시 만들어도 되고
아무튼 맨처음 위에서 차례대로 프로겍트를 만들때 지정된 이름으로
만들어진다
크래스모듈을 열면 딱 한줄의 명령이 있다
SetContentView(R.Id.activity_main);
이라는 한줄..즉 ContentView 화면의 내용을 위에서 만든 xml화일화면을
사용하겠다는 명령인 것이다
그러니 xml화일로 화면을 여러개 만들어 놓고, 필요에 따라
이것도 부를수 있고, 저것도 부를 수 있는 셈이다
실은 이 크래스모듈은 독립적이라고 할 수 있는 것이다
엑셀의 워크시트에 붙어 있는 모듈시트는 실은 붙박이 모듈이다
물론 독립적인 크래스 모듈을 만들려면 크래스모듈을 삽입하고 만들면 되고
워크시트개체에는 딱 하나의 모듈만 붙어 있는 붙박이인 것이다
그러나 쟈바의 이 크래스모듈은 전적으로 독립적..하나의 화면에
하나의 크래스모듈이 처음 프로젝트를 열때 편의상 만들어지기는 하지만 상관 없다
나중에 죄다 삭제하고 다시 만들어 나가도 된다

선언부에 Imports라고 하는 것은 VBA에서도 도구/참조하여 라이브러리를 참조하듯이
필요한 라이브러리를 불러서 일을 시키는 것이다
여기에서도 참조를 이것 , 저것 시켜놓았는데
이것을 실제로 사용을 하지 않으면(참조하지 않으면) 노랑색의 경고표시가 나타난다
즉...자원이 아까운데..쓸데 없이 끌어다 쓸거냐..없애라!!
라는 잔소리가 나타난다..
VBA에서는 참조를 백개하던 열개하던 참견안한다
지가 알아서 알일이지..내가 참견할일 아니지!!!라고 그냥 냅둔다
하지만 쟈바는 안그런다..최대한 스림(Slim)하게 유지하려고 기를 쓴다
그래서 참 영특하다고 하는 것!!
이런 내용들이 실은 VisualStudio에서도 실은 일어나는 일들..
VBA만 너그럽지만..실은 좋지 않는 소루션을 만들게 하는 원인..
왜냐면 이런 잔소리라고 하는 것 자체가 자원을 먹는다
잔소리를 위한 검문서를 언어 자체내에 수도 없이 차려야 하는 것이니까..

또하나..중요한 것
SetContentView(R.Id.activity_main);
의 표현에서 activity_main을 참조하여 갖고 오는 것 같은데..
문자열정보도 아니고..좀 특이하다..어디서 갖여 오나??
안드로이드의 모든 개체가 만들어질때마다 자체 등기소가 설치 된다
즉 호조초본이 모든 개체에게 부여 된다..이때 부여되는 값은 전부 Integer값인 것이다
표현하기는 activity_main이라고 하지만 이것의 실제값은 Integer값
즉 주민등록 번호 인 것이다
이것이 자체생성되면서 저장되는 부분이 아래의 그림과 같다



이렇게 R.Id.activity_main이라는 크래스명(Integer값인 단순한 숫자정보)으로
개체간의 접근을 할수 있게 되는 것이다

지금 현재 코드도 건들지 않고, 아무것도 하지 않았다
그냥 띄우면 "Hello World"라는 싱거운 화면이 하나 뜬다
그래도 App은 App이니까...멍청하지만..
빨리 넘어가서 코딩하여야 하는데..그림만 잔뜩 뜯어 붙이니..지루하다
자 이것만 하나 띄워보자..
안드로이드 폰이 있으시다면 USB로 꽂고 여러분의 전화기의 환경설정에서
개발자옵션창에서 USB디버깅을 체크하면 ..실행시키면 그냥 곧바로
여러분의 폰에 나타난다
안드로이드폰이 없다면 그림과 같이 에뮤레이터(가상전화기화면)라는 것을 띄운다



워낙에 안드로이드폰전화기의 사양이 다양하니까..
적당히 타겟이 되는 폰의 사양을 선택하여 사용하면 될 것이다
다 되었다..Run버튼을 크릭하면 결과물을 볼수 있다
그림 뜯어 붙이느라고 쫌..길었다..
다음 페이지에서는 이런 멍청한 것 말고
무언가 누르면 일이 벌어지는 지능을 심는 코딩을 하자