안드로이드

이재하·2021년 10월 17일
0

안드로이드

목록 보기
1/1

안드로이드의 개요와 개발환경 구축

안드로이드의 주요 기능

  • 애플리케이션 프레임워크가 제공하는 API 사용
    ->코드를 재사용하여 효율적이고 빠른 애플리케이션 개발 가능
  • 모바일 기기에 최적화된 달빅(JVM 옛날이름) 또는 아트(Android Run Time)
  • 2D 그래픽 및 3차원 그래픽을 최적화하여 표현
  • 모바일용 데이터베이스인 SQLite를 제공
  • 각종 오디오, 비디오 및 이미지 형식을 지원
  • 각종 하드웨어(블루투스, 카메라, 나침반, WIFI 등) 지원
  • Android Studio를 통해 강력하고 빠른 개발환경 제공
    ->단점: 새롭게 업그레이드될 때 불안정함. 기존 버전에서 개발한 앱이 빌드 안될수있음.

안드로이드의 특징

  • 안드로이드의 핵심 커널은 리눅스로 구성
  • 안드로이드 애플리케이션 개발 언어는 JAVA를 사용(2017년부터는 Kotlin)
  • 안드로이드 SDK에서 많은 라이브러리를 포함하고 있어 개발이 용이
  • 오픈소스를 지향하기 때문에 운영체제부터 관련 문서, 개발 도구 등 거의 모든 것을 무료로 사용 가능
  • 지속적인 업그레이드를 제공
    ->장점: 기능, 보안 업그레이드
    ->단점: 기존 API 삭제 또는 동작 안됨, 기존 개발된 앱 실행 안되거나 하면 개발자 고통.

안드로이드의 구조

응용프로그램(Applications)

java 또는 kotlin으로 제작, 구글 플레이스토어에서 받은 어플리케이션.

응용프로그램 프레임워크(Application Framework)

API 제공, 앱을 효율적이며 쉽게 개발할 수 있도록 하기 위함

안드로이드 런타임(Android Runtime)

달빅 가상머신, 아트 런타임으로 구성.
자바 기반의 명령어를 CPU 명령어로 변환하여 실행함.

라이브러리(Libraries)

C/C++로 작성됨.
오디오, 비디오 등의 미디어, 데이터베이스, OpenGL 등등

리눅스 커널(Linux Kernel)

하드웨어의 운영과 관련된 저수준의 관리 기능들이 들어있음
주로 메모리 관리, 디바이스 드라이버 보안 등

안드로이드 앱의 실행 파일

전통적 실행 파일(.exe, a.out)

  • 실행 파일에는 프로그램을 구성하는 코드와 데이터(전역변수 등)가 들어가 있음.
  • 실행파일이 메모리상으로 올라와 실행을 시작하면 프로세스가 됨.
  • 실행파일과 프로세스가 1:1로 대응되며 응용프로그램끼리는 서로 독립적임.

안드로이드 응용 프로그램(.apk)

  • 실행 파일은 같은 패키지에 속한 자바 클래스와 리소스(이미지, UI 구성 정보 등)의 집합.
  • 응용 프로그램끼리 서로의 기능을 공유할 수 있음.
  • 다른 프로그램의 구성 요소를 불러와 자신의 주소공간에서 실행 가능.

안드로이드의 앱 구성

안드로이드의 응용 프로그램은 4개의 컴포넌트로 구성된다.

  • Activity
  • Service
  • Broadcast Receiver
  • Content Provider

액티비티

사용자 인터페이스를 구성하는 기본 단위.
눈에 보이는 화면 하나가 액티비티이며 여러 개의 뷰(위젯)들로 구성된다.
응용 프로그램은 필요한 만큼의 액티비티를 가질 수 있으며 그 중 어떤 것을 먼저 띄울지 지정.

서비스

UI가 없어 사용자 눈에 직접적으로 보이지 않으며 백그라운드에서 무한히 실행되는 컴포넌트
미디어 플레이어를 들을 수 있는데 비활성화된 상태라도 노래는 계속 재생
UI가 없으므로 사용자의 명령을 받아들일 수 있는 액티비티와 연결해서 사용된다.

방송 수신자(Broadcast Receiver)(일종의 이벤트 전달 수단)

시스템 또는 앱으로부터 전달되는 방송을 대기하고 신호 전달 시 수신하는 역할을 한다.
예를 들어 배터리가 떨어졌다거나, 전화가 왔다던가, 네트워크 전송이 완료되었다 등의 신호를 받는다.
신호만 대기할 뿐 UI를 따로 가지지는 않으므로 방송 수신 시 방송의 의미를 해석하고 적절한 액티비티를 띄우는 역할

콘텐츠 제공자(content Provider)

다른 응용프로그램을 위해 자신의 데이터를 제공한다.
안드로이드는 보안이 엄격하여 다른 응용프로그램의 데이터를 함부로 액세스 하지 못하도록 되어있다.
응용 프로그램 간에 데이터를 공유할수있는 합법적인 유일한 장치가 바로 콘텐츠 제공자이다.

응용 프로그램은 액티비티, 서비스, 방송수신자, 콘텐츠제공자 중 일부만을 가질 수도 있고 여러 개를 가질 수도 있다.

가상 안드로이드 장치 : AVD(Android Virtual Device)

실제 안드로이드 장비가 없더라도 있는 것처럼 확인, 개발 가능

안드로이드 Sample 앱 만들기

App name : 앱 상에 사용자에게 보여주는 이름. 프로젝트 생성 시 영문만 가능.
(AndroidManifest.xml을 통해 App name 변경 가능.-android:label 수정하면 됨.)
Project name : 개발자가 프로젝트를 구별하기 위함.
Package name : 안드로이드 시스템(사용자가 아닌)이 서로 다른 앱을 구분할 수 있도록 하기 위함.

앱은 동일한 패키지 명으로 마켓에 올릴 수 없다. 하지만 다른 서비스의 마켓에는 올릴 수 있다. 앱은 동일한 패키지 명으로 단말기에 두개이상 설치될수없다.

AndroidManifest.xml

  • 앱 전반에 걸친 설정을 담고있는 명세서. 이 명세서를 통해 안드로이드 시스템은 개발자가 구현한 내용을 동작시켜준다.
  • 안드로이드 시스템에 애플리케이션에 대한 필수적인 정보를 제공해주는 역할.
  • 액티비티, 브로드캐스트, 리시버, 컨텐트 프로바이더 등을 기술하고, 안드로이드 시스템이 이를 알게끔 한다.
  • 애플리케이션이 갖게 되는 권한 등을 설정한다.

왜 화면 구성을 XML 형식을 사용할까?

  • 뷰 또는 위젯은 각각의 속성을 가진다.

  • 뷰 간에는 상하 관계를 가질 수 있다.

  • XML 각각의 요소는 속성을 가진다.

  • XML 요소 간에는 상하 관계를 가질 수 있다.

이 두가지점이 비슷. 또한 자바 소스에 하드 코딩되지 않고 리소스 형태로 분리할 수 있다.
결국 레이아웃 구조를 변경할 때 자바소스코드 수정을 최소화할 수 있다.

4장 레이아웃 구성요소 뷰와 뷰그룹


뷰는 화면을 구성하는 최소 단위! 가장 작은 단위!
뷰는 사용자의 터치, 키 입력에 상호작용한다.
눈에 보이는 모든 요소는 뷰고, 화면에 보여지는 모든 요소는 반드시 뷰를 상속받아야 한다.
뷰를 화면에 배치하는 위치 정보가 없다. -> 뷰그룹 필요!

뷰그룹

뷰그룹은 여러 자식 뷰를 담을 수 있으며, 뷰는 반드시 뷰그룹에 포함되어야지만 화면에 그려진다.



결국 뷰그룹도 뷰다!

뷰그룹 자체도 부모 뷰그룹에 의해 배치되어야 하기 때문이다.

LayoutParams

뷰그룹은 자식 뷰를 어떻게 배치할까? -> 자식 뷰가 배치 관련 정보를 제공.
누구에게? -> 뷰그룹에게
어떻게? -> LayoutParams를 통해
어디에? -> 액티비티 레이아웃 파일(즉, Activity_main.xml)로

  • 뷰와 뷰그룹 모두 LayoutParams를 가진다.
  • 결국 모든 종류의 뷰그룹은 최상위 ViewGroup 클래스에서 파생 클래스로 정의된다.
    즉, LayoutParams, MarginLayoutParams를 상속받는다.

LayoutParams 정보

layout_width 또는 layout_height

  • wrap_content : 뷰 스스로 적당한 크기에 맞춘다. 일반적으로 문자열의 길이에 맞춰진다.
  • match_parent : 부모 뷰그룹의 크기에 맞춰진다. 즉, 부모 뷰그룹의 너비(layout_width) 또는 높이(layout_height)에 맞춰진다.
    (match_parent 값은 부모 뷰그룹에 크기를 맞추기 때문에 화면 크기가 다른 단말에서도 유연하게 레이아웃을 유지할 수 있다.)

5장 대표적인 뷰그룹에 대해서

LinearLayout

자식 뷰들을 수평 혹은 수직으로 배치하는 뷰그룹

orientation

vertical : 수직 배치 / horizontal : 수평 배치

gravity

baselineAligned

텍스트가 포함된 자식 뷰 중 가장 높이가 긴 뷰를 기준으로 정렬할지 설정함.

baselineAlignedChildIndex

weight

자식 뷰에 가중치를 지정해서 그 크기를 결정함.
(이때, layout_width="0dp"또는 "wrap_content"로 설정.)

이렇게 하고 싶다면?

이렇게 1번과 3번은 wrap_content로 하고 가운데꺼는 width는 0dp, weight을 1로 주면 된다.

layout_weight 속성은 특정 자식뷰의 크기를 가변적으로 조절할수있기 때문에 다양한 화면 크기의 단말에서 유연하게 레이아웃을 유지할 수 있다.

measureWithLargestChild

true면 레이아웃 내 layout_weight를 가지는 모든 자식뷰를 가장 큰 자식뷰의 크기로 조정됨. 이때, layout_weight는 0 이상의 임의의 값도 가능함. (잘 안쓰인다고 말씀하심.)

RelativeLayout

각 뷰의 관계에 따라 배치

gravity와 ignoreGravity

ignoreGravity : 특정 자식뷰에 대한 gravity를 무력화함.

각 뷰의 화면 상의 위치


이렇게 배치하고 싶으면 이것들을 true로 설정해주면 된다.


예시


FrameLayout

뷰를 겹쳐서 배치

foreground

레이아웃 영역에 전경 이미지를 설정, 해당 이미지는 모든 자식 뷰보다 위에 놓여진다.

foregroundGravity

전경 이미지의 중력 방향

measureAllChildren


FrameLayout의 높이가 View들의 배치로 결정됨.

  • measureAllChildren : FrameLayout의 크기를 자식 뷰들의 배치에 좌우됨.
    (true면 gone이어도 invisible처럼 있는 것으로 간주되어 영역 크기 차지)

layout_gravity

TableLayout

표 형태의 배치. LinearLayout과 유사. 결국 LinearLayout이다.
예시>

CollapseColumns

자식 뷰 중 지정한 열 번호를 해당하는 뷰를 숨긴다. (잘 사용 안 함.)
예> 0,2 : 0열과 2열을 숨기라는 의미

shrinkColumns

열의 공간이 부족할 때 특정 열을 지정하여 공간을 줄이고 나머지 열의 공간을 확보함.

(View 1을 줄임)

stretchColumns

자식 열을 배치하고도 공간이 남을 때 특정 열이 늘어나서 공간을 채우라는 의미.

(View 1을 늘림)

layout_columns

자식 뷰가 배치될 열을 선택함. 자식 뷰를 1열로 설정하면 0번째 열을 비우고 1열부터 뷰가 추가된다.

layout_span

일반적으로 하나의 뷰는 하나의 열을 차지한다. 이 속성을 통해 하나 이상의 열을 차지하도록 함.

6장 대표적인 뷰


안드로이드는 매우 많은 뷰를 제공한다. 또한 상속관계만으로도 각 뷰들의 특징을 쉽게 이해할 수 있다. (예> checkbox는 button을 상속)

id

뷰에 대한 유일한 이름.
findViewById 함수에 id를 인자로 전달하면 해당 뷰를 참조할 수 있다.

보통 이렇게 쓴다.(@+id/id_name)
이런식으로 id를 전달한다.

-> setText를 했으므로 "Hello World!"라고 출력이 될 것이다.

background

뷰 영역 내에 배경 이미지나 특정 색상을 설정함.

-> 이렇게 하게 되면 drawable폴더 안에 있는 ic_Launcher라는 이미지가 배경으로 들어가게 됨.

padding

자식 뷰 내의 여백.

profile
SW Engineer

0개의 댓글