안드로이드/자바 기본개념

bye9·2021년 5월 26일
2

CS

목록 보기
10/10

Manifest

안드로이드 시스템이 앱의 코드를 실행하기 전에 확보해야 하는 앱에 대한 필수 정보를 시스템에 제공하는 목록

  1. 앱의 패키지 이름
  2. 앱에서 사용되는 컴포넌트(액티비티, 서비스, 브로드캐스트 리시버, 컨텐트 프로바이더)
  3. 권한(Permission)
  4. 앱에서 요구하는 하드웨어와 소프트웨어 특징

1. Package name and Application ID

매니페스트 파일의 Root element() 에는 해당 앱의 패키지 네임이 반드시 기재되어야 합니다.

"com.ready.example" 이라는 패키지 네임의 manifest 파일

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ready.example"
    android:versionCode="1"
    android:versionName="1.0" >
    ...
</manifest>

여기서 manifest의 패키지 네임은 우리가 앱을 빌드하여 APK 를 추출하는 과정에서 Android Build Tool 에 의해 다음 2가지 목적으로 사용됩니다.

  • App Resource 에 접근하는데 사용되는 R 클래스의 네임스페이스로 적용됩니다. 위 예에서는 com.ready.example.R 클래스가 생성됩니다.
  • 매니페스트 파일 내에서 선언된 상대경로에 적용됩니다.
    예를 들어 \<activity android:name=".MainActivity> 라고 선언했다면 이는 "com.ready.example.MainActivity" 를 가리키게 됩니다.

2. App Components

4대 컴포넌트(Activity, Service, Broadcast Receiver, Content Provider), 이 컴포넌트들을 앱에서 사용한다면 매니페스트 파일에 등록해줘야 합니다. Manifest 파일 내에서 각각 다음 태그를 통해 선언할 수 있습니다.

  • <activity> : Activity
  • <service> : Service
  • <receiver> : Broadcast Receiver
  • <provider> : Content Provider

4대 컴포넌트들은 각각 인텐트에 의해 활성화됩니다.
여기서 인텐트란 메세지 객체로, 어떤 행동을 수행할지에 대한 명령이나 작업에 필요한 데이터를 포함합니다.
(앱이 인텐트를 시스템에 발행하면 시스템은 각 앱의 매니페스트에 선언된 intent-filter 에 기초하여 처리할 수 있는 인텐트를 컴포넌트를 찾게 됩니다. 만약 여러 개의 앱이 인텐트를 다룰 수 있다면, 사용자가 해당 인텐트를 어떤 앱에게 넘길지 선택할 수 있습니다.)

3. Permissions

안드로이드 앱은 민감한 유저 정보나 카메라나 인터넷 등 특정 시스템 기능을 사용할 때 반드시 권한을 요청해야합니다.

예시) SMS 전송에 대한 권한 요청
<manifest ... >
    <uses-permission android:name="android.permission.SEND_SMS"/>
    ...
</manifest>

4. Device Compatibility(적합성)

Manifest 파일에는 앱이 필요로 하는 하드웨어나 소프트웨어 특징을 명시할 수 있습니다.

예를 들어, 카메라 앱을 만들 경우에 카메라가 필수로 있어야 하니 카메라가 있는 기기에서만 Play Store 에서 해당 앱이 다운로드 될 수 있도록 명시하는 것입니다.

예시) compass sensor가 있는 기기에서만 다운로드 가능하게 하기위함
<manifest ... >
    <uses-feature android:name="android.hardware.sensor.compass"
                  android:required="true" />
    ...
</manifest>

추가

  1. action : intent를 통해 수행할 행동을 지정(android.intent.action.MAIN : 메인이니까 첫번째)
  2. category : action과 함께 activity의 특징을 나타냄(android.intent.category.LAUNCHER : 첫번째)

https://readystory.tistory.com/187
https://blackdroid.tistory.com/3


Gradle?

빌드 배포 도구

  • 안드로이드 스튜디오는 코드의 편집만을 담당할 뿐, 빌드는 Gradle을 통해 모두 수행된다.(안드로이드 스튜디오와 빌드 시스템이 독립적)

build.gradle

  • 모듈의 빌드 방법이 정의된 빌드스크립트로 빌드에 사용할 SDK 버전부터 애플리케이션 버전, 사용하는 라이브러리 등 다양한 항목 설정이 가능하다.

  1. apply plugin: 'com.android.application'
    안드로이드 플러그인 사용을 gradle에 적용하는 것이다.
    (top-level선언)

  2. android {...}
    안드로이드와 관련된 빌드 설정

  3. compileSdkVersion, buildToolsVersion
    각각 앱 컴파일시 사용할 SDK 버전을 지정하고, 사용할 빌드툴의 버전을 지정하는 부분

  4. defaultConfig{...}
    AndroidManifest.xml에서 사용하는 설정들에 대해서 동적인 옵션을 주고 싶을 때 이 블록내에 포함시킨다.
    (versionCode, versionName등의 값을 이곳에서 설정)

  5. buildTypes{...}
    dev, alpha, beta, release 같이 빌드 타입 종류를 지정

  6. dependencies{...}
    라이브러리와 같은 의존성 추가 시 이곳에 작성

https://uroa.tistory.com/64


NDK, SDK

NDK(Native Development Kit)

C 및 C ++와 같은 언어를 사용하여 네이티브 코드로 앱의 일부를 구현할 수 있게 하는 도구 모음

SDK(Software Development Kit)

안드로이드 소프트웨어를 개발하기 위한 툴킷

  • 안드로이드 API
  • 안드로이드 응용프로그램 개발에 필요한 각종 도구들(컴파일러, 에뮬레이터 등)
  • 샘플 코드
  • 관련 문서

안드로이드 4대 컴포넌트


각 컴포넌트들은 하나의 독립적인 형태로 존재함.
각 컴포넌트들은 고유의 기능을 수행함.
각 컴포넌트들은 인텐트를 통해 서로 상호작용함.

1. Activity(액티비티)

  • UI 화면(사용자와 상호작용)을 담당하는 컴포넌트

  • 액티비티 역할을 하기 위해서는 자바소스에서 Activity클래스를 상속해야 하며 액티비티가 기본적으로 가지고 있는 생명주기 메소드를 재정의하여 원하는 기능을 구현하는 방식으로 제작합니다.

  • 특징
    ◆ 안드로이드 어플리케이션은 반드시 하나 이상의 Activity를 가지고 있어야 합니다.
    ◆ 두개의 액티비티를 동시에 Display할 수 없습니다.
    ◆ 다른 어플리케이션의 액티비티도 불러낼 수 있습니다.
    ◆ 액티비티 내에는 프래그먼트(Fragment)를 추가하여 화면을 분할시킬 수 있습니다.

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

2. Service(서비스)

  • 백그라운드에서 실행되는 프로세스

  • 눈에 보이지 않는 곳에서 작업을 처리하기 때문에 별도의 스레드(Thread)에서 동작한다고 오해하는 경우가 많습니다. 하지만 서비스는 엄연히 메인 스레드에서 동작합니다.

  • 특징
    ◆ 네트워크(Network)와 연동이 가능합니다.
    ◆ 별도의 UI를 가지지 않으며 백그라운드에서 수행됩니다.
    ◆ 액티비티와 서비스는 UI스레드라고 불리는 동일한 애플리케이션 스레드로 실행됩니다.
    ◆ 애플리케이션이 종료되어도 이미 시작이 된 서비스(Service)는 백그라운드(Background)에서 계속 동작합니다.
    ◆ 모든 서비스는 Service클래스를 상속받아서 사용합니다.

  • 예시
    안드로이드 모바일에서는 애플리케이션을 사용하면서 유튜브 또는 멜론, 지니 등등 음원 스트리밍 앱을 사용한다던지 다른 작업을 하면서 파일을 다운로드할 때 서비스를 주로 사용합니다.

3. Broadcast Recevier(방송 수신자)

  • 안드로이드 OS에서 발생하는 다양한 이벤트와 정보를 받아 핸들링하는 컴포넌트

  • 브로드캐스팅은 메시지를 여러 객체에게 전달하는 방법을 의미하는데 이렇게 전달되는 브로드캐스팅 메시지를 방송수신자라는 어플리케이션의 구성요소를 이용해 받을 수 있습니다.

  • 특징
    ◆ 디바이스에서 발생하는 일 중에서 어플리케이션이 알아야 하는 상황이 발생하면 알려줍니다.
    ◆ 수신기를 통해 디바이스의 상황을 감지하고 적절한 작업을 수행합니다.
    ◆ 대부분 UI가 존재하지 않습니다.

  • 예시
    사용자 안드로이드 디바이스의 시스템 부팅시 앱 초기화, 네트워크 끊김 등등 특수한 이벤트에 대한 처리 혹은 배터리 부족 알림, 문자 수신과 같은 정보를 받아 처리를 해야 할 필요가 있을 때 동작합니다.

    즉, 안드로이드 OS에서 메신저앱 또는 문자 메시지가 오면 모든 앱에 "메시지가 왔다"라는 하나의 정보를 방송(BroadCast)을 합니다.
    이 메시지를 받기 위해 브로드캐스트 리시버를 구현하면 되며 해당 정보가 오면 특정 이벤트를 처리할 수가 있습니다.

4. Content Provider(콘텐트 제공자)

  • 데이터를 관리하고 다른 어플리케이션 데이터를 제공해주는 컴포넌트

  • 특정한 애플리케이션이 사용하고 있는 데이터베이스(DB)를 공유하기 위해 사용

  • 애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공

  • 특징
    ◆ 파일 입출력, SQLiteDB, Web등을 통해서 데이터를 관리합니다.
    ◆ 외부 애플리케이션이 현재 실행 중인 애플리케이션 내에 있는 데이터베이스(DB)에 함부로 접근하지 못하게 할 수 있으면서 나 자신이 공개하고 공유하고 싶은 데이터만 공유할 수 있도록 도와줍니다.
    ◆ 작은 데이터들은 인텐트(Intent)로 애플리케이션끼리 데이터를 서로 공유가 가능하지만 콘텐 프로바이더는 음악 또는 사진 파일 등과 같이 용량이 큰 데이터들을 공유하는데 적합합니다.
    ◆ 프로바이더는 데이터의 Read(읽기), Write(쓰기)에 대한 퍼미션이 있어야 애플리케이션에 접근이 가능합니다.
    ◆ 데이터베이스에서 흔히 사용되는 CURD(Create, Read, Update, Delete) 원칙을 준수합니다.

인텐트(Intent)

  • 애플리케이션 컴포넌트(구성요소) 간에 작업 수행을 위한 정보를 전달하는 역할을 하며 통신수단

  • 컴포넌트 A가 컴포넌트 B를 호출할 때 필요한 정보를 가지고 있으며, 이 정보에는 호출 대상이 되는 컴포넌트 B의 이름이 명시적으로 표시가 됨과 동시에 속성(Attribute)들이 암시적으로 표시되기도 합니다.
    그리고 호출된 컴포넌트 B가 호출한 컴포넌트 A로 어떠한 결과를 전달할 때도 인텐트가 사용이 됩니다.

  • 특징
    ◆ 서로 독립적으로 동작하는 4가지 컴포넌트들 간의 상호 통신을 위한 장치입니다.
    ◆ 컴포넌트에 액션(Action), 데이터(Data) 등을 전달합니다.
    ◆ 인텐트를 통하여 다른 애플리케이션의 컴포넌트를 활성화시킬 수 있습니다.

  • 예시
    액티비티 간의 화면 전환(이동)


https://velog.io/@jojo_devstory/


안드로이드 Activity 생명주기


onCreate() : 최초로 앱 실행 시 호출, 초기화 관련 작업
onStart() : 이 시점부터 사용자가 액티비티를 볼 수 있다.
onResume() : 액티비티가 실제 사용자와 상호작용이 가능한 포그라운드에 위치하면 호출된다, 액티비티 실행 중 상태

onPause() : 액티비티가 실행 중인 상태에서 사용자와 상호작용이 불가능한 상태, 즉 포커스를 잃은 상태가 되면 호출
onStop() : 액티비티가 더 이상 보이지 않을 때 호출
onDestroy() : 액티비티가 종료되거나 앱 프로세스 자체가 종료되면 호출

ex) 불투명한 새로운 액티비티가 최상단으로 올라와서 기존 액티비티가 완전히 보이지 않게 되면 onPause()에 이어서 onStop()까지 바로 호출된다. 불투명 새로운 액티비티가 최상단으로 올라오면 기존 액티비티는 사용자와 더 이상 상호작용을 할 수 없다. 포커스도 새로운 액티비티에 맞춰진다. 그렇기 때문에 onPause()가 호출될 것이다. 또한 불투명하기 때문에 기존 액티비티가 보이지 않으므로 onStop()까지 호출되는 것이다.

또한, 다이얼로그를 띄워서 액티비티가 최상단이 아닌 상황에는 onPause()가 호출되어야 할 것 같지만 실제로는 그렇지 않다. 다이얼로그가 액티비티의 일부이기 때문이다.(즉, 새로운 액티비티가 최상단으로 온 상황이 아니다.) 따라서 아무 함수가 호출되지 않는다.

https://brunch.co.kr/@mystoryg/80


앱 배포 시

APK

  • 일반적인 APK는 APK 파일 하나를 통해 많은 디바이스의 호환을 지원한다. 그렇다 보니 APK 자체에 여러개의 ABI(Android Binary Interface)를 포함하게 되며, APK 파일의 크기는 커질 수 밖에 없다.

AAB(Android App Bundle)

  • APK의 용량 문제를 해결하기 위해 개발
  • 기존 통빌드(APK 하나로 전부 해결하는) 혹은 다중 APK를 통해 사용자에게 앱을 지원하는 방식을 사용했다면, 현재는 AAB를 통해 좀 더 경량화된 앱을 제공할 수 있다.


versionCode

  • 앱의 버전 코드를 나타내는 정수(int)
  • 업데이트를 검사할 수 있는 용도
  • 첫 번째 버전은 1이고, 이후 versionCode를 1씩 증가시켜서 배포
  • 사용자에게 공개되지않음

versionName

  • 앱의 배포 버전을 나타내는 문자열(String)
  • <major>, <minor>, <point>로 보통 표기(예: 1.0.1)
  • 사용자에게 공개됨

<major> : 앱의 큰 틀이 변화된 경우
<minor> : 기능 추가, 기능 삭제 등
<point> : 버그 수정, 디자인 수정 등


Context

  • 정의 : Interface to global information about an application environment. This is an abstract class whose implementation is provided by the Android system. It allows access to application-specific resources and classes, as well as up-calls for application-level operations such as launching activities, broadcasting and receiving intents, etc.
    애플리케이션 환경에 대한 글로벌 정보의 인터페이스이다.
    이것은 안드로이드 시스템에 의해 구현이 제공되는 추상 클래스이다. 애플리케이션별 리소스 및 클래스에 대한 액세스는 물론, 액티비티의 시작과 브로드캐스팅, 그리고 intent를 받는 것과 같은 애플리케이션 수준의 운영을 위한 업 콜을 수행할 수 있다.
  • Application의 현재 상태에 대한 맥락이다
  • Application/Activity에 관련된 정보를 얻을 수 있다
  • Resources/DB/SharedPreferences에 접근할 때 사용되기도 한다
  • Application/Activity의 부모 클래스이다

Context는 App 환경에 대한 다양한 정보를 담고있는 인터페이스.
"즉, 어떤 Activity, application 인가에 대해서 구별하는 정보가 context라고 이해할 수 있다."

(내 자신이 Activity라면 신분증은 Context)

실제로 Android에서 사용되는 Methods

  • View.getContext()
    현재 실행되고 있는 View의 context를 return 하는데 보통은 현재 활성화된 activity의 context가 된다.

  • Activity.getApplicationContext()
    어플리케이션의 Context가 return된다. 현재 activiy의 context 뿐만 아니라 application의 lifeCycle에 해당하는 Context가 사용된다.

  • ContextWrapper.getBaseContext()
    자신의 Context가 아닌 다른 Context를 access하려 할 때 사용한다. ContextWrapper는 getBaseContext()를 경유해서 Context를 참조할 수 있다.

  • this
    View.getContext()와 같다.

Application Context(애플리케이션 컨텍스트)

  • 애플리케이션 자체의 생명 주기(라이프사이클)에 영향을 받는다.
  • 싱글톤 객체로 존재한다.
  • Activity에서 getApplicationContext라는 함수를 통해 접근할 수 있다.
  • 애플리케이션 컨텍스트는 현재의 컨텍스트와 분리된 라이프사이클을 가진 컨텍스트가 필요할 때나 액티비티의 범위를 넘어서 컨텍스트를 전달할 때에 사용합니다.

(예시: 만약 당신의 애플리케이션에서 싱글턴 객체를 생성하였는데 그 객체에 컨텍스트가 필요하다면, 애플리케이션 컨텍스트를 사용하면 됩니다.

만약 이러한 상황에서 액티비티 컨텍스트를 전달한다면 메모리 누수가 발생할 것입니다. 액티비티는 가비지 콜렉터에 의해 수집되지 않는데 액티비티 컨텍스트는 액티비티에 대한 참조를 계속 유지하기 때문입니다.

액티비티에서 라이브러리를 초기화해야 하는 경우, Activity 컨텍스트가 아닌 Application 컨텍스트를 전달해야합니다.)

Activity Context(액티비티 컨텍스트)

  • 액티비티의 라이프사이클과 연결되어 있다.
  • Activity에서 사용가능하다.
  • 액티비티의 범위 내에서 컨텍스트를 전달하거나, 라이프사이클이 현재의 컨텍스트에 붙은 컨텍스트가 필요할 때(need the context whose lifecycle is attached to the current context) Activity 컨텍스트를 사용합니다.
  • 예를 들어 Activity에서 사용되는 Dialog, Toast 등 UI 작업에 필요한 Context는 Activity Context를 사용하면 된다.

** 즉, Singleton 객체나 Application에서 초기화하는 객체일 경우 Application Context를, Activity에서 사용되는 UI 컨트롤러 객체들은 Activity Context를 사용하는 것을 권장한다.

https://blog.mindorks.com/understanding-context-in-android-application-330913e32514
https://velog.io/@l2hyunwoo/Context-In-Android
https://shinjekim.github.io/android/2019/11/01/Android-context%EB%9E%80/
https://shnoble.tistory.com/57
https://www.crocus.co.kr/1598


super 예약어

  • super.객체변수
    하위 클래스에 의해 가려진 상위 클래스의 멤버변수나 메소드 접근
  • super.메소드이름(매개변수)
    상위 클래스의 생성자를 호출하기 위해 사용
  • super(매개변수)
    상위 클래스의 생성자를 호출

this

  • 현재 클래스의 인스턴스(객체)를 의미
  • 즉, 현재 클래스의 멤버변수를 지정할때 사용

https://alzi.tistory.com/65
https://ithub.tistory.com/66


MVC, MVP, MVVM

https://velog.io/@jojo_devstory/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%ED%8C%A8%ED%84%B4-MVC%EA%B0%80-%EB%AD%98%EA%B9%8C
https://academy.realm.io/kr/posts/eric-maxwell-mvc-mvp-and-mvvm-on-android/


자바의 변수 개념

- 멤버변수

선언위치 : 클래스 영역

클래스변수

모든 객체가 공통적으로 똑같은 속성을 가질 때 사용

인스턴스변수(객체변수)

각각의 객체(인스턴스)마다 개별적인 속성을 가져야 할 때 사용

class GameCharacter {
	static int height = 200; //클래스변수, 2미터 키 모든 객체에 적용
   	String hairColor; //인스턴스변수, 값이 고정되지 않아 각 객체마다 다른 값 가능
}

- 지역변수

선언위치 : 메소드나 생성자 내부 영역


https://easywebs.tistory.com/29


자바 개념

https://wikidocs.net/214
https://velog.io/@bye9/CS%EB%A9%B4%EC%A0%91%EC%A4%80%EB%B9%84-%EC%9E%90%EB%B0%94%EC%96%B8%EC%96%B4


0개의 댓글