[Android]안드로이드 프로젝트 이해하기#1

rxjw95·2020년 5월 19일
0
post-thumbnail

안드로이드 앱 개발 특징

이전 포스팅에서 안드로이드 플랫폼에 대해서 알아봤는데, 다시 한 번 간단하게 요약한다.

안드로이드 특징

  1. 리눅스 기반의 운영체제
  2. java, kotlin 언어를 사용한 개발
  3. 운영체제 핵심 코드, 라이브러리, 구글에서 만든 앱 코드 등 대부분의 코드는 오픈소스
  4. 여러 제조업체에서 스마트폰을 만들 수 있다.
  5. 안드로이드 기반의 모든 애플리케이션은 평등하다는 사상으로 기본 탑재된 앱과 개발자 앱이 같은 환경에서 같은 API를 이용한다.

3, 4번을 보면 개발자 관점에서 오픈소스 코드를 활용하여 다양한 앱을 만들 때 참조할 수 있는 좋은 장점이지만, 기기의 파편화로 인해 단점이 될 수 있다.

스마트폰 제조사들이 스마트폰을 제작할 때 구글에서 만든 안드로이드 플랫폼을 그대로 탑재하는 것이 아니라 수정이나 추가해서 제작한다. 그래서 표준 API로 개발된 코드가 특정 스마트폰에서 수행되지 않는 문제가 발생할 수도 있다.

안드로이드는 IOS 에서는 허용하지 않는 많은 부분을 개발자가 구현할 수 있는데
멀티태스킹이 대표적인 예이다.

어떤 프로세스가 화면을 점유하여 사용자가 이용하고 있어도 다른 앱이 백그라운드에서 동작하여 다른 서비스를 제공받을 수 있다.

또한, 서드 파티 앱에서 구현할 수 없는 여러 가지 기능을 안드로이드에서는 구현할 수 있다.
예시로는 스마트폰에 전화가 걸려오는 순간 앱에서 감지하고 전화가 걸려온 번호를 추출할 수 있는 기능, 인증 번호를 받자마자 자동으로 기입이 되는 기능과 같다.

이러한 다양한 기능을 개발할 수 있는 자유도는 장점이 되지만, 사용자 관점에서 백그라운드 수행으로 인한 배터리 소비, 트래픽, 메모리 누수/부족 등의 현상을 야기할 수 있는 단점이 있다.

그렇기 때문에 안드로이드 개발자는 이러한 부분들을 아~~주 신경써야한다.


안드로이드 아키텍처

  • 리눅스 기반 운영체제 (리눅스 커널 기반이지만 안드로이드 플랫폼에 맞춰 수정되어 있다.)
  • HAL은 자바 API 프레임워크에 하드웨어 기능을 이용하는 표준 인터페이스 제공
  • 안드로이드 런타임 - 이전 포스팅 참고
  • 자바 API 프레임워크는 개발자 관점에서 가장 중요하다. 앱 개발 시 이용하는 표준 라이브러리

컴포넌트 기반

매일매일 복기해야하는 안드로이드 개발의 시작이다.

안드로이드 아키텍처는 컴포넌트 기반이다.

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

컴포넌트는 앱의 구성 단위, 컴포넌트를 조합하여 하나의 앱을 만든다.

개발 시에 이 컴포넌트의 물리적인 모습은 class이다. 즉, class 하나가 컴포넌트이다.
하지만! class가 전부 컴포넌트는 아니다.

클래스는 컴포넌트가 있고, 일반 클래스가 있는데, 이 둘의 차이는 생명주기를 누가 관리하느냐에 따라 다르다.

일반 클래스는 개발자 코드 (필요할 때, new 연산자)
컴포넌트는 똑같은 클래스지만 생명주기를 개발자 코드로 관리하지 않고, 시스템이 알아서 생성하고 관리하다가 소멸한다.

컴포넌트는 앱 내에서 독립적인 실행 단위이다.

컴포넌트의 주인이 시스템이라고 해도 컴포넌트 역시 클래스이기 때문에 여러 클래스(내가 만든 일반 클래스던 다른 컴포넌트던)와 조합해야한다.

그럼에도 컴포넌트 클래스를 구분하는 이유는 독립적인 수행 단위로 동작하기 때문이다.(느슨한 결합도)


class Plus{
    private int a, b;
    Plus(int a, int b){
        this.a = a;    this.b = b;
    }
    
    int getPlus(){    
        return a + b;
    }
    
}
public class Test{
    public static void main(String[] args){
        int a = 10;
        int b = 3;
        Plus cal = new Plus(a, b);
        println("a + b = " + cal.getPlus());
    }
}

위 처럼 A 클래스에서 B 클래스를 실행하려면 보통 B b1 = new B(); 와 같이 객체를 생성하고 사용한다. 이를 A 클래스가 B 클래스에 결합되어 있다고 표현한다.

하지만, 이 B 클래스가 컴포넌트 클래스라면, 개발자는 코드로 해당 클래스를 생성하고 실행할 수 없다.

그렇다면, 어떻게 하나가 될까?

바로 Intent를 매개체로 하여금 독립적으로 실행하는 구조이다.

즉, A 컴포넌트 클래스 혹은 일반 클래스는 B 컴포넌트 클래스의 실행을 시스템에 의뢰하고 시스템에서 B 컴포넌트 클래스를 실행하는 구조이다.
= 각 컴포넌트는 개발자 코드 간의 결합이 발생하지 않는다.

main 함수 같은 애플리케이션의 진입 지점이 따로 없다.

흔히 우리는 애플리케이션을 실행될 때 최초의 실행 부분을 main 함수라고 부르는데, 안드로이드는 이런 개념이 없다.

즉, 앱의 수행 시점이 다양하다는 소리이다. 앞에서 말했듯이 컴포넌트 클래스들은 모두 독립적인 수행 단위이기 때문에 앱이 구동될 때 최초로 실행되는 시점이 다를 수 있다.

예를 들면, 한 앱의 기능이 SMS 목록을 보여주는 컴포넌트와 SMS 발송 컴포넌트, SMS 수신 컴포넌트가 있다.

일반적으로 우리가 앱을 킨다면, SMS 목록부터 먼저 보여준다.
그리고 누군가에게 메시지가 도착한다면, SMS 수신 컴포넌트가 먼저 수행된다.

안드로이드 컴포넌트의 종류

1. Activity : UI를 구성하기 위한 컴포넌트

클라이언트 측에게 화면을 보여주는 컴포넌트이므로 가장 많이 작성이 필요한 컴포넌트이다.

  • 반드시 애플리케이션에는 하나 이상의 액티비티가 있어야 합니다.
  • 2개 이상의 액티비티를 동시에 Display 할 수 없습니다.
  • 인텐트(Intent)를 통해 다른 애플리케이션의 액티비티를 호출할 수 있습니다.
  • 액티비티 내에 프래그먼트(Fragment)를 추가하여 화면을 분할시킬 수 있습니다.

2. Service : 백그라운드에서 수행되는 컴포넌트

애플리케이션을 사용하면서 유튜브 또는 멜론과 같이 음원 스트리밍 앱을 사용한다던지 다른 작업을 하면서 파일을 다운로드할 때 서비스를 사용

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

3. Contents Provider : 애플리케이션 간 데이터를 공유하기 위한 컴포넌트

내가 개발한 앱이 주소록 데이터나 갤러리의 이미지를 필요로 할 때 사용

특정한 애플리케이션이 사용하고 있는 데이터베이스(DB)를 공유하기 위해 사용하며 애플리케이션 간의 데이터 공유를 위해 표준화된 인터페이스를 제공합니다.

4. Broadcast Receiver : 이벤트 모델로 수행되는 컴포넌트

안드로이드 OS로부터 발생하는 각종 이벤트와 정보를 받아와 핸들링하는 컴포넌트입니다.

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

  • 앱에서 인증번호를 요청하면 메시지로 받은 인증번호를 자동으로 번호를 인식하고 기입해주는 기술을 예로 들 수 있다.

리소스를 이용한 개발

안드로이드의 또 하나의 큰 특징은 리소스 외부화의 극대화이다.

리스소 외부화란, 코드 영역에 항상 같은 결과를 보여주는 정적 콘텐츠를 코드에서 분리하자는 개념이다.

textView.setText("동해물과 백두산이 마르고 닳도록 하느님이 보우하사 우리나라 만세");

위 코드를 액티비티 곳곳에 보여줘야해서 코드 영역에 넣는다면, 물론 실행은 잘 되고 잘 보여지겠지만, 코드가 길어지고 지저분해져 유지보수성이 떨어지는 문제가 있다.

이러한 정적인 부분은 별도의 리소스 파일로 작성하고 코드에서는 리소스를 얻어 사용한다.

코드 영역

리소스 영역

리소스 외부화는 다른 소프트웨어 개발에서도 흔히 사용되는데, 안드로이드는 이게 왜 특징이되는가?

안드로이드는 문자열 뿐만 아니라, 문자열, 크기, 색상, 레이아웃, 메뉴, 애니메이션 등 정적인 많은 부분을 리소스로 만들어 개발한다.

카카오톡에서 디자인이 텍스트 말고 변하는 것을 본 적 있는가?

액티비티 생명주기

액티비티의 대표 3가지 상태

Resumed (Active)- Focus 를 가지고 있으며 화면에 보이는 상태입니다. (Dialog 에 의해 가려진 Activity 또한 Active상태입니다 - dialog 또한 Activity의 일부이기 때문)

Paused - 화면에는 보이지만 Focus를 받지 못하고 있는 상태입니다. (투명한 Activity 에 의해 가려진 경우에도 Paused 상태에 해당합니다.)

Stopped - 화면에 보이지 않는 상태입니다. 다른 Activity에 의해 가려지거나 전화가 오거나 홈버튼을 누르는 등의 작업에 의해 Activity는 Stopped 상태로 전환됩니다.

call-back method

onCreate() - 컴포넌트 초기화
onStop() - 메모리관리등을 위해 Activity의 상태를 Bundle에 저장하는 작업등을 진행합니다. 이 경우 onSavedInstanceState() Call-Back Method가 실행

onStart() 와 onResume() 함수가 구분되어 있는데 둘의 차이점은 무엇인가요?

onStart() 는 액티비티가 사용자에서 보여지기 직전에 호출되고, onResume() 은 사용자에게 보이지만 사용자와 상호작용하기 직전상태일때 실행됩니다.

profile
32bit 뇌에서 64bit 뇌가 될 때까지

0개의 댓글