본문 바로가기

2-minutes lecture

안드로이드 개발 기초-#1(숭실대 DCS과정)

회사에 교육신청을 하여 이번 주부터 안드로이드 개발과정을 듣게 되었습니다. 

18주간 매주 금요일 full-day, 회사나 저나 큰 투자라 잘 배워보려고 합니다.

 

과정명은 Digital Channel Specialist(DCS)로 저희 회사와 숭실대가 일종의 제휴하여 진행하는 디지털 역량강화 프로그램입니다. 강사는 컴퓨터학부의 최지웅 교수님입니다.

 

저작권 등 문제가 될 부분은 제외한 순수 강의노트지만 안드로이드 초보자에게 흐름을 따라가며 가볍게 읽을 수 있도록 정리해 보려고 합니다.


 

자바로 안드로이드 개발을 시작해야 하는 이유가 뭘까요?

안드로이드 개발은 자바와 코틀린라는 언어로 개발만 가능합니다. 코틀린이 더 최신이고 요새 많이 쓰이긴 하지만 자바는 서버사이드 프로그램 대부분을 차지합니다. 즉, 언젠가는 배워야 할 언어라 완전 초보에게는 자바로 시작을 권장합니다.

 

물론 안드로이드는 여러가지 정책을 자바에서 코트린으로 넘기고 있으나, 여전히 자바가 대세입니다.

안드로이드에서 코틀린을 사용하게 된건, "무료였던" 자바가 오라클로 가면서 유료화 정책을 가져가는 게 가장 큰 이유입니다. 물론 백도어로 무료로 사용할 방법이 없는 건 아니나 유료화가 코틀린으로 정책을 변경한 가장 큰 이유입니다.

 


 

개발을 하는 방식은 기초부터 차근차근, 즉, 바텀업 방식이 있고, 최종 산출물을 정하고 하는 탑다운이 있습니다. 짧은 시간에 목표지향적으로 진행 하기에는 탑다운이 좋다고 봅니다.

즉, 목표(프로젝트), 자신이 개발하고프 앱의 형태나 기획을 정하고 진행하는 방법입니다.

 


먼저 환경구성하기를 시작합니다..

 

구글링으로 "intellij"하여 설치하세요.

https://www.jetbrains.com/ko-kr/idea/download/#section=windows

 

다운로드 IntelliJ IDEA: 우수성과 인체 공학이 담긴 JetBrains Java IDE

 

www.jetbrains.com

community version을 download하면 됩니다.

 

설치가 끝나고 실행하면 아래와 같은 화면이 뜹니다.

참고로 이 IDE를 만든 JetBrain 은 코틀린언어를 만든 회사입니다.

 


 

다음으로 Android Studio 설치해야 합니다. 동일하게 구글링 하면 됩니다.

https://developer.android.com/studio

 

Download Android Studio and SDK tools  |  Android Developers

Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and more.

developer.android.com

 

인텔리J와 동일한 회사의 제품입니다.

 

안드로이드 설치시 나오는 옵션 중 Android Virtual Device도 나오는데 이것도 설치를 해야합니다.

이는 Fast Enulator 기능을 실행하기 위한 것입니다. 즉, 안드로이드 스튜디오에서 모바일 디바이스를 가상으로 실행하기 위한 것입니다. 

 

원래는 폰으로 소스가 가서 실행되어야 하는데 이걸 설치해서 에뮬레이터를 사용할 수 있게 하는 것입니다. 

에뮬레이터는 다양한 OS버전이나 스펙을 지원해주기 때문에 실제 디바이스가 없어도 다양한 테스트를 할 수 있습니다.

 

참고로 설치를 하다보면 Intel HAXM가 뜨는데, 이는 인텔 CPU 사용자에게만 뜨는 성능강화 모듈...정도로 생각하시면 됩니다.

당연하겠지만 앱이 실제 디바이스에서 도는 거랑 에뮬레이터에서 도는 거랑 실제 기계가 더 빠릅니다.

에뮬레이터 성능개선을 위한 가속기라고 보면 됩니다.

 


 

안드로이드 스튜디오와 같은 도구를 IDE라고 합니다.

Integrated Development Environment. 굳이 한글화하면 통합개발환경인데요, 개발자가 개발하기 편한 환경을 제공하는 툴이지만 IDE는 껍질만 제공하는 거라고 보면 됩니다. 결국 채우는 건 개발자의 몫이지요.

SDK는 도구모음정도로 보면 되고,  소프트웨발시 필요한 도구모음이라 생각하면됩니다.

 

즉, 사람은 IDE를 통해 개발을 하게 되고, 뒤에서 IDE와 SDK를 연결시키는 것이다.

예전에 IDE가 없을 때는 특정 기능을 실행하려면 SDK에서 꺼내서 따로 실행을 시켜야 했습니다.

예를 들어 아래와 같이 코맨드창에서 특정 기능을 실행시켜야 하는 것이었습니다.

 

하지만 IDE를 통해 코맨드창에서 실행시키지 않고, SDK를 바로 실행을 하는 것입니다.

하지만 IDE에 SDK가 종속되진 않습니다. 개발이라는 것은 IDE는 달라져도 기술원천을 갖는 SDK만 연결하면 동일하게 기능하기 때문입니다.

물론 이론적인 이야기고, 실제로는 어느 정도, 어떤 부분에서 상호 종속성이 생길 수 밖에 없는 것 같습니다.

 

그래서 안드로이드 스튜디오라는 IDE를 사용하려면 "적절한" SDK를 설치해야 합니다.

 


개발을 하다보면 수없이 구글링을 하게 되는데, 안드로이드의 경우 백과사전같은 사이트를 제공합니다.

물론 다른 언어들도 유사한 사이트를 운영합니다.

 

https://developer.android.com/

 

Android 개발자  |  Android Developers

Android 앱 개발자를 위한 공식 사이트입니다. Android SDK 도구 및 API 문서를 제공합니다.

developer.android.com

 


이제 안드로이드 앱의 가장 기본적인 사상을 얘기하겠습니다.

 

*앱은 아래의 4종류 컴포넌트 조립으로 만들어집니다.

(컴싸에서 부품을 칭하는 용어는 컴포넌트, 모듈 등등 여러가지 용어가 있는데, 컴포넌트는 독립된 기능을 의미.

제작할때 컴포넌트간 독립, 동작할때는 연결)

 

  • Activity : 화면, Actvity Class 상속
  • Service : 백그라운드에서 실행되는 컴포넌트, 오랫동안 실행되는 작업이나 원격 프로세스를 위한 작업, 유튜브 프리미엄과 같은 경우. 예를 들어 프리미엄 미가입시에는 액티비티를 사용해서 구현한 것이고, 가입시에는 서비스를 사용한 거라고 보면 된다. 예) 배경음악, 다운로드 ??? 앱을 종료해도 동작하는 것도 서비스 영역
  • Boradcast receiver : 앱 외부에서 일어나는 일을 알고 싶은 경우, 예를 들어 배터리가 부족해지는 상황을 체크하고자 할 때 ?? 앱이 감지하는 가, 아니면 앱이 구동될때 OS에 부탁해 두면 OS가 알려주는 건가? 답) OS가 알려주는 것
    모바일에서는 방송의 도착이 실행의 의미가 될 수 있다. 서비스와 방송수신자는 구글에서 패키징되어 제공되는 것도 많다. 사용하면서도 서비스와 방송수신자인지 모르고 사용하는 경우도 많다.
    안드로이드앱은 싱글 엔트리포인트를 갖지 않는다. 이는 시작하는 양상이 모두 다르다는 것. 즉 어떤때는 액티비티로 시작될수도 있고, 서비스로 시작할 수도 있다. (전화앱으로 예를 들면 전화올때는 수신화면, 전화를 걸때는 시작화면 등등) 즉, 앱은 꺼져 있어도 브로드캐스트 리시버의 다양한 요청에 의해 앱의 각 요청에 맞는 화면이 시작될 수 있다. 어떤 앱이든 OS가 실행시켜주는 것이다. 터치에 의해 시작되는 액티비티와 1번 유형 브로드캐스트 리시버가 이벤트를 발생시켜 시작되는 액티비티는 다를 수 있다.
  • Contenet Provider : 데이터를 관리하고 다른 앱에게 데이터를 제공하는 컴포넌트, 만들일은 없고 다른 사람이 만든 걸 쓰기만 하게된다. 앱에서 다루는 데이터는 고립이 되어 있다. 앱마다 데이터의 경계가 있다. 네이티브앱은 컨텐트 프로바이더를 가지고 있다. 즉, 어떤앱이 컨텐트를 제공한다는 것이다. 예를 들어 주소록앱 같은 경우.

예를 들어 액티비티가 4개, 서비스가 2개, 브로드캐스트 리시버 2개, 컨텐트 프로바이더 0개와 같은 형태로 하나의 만들어집니다.

 

*참고) 앱은 화면을 전환하면 이전 화면은 동작을 멈춘다. 왜냐하면 데스크탑 대비 낮은 사양 모바일 디바이스의 정상처리를 위한 것입니다. 즉 액티비티가 전환되면 이전 액티비티는 동작을 멈춘다는 말입니다. 지금은...이게 뭔가...일테니 우선 넘어갑니다.


인텐트라는 개념이 있습니다.

 

말 그대로 의도인데요, 이게 안드로이드에서는 매우 중요한 개념입니다.

 

앱의 의도를 적어서 "의도"만 안드로이드에 전달하면 안드로이드가 가장 적절한 컴포넌트를 찾아서 활성화하고 실행합니다. "의도"는 명확한 지시가 아니라 말 그대로 의도입니다.

과거에는 a컴포넌트가 b컴포넌트의 이름을 정확하게 알아야 했을 것입니다. 그런데 인텐트를 작성하여 OS(실제로는 다르지만 우선...)에 전달을 하면, OS는 이를 찾아서 실행을 시켜줍니다. 즉, a가 b를 몰라도 된다는 것입니다.

 

만약 b를 정확하게 알고 그걸 정확하게 호출하게 한다면(다시 말하면 인텐트로 어떤 기능을 할 수 있는 누구든 해줄해줘가 아니라 정확하게 b를 호출해줘라고 한다면) b의 기능이 바뀌면(b') a에서 호출하는 부분에서 수정이 되어야 합니다. 왜냐면 난 b의 기능을 원하는 것이지, b'의 기능을 원하는 게 아니기 때문입니다.

 

예를 들어 내가 만든 앱에서 사진앱을 호출하는 경우 앱내 탑재된 사진기본앱이 아니라 다른 유사한앱이 있으면 선택창을 띄우는 거라고 보면 됩니다. 일종의 구인공고나 RFP 같은 개념이라고 설명되기도 합니다.

우린 '화면 3개짜리, 지도찾기 앱을 만들거야'라는 구인공고('인텐트')를 내면 한국인개발자든, 베트남개발자든 그 인텐트를 달성해줄 서비스를 찾으면 된다는 것입니다.

 

인텐트의 종류가 2가지가 있습니다. 암시적 인텐트와 명시적 인텐트. 위의 케이스는 암시적(묵시적) 인텐트. 인텐트인데 왜 명시적이 필요한가 의문을 가진다면 인텐트를 잘 이해한 겁니다.

명시적 인텐트는 컴포넌트의 본래 의도에는 위배되지만 제공은 합니다. 바로 같은 앱의 컴포넌트를 호출할때는 명시적 인텐트를 사용합니다.


우리에게 너무 익숙하지만 전혀 할 길 없는 "OS"라고 언급한 부분에 대한 이야기를 하겠습니다.

 

Appications : 시스템 앱, 여기 위에 내가 만든 앱이 올라간다.

Android Framework : 가장 중요. 이것과 라이블리, 런타임은 OS외에 안드로이드앱이 구동하기 위해 필요한 부분이다. 안드로이드는 리눅스를 가져와서 커스텀한 것. PC대비 열악한 하드웨어 사양에서도 동작할 수 있게 수정한 것.
프레임워크라는 건 동일하게 필요한 기능을 모아서 만들어 놓은 소프트웨어. 구조물이 내가 뭔가에 의존한다하면 레이어링된 그림을 사용한다. 구조의 종속성을 나타낸다.
라이브러리와 프레임워크의 차이는 뭘까. 라이브러리에 있는 기능을 프레임워크를 통해 가져다 쓰게 된다. 왜 따로 둘까? 프레임워크는 라이브러리+a라고 보면된다. a는 IoC(Inversion of Control, 프로그램을 하나 만들면 프로그램 시작이 어플리케이션의 코드로부터 시작된다. 제어의 방향이 '앱 -> 프레임워크 -> 앱 -> 프레임워크' 과 같이 제어권하이 프레임워크에 있는 것이다. 내가 짠 코드는 대기하고 있다가 프레임워크가 호출하면 실행된다.) 이다.

Native libraries : 프로그램 작성시 미리 만들어 놓은 코드 덩어리, 게임엔진, 동영상플레이를 자바로 짜면 자바는 OS가 직접 실행하는 게 아니라 하나의 계층이 더 필요하다. 따라서 빠른 실행이 필요한 건 자바가 아니라 C로 만들어 여기에 넣어둔다. 즉, 실행기를 통해 실행되는 건 느리다. 예를 들어 OS는 모두 C나 C++이다. 이들은 하드웨어에서 바로 동작이 되기 때문에.

Android runtime : 

자바와 코틀린이 실행하기 위해 필요한 실행기가 Android Runtime이다.

C나 C++ 같은 언어로 만든 프로그램은 OS위에서 바로 실행된다. 따라서 Android Runtime 같은 게 C로 만들었을 것.

자바스크립트나 파이썬도 별도의 실행기가 있다.

자바스크립트의 실행기는 웹브라우저의 일부분으로 내장되어 있다.

 

HAL : OS

Lunux Kernel : OS

 


 

모든 프로그램은 결국 하드웨어를 움직이고 싶은 것이다. 프로그램을 통해 하드웨어를 동작하는 것입니다.

당연하겠지만 여러가지 어플리케이션의 공통적인 부분이 OS인 것입니다.

 

계층구조에서 레이어가 많으면 많을수록 맨위의 어플리케이션 부분에서 코딩할 일이 거의 없어지게 됩니다. 모든 게 이미 Ready-made 또는 Ready-prepared 되어 있기 때문입니다..

그래서 갈수록 어플리케이션 만들 때 드는 공수가 줄어드는 것인데, 이렇게 되면 로직과 원리는 모르고 최종 기능 중심으로만 개발을 하게 될 수도 있습니다.


이제 실제로 앱을 만드는 얘길 해보겠습니다.

앱을 만드려면 무엇을 먼저 해야할까요?

 

직관적인 이해를 하려면 Activity부터 시작하면 됩니다.

간단하게 화면이라고 생각해도 됩니다.

 

Activity

1. 화면설계 : 위젯(콤보박스 등) 세팅, 터치, 드래그 발생시 할 일, xml로 만듭니다.

2. 이벤트 처리 : 자바로 만듭니다.

 


 

외부 앱에서 콘텐트 제공자를 사용하기 위해서는 콘텐트 리졸버 객체를 사용해야 합니다.

또 다른 게 뭐가 있었을까요?

Service 와 Broadcast Receiver 가 있는데, 이건 나중에 다시 설명하기로 하고 넘어갑니다.

 


 

잠깐 다른 얘길 하자면,

데이터를 앱에도 저장할 수 있지만, 대고객 서비스의 경우 서버가 필요합니다.

과거엔 자신의 노트북에 서버용 OS를 설치하기도 했지만, 이젠 무료서버가 많습니다.

 

그 중 하나가 파이어베이스입니다.

 

*파이어베이스 : 서버랑 통신하지 않는 앱은 찾아보기 어렵습니다. 구글에서 만든 서비스인데요, 보통 일반개발자들이 앱을 만들때 파이어베이스 서버를 사용합니다. 물론 회사들도 많이 사용하구요. 클라우드에서 서버설정 조금만 하면 됩니다. 파이어베이스와 통신하기 위한 코드도 모두 제공해줍니다.

 


안드로이드 스튜디오 실행하기

 

1. 프로젝트 생성

no activity는 액티비티 컴포넌트 없이 만들겠다는 겁ㄴ디ㅏ.
언어를 자바로 선택, API버전도 선택

- 패키지네임 : OS가 여러 앱의 실행을 관리하는 것인데, 안드로이드앱 여러개가 실행될때 안드로이드 프레임워크가 구분을 해야 하는데 프레임워크가 구별하는 앱의 이름입니다. 사용자는 보이지 않습니다. 도메인 주소와 겹치지 않게 하기 위해 거꾸로 구조를 만든 것이고, 실제 마켓에 올라갈때는 필터링이 됩니다.

 

생성된 모습입니다. 좌측 상단 Android를 눌러 탐색기 형태를 보기 편하게 바꿀 수 있습니다.

 

- res : resource, 버튼, 이미지파일, 음원파일과 같은 것을 의미, 자바 파일 외에는 모두 여기 들어갑니다.

- java : java file

- manifest : 적하(적재)목록이라는 의미인데요, java를 가지고 만든 컴포넌트로 앱을 구성하겠다는 컴포넌트목록을 여기에 주면 됩니다. OS는 다운받아 설치한 앱에서 manifest를 먼저 읽어서 컴포넌트를 관리합니다. 그래서 나중에 intent 에서 뭔가를 호출하면 manifest 에 있는 정보로 컴포넌트를 호출시켜 줍니다.

 

manifest 내용, Activity 하나만 보입니다.

 

java폴더 및 파일내용, 패키지이름이 보입니다.
activity_main 입니다.

 

우측상단에서 Split을 선택한 화면

 

 


우선 첫번째 강의시간은 이렇게 종료합니다.

 


몇가지 

  • 리눅스 : 오픈소스라는데 계속 수정한다는 건 필요한 걸 넣어서 다시 프레임워크에 넣는 것인가???
  • 수학은 모델링과 칼큐레이션의 두가지 관점이 있다.