Loading
2012. 1. 19. 15:58 - lazykuna

안드로이드 프로그래밍 입문 팁들

이 글은 제가 안드로이드 초입을 자바 없이 무턱대고 들어왔을때의 경험을 바탕으로 작성된 글입니다.
물론, C++과 같은 객체지향 / 포인터에 대한 선행학습정도는 기본으로 하고 들어오셔야 합니다. 못해도 Js정도의 코딩능력정도는 있어주어야 좋을 듯 합니다.

1. 안드로이드 '액티비티' 이해하기


윈도우즈에서 프로세스가 존재한다면, 안드로이드에서는 액티비티가 존재합니다. 거의 동일개념이라고 볼 수 있습니다. 액티비티 내에서 쓰레드 실행도 가능하고요.

출처 : http://theeye.pe.kr/entry/android-activity-life-cycle-korean-version


유의해야 할 점은, 언제 이러한 이벤트가 발생하느냐, 그래서 무엇을 처리해 주어야 하는가 입니다.
(=폼.. 혹은 게임 어플과 같은) 위주의 프로그램이라면 앱이 백그라운드로 들어갔을때 (onPause 혹은 onStop..) 배경음악을 중단해준다, 혹은 앱을 끈다 등도 고려해주어야 합니다. onStop이 발생했을때는 객체가 전부 메모리에서 삭제된 경우를 고려해서 필요시에는 다시 초기화시켜주어야 하는 루틴도 고려해보아야 하고요.

즉, Activity = Windows의 Process이고, 이 정도가 안드로이드 시스템에 대한 기본 이해가 될 것입니다.


2. 안드로이드 SDK 구성

안드로이드 SDK이라고 구글링하면 첫 페이지부터 안드로이드 SDK 파일이 보입니다. 다운로드 하고 설치해주고 "Android SDK Manager" 을 띄웁니다.


사실상 설치해야 할 것은 "SDK Platform"에 불과합니다. 굳이 더 설치한다면, ARM 에뮬레이터랄까요. 하지만 그마저도 폰이 있다면 폰으로 구동이 가능하기 때문에 꼭 설치할 필요도 없을 겁니다.
그리고 버전이 중요합니다. 꼭 최신버전이라고 설치했다가 호환되지 않는 앱을 만드는 우를 범하지 마시고, 어떤 버전을 설치할지 확실히 정해놓고 설치하세요. 다중 설치가 가능하므로 큰 문제는 없을 테지만.. 일단 2.3.3이 대중적인 버전이라고 봅니다.

그리고 이클립스에서 "Help > Install New Software"로 들어갑니다.
그리고 android 쳐서 나오는 것을 선택한 후, 다음 버튼 누르면 알아서 연동되어 설치가 끝납니다.



3. AndroidManifest.xml 이해하기

정말 간단한 프로젝트가 아닌 이상, AndroidManifest.xml은 반드시 건드리게 되어 있습니다.
줄여서, "이 앱은 어떤 앱이다"를 명시해 주는 부분이라고 볼 수 있습니다.


패키지명은 말 그대로 패키지명입니다.

쓰고 싶은 데로 쓰시면 되고요 (....), "앱 식별자" 정도로 보시면 좋을 것 같습니다.

저게 달라지면 다른 앱으로 인식되겠지요.

이외 버전 등등을 다루는데, 크게 손 볼 것은 없습니다.




하단의 "Application" 탭을 클릭하면 또 여러 정보가 나오는데, 제일 많이 손대게 될 부분입니다.

"Name", "Theme" 등은 직접 마우스를 대보면 간단한 설명이 나오므로 참조할 수 있습니다.

하단의 "Application Nodes"에 주목할 필요가 있습니다. 앞으로 프로젝트에 여러 java파일들을 묶어 넣게 될 텐데[각주:1], 이 Application Nodes에 명시해 주지 않으면 이후 에러가 뜨게 됩니다. 사용가능하게 하려면 명시를 해 주어야 한다는 이야기가 되겠습니다.

"Attributes for ~" 속성에서는 Name 요소가 제일 중요합니다. 명시를 했으면 무엇을 명시했는지를 나타내 주어야겠지요. 바로 그 부분입니다.

Name 요소에는 해당 클래스명을 입력합니다.




다른 속성은 거의 빈칸이지만, 마찬가지로 해당 클래스명을 입력하고 있습니다.




Permission(권한) 부분은 말 그대로 어플리케이션이 접근할 수 있는 권한을 설정합니다.

인터넷 접근성, IO 출력 권한, 부팅 이벤트 리시브 권한(부트때 서비스 실행시킬 경우에 주로 씁니다) 등에 대한 설정을 할때 필요합니다.

위의 Application과 마찬가지로 권한이 명시되지 않으면 에러가 뜨는 경우가 있습니다. 이때는 LogCat[각주:2]에 관련 정보가 뜨니, 읽고 해결하시면 됩니다.




완성된 코드는 하단의 소스보기로 볼 수 있습니다.


4. 안드로이드 '이벤트' 이용하기 및 이클립스 프로젝트 구조 이해하기. 그리고 포인터, 배열 명시 조심!



안드로이드 코딩은 타 객체지향언어들과 거의 비슷합니다. Java를 다루어 본 적이 있는 사람에게는 더욱 수월하겠고요.

그래도 이벤트를 다루는 방법에 대해서는 좀 알아볼 필요가 있겠습니다. 일단 디벨로퍼 사이트의 Reference에서 쓰이고 있는 이벤트들을 자세히 볼 수 있고, 이들은 모두 "On~"이라는 접두사가 붙어 시작됩니다.



하지만 여의치 않은 경우가 있기도 한데... 일단, 간단하게 뷰에 이벤트를 주어 보겠습니다.


먼저 임의로 에러가 가득한 문구를 만들거나 한 후에, "super"[각주:3] 메서드를 이용합니다.

그리고 on~ 메서드를 입력합니다. 저는 onkeyup 이벤트를 한번 입력해 보도록 하겠습니다.




우와, 오른쪽에 친절한 설명까지 다 나옵니다. MSDN 안 부럽다능.

설명을 클릭하면 스크롤바가 생기면서 좀 더 상세히 읽을 수 있습니다. 정말 상세히 나와서 딱히 뭐라 할 건덕지가 없습니다.

(더 적절한 이벤트나 사용시 주의사항 등도 나와 있어요 ....)



엔터를 누르면 대강의 코드가 완성됩니다. 하지만 관련 변수는 전혀 명시되어 있지 않은 상태.




메서드에 마우스를 올려 보면 함수의 원형이 슬그머니 보입니다. 그러면 복사하여....





붙여넣기! 하면 에러가 뜹니다.





'KeyEvent'라는 객체가 명시되어 있지 않다는 에러인데요, quick fixes에 보면 뭘 import하면 된다 라고 씌여 있습니다.

저걸 클릭하면[각주:4] 순식간에 import구문이 생기면서 에러가 없어집니다.




이제 리턴값 처리 해주면 순식간에 이벤트 처리 완성.

MFC의 자동완성급은 아니더라도 꽤 편리하게 작성이 가능합니다.

그런데 가끔은 return값이 항상 super의 기본 리턴값으로 설정해야 하는 경우가 아닐 때가 있으므로 주의가 필요합니다!



이제는 View에 있는 객체를 가져오는 방법과, 이벤트 거는 방법을 알아보도록 하겠습니다.



마찬가지로 super이 갑 입니다. findViewById를 통해서



매개변수를 입력해 주면 (리소스 ID[각주:5]입니다. xml에디터에서 ID를 쓰면 자동으로 생겨요) 해당 객체의 포인터가 날아옵니다.[각주:6]

주의할 점은, 이 메서드를 입력하기 전에 setContentsView를 미리 호출해 주어야 합니다![각주:7]





이제 이벤트를 명시해 줍니다.

이벤트 설정 함수는 "setOn~"으로 시작합니다.




OnClickListener을 요구하고 있습니다.




여기까진 쉽게 입력할 수 있습니다. 하지만 에러가 뜨네요.

OnClickListener에 마우스를 갖다 대 봅시다.




Import 구문이 보입니다. 클릭합니다.





필수적인 요소(?)가 빠졌다는 이야기입니다.

"Add unimplemented methods"를 눌러주면



 

저 부분의 onClick에다가 이제 필요한 처리 루틴을 만들면 됩니다.[각주:8]



배열 명시, 혹은 객체 초기화는 다음과 같이 이루어집니다. 깜빡하고 안하면 NullPointerException 뜨기 마련이니 주의, 또 주의!

int[][] arr = new int[1024][20];
ArrayList<Integer> arr = new ArrayList<Integer>(); // 오직 안드로이드에서만.

Button b = new Button();


그리고 문자열 또한
String t = "test";
if (t == "test") ...

이렇게 코딩하시면 안 됩니다. 의외로 포인터거든요 -_-;;... 아 골때린다..
반드시! equals 메서드를 써 주시기 바랍니다.
String t = "test";
if (t.equals("test")) ...

.. 의외로 이 부분은 자바유저가 아니라면 주의해야 할 부분.


5. 디버깅 해보기

간단하게 LogCat으로 대부분의 디버깅(혹은 실행)을 할 수 있습니다.
안드로이드 AVD(에뮬레이터)[각주:9]를 띄우거나 폰과 연결해서(이때는 Kies와 같은 디바이스 드라이버가 필요합니다) 실행해 볼 수 있습니다.
후자가 훨씬 빠르므로, 정신건강에 좋은 기기연결디버깅을 추천해 드려요.


앱 구동을 시작하면 오른쪽의 LogCat에 다양한 메시지가 뜹니다.


LogCat에서 예외 발생시 다양한 정보를 볼 수 있으며 (어떤 메서드에서 어떤 에러가 발생했는지 상세히 알려줍니다), 로그도 볼 수 있습니다.
로그는 다음과 같이 남길 수 있습니다.
Log.v("msg", "test"); // 검정색 글자로 뜨며, 보통의 메시지에 주로 씀
Log.e("msg", "test"); // 빨간색 글자로 뜨며, 에러 메시지에 주로 씀


그리고 LogCat에 너무 많은 메시지가 떠서, 필요한 지금 프로젝트의 메시지만 보고 싶을때는

DDMS 란에 들어가서 (없다면 오른쪽의 + 버튼으로 추가해주세요)



필터에 package명을 추가해 주시면 됩니다.
(혹은 로그캣에서 직접 search를 걸어도 되지만 ... 일단 더 대중적인 방법이 이것.)


변수값은 다음과 같이 볼 수 있습니다.



벌레를 눌러 줍시다.




코드에서 스톱포인트는 오른쪽의 빈 공간에 더블클릭을 해주면 추가할 수 있습니다.

이후 멈췄을 때 마우스를 대면 변수 값을 볼 수 있습니다.

VS처럼 Watch 툴은 제공하지 않는 것 같아 아쉽...



F8을 누르면 디버깅을 계속 할 수 있으며, 오른쪽에서 Terminate도 가능합니다.



PS1./ 안드로이드 프로그래밍 시 특수한 경우에 대한 유의사항 및 팁
  • ListView 관련 프로그래밍을 할때는 id가 반드시 @android:id/list로 설정되어 있어야 하며, 이때는 리소스ID android.R.id.list로 호출이 됩니다.
  • "멀티터치" 프로그래밍 시에는 ACTION_DOWN 이벤트 대신 ACTION_POINTER_DOWN 이벤트가 오기도 하며, 각 버튼별로 다른 이벤트가 호출이 되니 MotionEvent.ACTION_MASK와 앤드(&) 마스크를 먹여서 처리해주시면 좋습니다 (무슨 말인지 모르시겠다면 트레이스ㄸ ㅢ워 보세요)
  • CString.Format(~)꼴의 형태를 java에서는 String.Format(~)로 사용 가능합니다.
  • onCreate(~) 같은 데에서 변수를 지정하고 메서드를 추가했다가는 에러가 발생하기 십상입니다![각주:10] 클래스 내부에서 변수를 만들어 주세요![각주:11]


PS2./ 몇가지 팁들 혹은 API
  • 간단한 메시지는 Toast로. 메시지박스는 응용도가 다양하나 띄우기가 복잡합니다 -_-a
  • 안드로이드 화면 회전 처리 - http://blog.naver.com/PostView.nhn?blogId=akj61300&logNo=80132652046
  • 안드로이드 액티비티 상태 설정값 및 기능 - http://theeye.pe.kr/entry/references-of-intent-flag-on-android-activities
  • 이클립스 설정창 구현 - http://www.androidpub.com/57847
  • 안드로이드 apk 파일 만들기[각주:12] - http://www.androidpub.com/56913
  • 안드로이드 ColorMask 사용하기 - http://gogorchg.tistory.com/entry/Android-ColorMask-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
  • customLock 잠금화면 앱 소스코드 예제 - http://mylockforandroid.googlecode.com/svn/trunk/custom%20lock/src/i4nc4mp/customLock/
  • fill_parent와 wrap_parent의 차이 - http://stackoverflow.com/questions/432763/whats-the-difference-between-fill-parent-and-wrap-content
  • 안드로이드 외부 변수 액세스 방법 (선언) - http://blog.naver.com/PostView.nhn?blogId=baram918&logNo=120132891297&categoryNo=6&viewDate=&currentPage=1&listtype=0
  • 안드로이드 커널에 대한 몇가지 정보 - http://daem0n.tistory.com/category/Android%20Kernel

  1. 동일 프로젝트의 자바 파일임을 명시하기 위해서는 package <패키지명>만 붙여주면 끝! 이후는 모두 동일합니다. 클래스 선언(public class)하고 어떤 클래스의 후속인지 (extends View, extends Service) 명시해주는 것. [본문으로]
  2. 안드로이드 디버그를 할때 씁니다. 뒤쪽의 디버그 방법에서 다룹니다. [본문으로]
  3. 자바에서는 parent와 동일합니다. 어떤 클래스의 확장 등에서, 원본 클래스를 호출하는 거라고 보면 되겠습니다. 아마, 여기서는 super말고 this를 호출해도 될 것 같지만... 알게 뭐람. [본문으로]
  4. 물론 android.view.*해도 상관 없습니다. [본문으로]
  5. 물론 저기에서 R.layout.main을 쓴 것은 틀린 표현입니다. 버튼 만들기가 귀찮아서.. 그냥 아무 리소스 값이나 입력했습니다 -_-; [본문으로]
  6. C++과는 다르게 별도의 포인터가 명시되어 있지 않으므로 주의! 혹여 포인터가 아니라 새로운 객체를 만들고 싶다면 new Button() 처리를 해 주시면 됩니다. 물론 그때에도 변수에 저장되는 값은 포인터 값이겠지만. [본문으로]
  7. setContentsView는 어떤 뷰를 기반으로 이 프로그램을 작동시킬까나- 하는 이야기와 동일합니다. 명시해 주지 않으면, 이후에 NullPointerException 에러를 맞이하게 됩니다 -_-a [본문으로]
  8. 이벤트를 설정하는 방식은 다양합니다. 리소스뷰의 설정에서 "click"에다가 실행할 함수명을 입력해도 되는데... 일단 하드코딩의 예시는 다음과 같다는 이야기에요. [본문으로]
  9. (신호등님 제보) 윈도우즈 계정명이 한글일 때, AVD가 제대로 구동되지 않는다고 합니다! [본문으로]
  10. 아마 가비지 컬렉터에서 자동으로 변수를 해지해버려서 널 포인트 에러가 뜨는 것 같습니다. [본문으로]
  11. public class ~ { Button b; ~ onCreate() { b = new Button(); } ~ } 꼴로 초기화 시켜주셔야 해요. [본문으로]
  12. 마지막에 apk 파일 퍼블리시할때 에러가 뜬다면, 정보입력란에 혹시 특수문자(점/슬래시도 유의하셔야 합니다)나 영어가 아닌 다른 언어를 사용하였는지 유의해 보세요! [본문으로]