안드로이드 앱을 개발할 때 뷰의 크기나 거리에는 dp를 사용하고 텍스트 크기(TextView의 textSize)에는 sp를 사용한다. 여기에서 dp와 sp가 무엇을 의미하는지, 왜 뷰와 텍스트에 다른 단위를 사용하는지에 대해 알아보자.

 

 

px의 의미

px이란 화면의 픽셀 수를 의미한다. 뷰의 크기를 픽셀 값(px)으로 지정하면 해상도에 따라 실제 크기가 다르게 보일 수 있기 때문에 뷰의 크기는 일반적으로 match_parent와 wrap_content로 지정하거나 dp와 같은 단위를 사용해 해상도가 다른 단말에서도 크기를 비슷해 보이도록 만든다.

 

 

같은 크기의 화면이라도 픽셀 수가 다를 수 있다 (출처: 공식문서)

 

 

1. dp와 sp의 의미

1) dp: 밀도 독립형 픽셀 (density independent pixel)
160dpi(dots per inch) 화면을 기준으로 한 픽셀로, 예를 들어 1인치 당 160개의 점이 있는 디스플레이 화면(160dpi)에서 1dp는 1px과 같고 1인치 당 320개의 점이 있는 디스플레이 화면(320dpi)에서 1dp는 2px과 같다.

2) sp: 확장 가능 픽셀 (scale independent pixel)
가변 글꼴을 기준으로 한 픽셀로, 기본적으로 dp와 같은 크기이지만 시스템 글꼴 설정에 따라 1sp당 픽셀수가 달라진다.

 

 

2. dp와 sp의 차이

이미지를 통해 텍스트뷰에 dp와 sp를 적용했을 때 화면에 어떻게 나타나는지 한눈에 비교해보자.

시스템 글꼴 설정을 최대로 설정했을 때 변화

위 이미지는 시스템 글꼴 설정을 각각 중간 크기와 최대 크기로 설정했을 때의 네이버웹툰 화면이다. 웹툰 리스트의 글씨들의 크기는 변화가 없지만 요일 헤더의 글씨들은 크기가 커진 것을 확인할 수 있다. 시스템 글꼴 설정과 상관없이 일정한 크기를 유지하는 글씨들이 dp, 글꼴 설정에 맞춰 크기가 변경되는 글씨들이 sp로 설정된 것들이다.

 

 

3. 왜 뷰와 텍스트에 다른 단위를 사용하나?

위에서 설명한 바와 같이 시스템 글꼴 설정에 따라 픽셀 수가 달라질 수 있으므로 텍스트 크기에는 dp 대신 sp를 사용한다. 구글에서 sp 사용을 권장하고 있기도 하므로 텍스트 크기에는 웬만하면 sp를 사용하도록 하자. 안드로이드 스튜디오에서 텍스트 크기에 dp를 사용하는 경우 단위를 sp로 변경하라는 warning을 띄우기도 한다.

 

하지만 모든 텍스트를 sp로 설정했을 경우 글씨 크기를 변경했을 때 다음과 같이 글씨가 가려지거나 레이아웃이 망가지는 경우들이 생길 수 있다. 따라서 디자인을 그대로 유지하고 싶은 경우 크기를 항상 동일하게 하기 위해 dp를 사용하기도 한다.

시스템 글꼴 크기를 최대로 설정했을 때 유튜브 화면

'기초개념 > 기초개념' 카테고리의 다른 글

안드로이드 xml 속성  (0) 2022.03.25
MVP 패턴이란?  (0) 2022.03.22
Fragment 생명 주기  (0) 2022.03.16
Android Context란??  (0) 2022.03.04
Android API Level 및 버전  (0) 2022.03.01

 

 

안드로이드 개발을 하다보면 context를 접하게 된다. getApplicationContext(), getContext() 혹은 this 키워드를 통해서 메서드의 인자 혹은 클래스 생성자로 context를 넣어줘야 하는 경우를 자주 경험했을 것이다.

 

그렇다면 Context란 정확히 무엇일까?

 

 

 

Context 등장 배경

일반적인 OS와는 달리, 안드로이드는 어플리케이션과 프로세스가 독립적이다.
독립적이기 때문에 프로세스가 종료되어도 어플리케이션은 실행 상태일 수 있다.
예를 들어, 서비스(Service)나 브로드캐스트 수신자(Broadcast Receiver)의 경우, 어플리케이션의 실행 여부에 관계 없이 백그라운드에서 작업을 할 수 있는 것은 이 때문이다.

 

이러한 안드로이드의 특징 때문에 프로세스와 어플리케이션은 따로 관리된다. 

프로세스의 경우 운영체제가 관리를 하지만, 어플리케이션은 ActivityManagerSerivce라는 객체가 관리한다.

즉, ActivityManagerService는 여러 어플리케이션들의 정보를 관리하는 역할을 한다.

 

그래서 어플리케이션 정보에 접근하고 싶다면 ActivityManagerService를 통해서 접근이 가능하다. 

ActivityManagerService는 많은 애플리케이션 정보를 key-value를 통해 구분하여 관리하는데, 

여기서 등장하는 것이 Context이다.

 

 

 

Context 역할

1. ActivityManagerService에 접근하기 위한 중간다리 역할이다.

   어플리케이션과 ActivityManagerService는 직접 소통을 하지 않고 Context를 통해 간접적으로 소통한다.

 

2. 각 애플리케이션을 대표하는 ID 역할을 한다. 

   위에서 ActivityManagerService는 key-value값을 통해 어플리케이션을 구분한다고 했다.

   따라서 Context는 자신의 어플리케이션의 key-value값을 가지고 ActivityManagerService에 접근한다.

   이를 통해 Context는 ActivityManagerService로부터 어플리케이션에 관한 전역 정보를 가지고

   올 수 있다.

 

3. 시스템 API에서 제공하는 메서드를 어플리케이션이 사용할 수 있도록 한다.

 

 

 

 

Application과 Context의 관계

어플리케이션에 있어서 Context의 역할에 대해 알아보았다.

그렇다면 어플리케이션은 Context의 기능을 어떻게 이용할까?

 

Context 클래스는 추상 클래스로 되어있고, 애플리케이션(Application), 액티비티(Activity),
서비스(Service)는 이 Context 추상 클래스를 상속받아서 Context의 기능들을 이용한다.

 

엄밀히 말하면, Context 추상 클래스의 메서드를 직접 구현한 것은 ContextImpl라는 클래스이다.
그리고ContextWrapper라는 클래스는 이 ContextImpl을 내부적으로 이용한다.
사실상 
애플리케이션(Application), 액티비티(Activity), 서비스(Service)는 Context 추상 클래스를
상속받는 것이 아니라 ContextWrapper 클래스를 상속받는다.

 

 

그렇다면 위의 설명을 통해 어플리케이션이 Context의 기능을 이용하기 위해서 상속을 받는다는 것은 이해가 됐는데,
액티비티와 서비스는 왜 Context를 상속 받는 것인가?

 

어플리케이션의 Context를 이용해도 되지만, 시스템 API를 각 컴포넌트들에 맞게 구현할 필요가 있다.
액티비티는 액티비티만의 동작 방식이 존재하고, 서비스는 서비스만의 동작 방식이 존재하기 때문이다.

따라서 각각의 컴포넌트들도 각각의 역할에 맞게 API를 사용하도록 Context를 상속받는다.

액티비티와 서비스 컴포넌트는 자기 자신의 Context뿐만 아니라 어플리케이션 Context도 가지고 있다.

 

 

 

Context 종류

Context는 애플리케이션 컨텍스트(Application Context)와 베이스 컨텍스트(Base Context)으로 나뉜다.

 

- 어플리케이션 컨텍스트(Application Context) : 애플리케이션과 관련된 기능을 담는 Context이다.

  이 때, Context는 애플리케이션 전체에서 딱 하나만 존재하게 된다. 딱 하나의 Context 객체만이 

  생성되므로 싱글톤 객체이다. 만약 애플리케이션 컨텍스트를 사용하고 싶다면 getApplicationContext()

  메서드를 통해 호출할 수 있다.

 

- 베이스 컨텍스트(Base Context) : 액티비티, 서비스, 브로드캐스트 수신자, 콘텐츠 제공자,

  안드로이드의 4대 컴포넌트의 Context를 의미한다. 이 경우에는 컴포넌트가 생성될 때마다 Context가

  생성된다. 즉, Context가 여러 개 생성될 수 있다. 베이스 컨텍스트는 getContext() 메서드나 this를 통해

  접근이 가능하다.

 

      액티비티(Activity) & 서비스(Service) 

      액티비티와 서비스는 위에서 언급한 대로 ContextWrapper를 상속하여 Context를 이용한다.

  

      브로드캐스트 수신자(Broadcast Receiver)

      액티비티, 서비스와 달리 브로드캐스트 수신자는 Context를 상속하지 않는다.

      브로드캐스트 수신자가 Context를 이용하기 위해서는 onReceive() 메서드를 통해 Context를 가져온다.

 

      콘텐츠 제공자(Content Provider)

      브로드캐스트 수신자처럼 Context를 상속하지 않는다. 

      콘텐츠 제공자는 getContext()를 통해 Context를 가져올 수 있다.

 

 

Context 사용

  - 만약 현재 작업 위치가 액티비티나 서비스와 같은 컴포넌트에 속해 있다면, 컴포넌트의 Context를

    사용한다.

 

  - 만약 현재 작업 위치가 액티비티나 서비스의 밖이라면, 현재 애플리케이션의 Context를 사용한다.

 

 

Context 접근 

1. getApplicationContext() : 어플리케이션의 Context를 얻는다.

 

2. getContext() : 현재 액티비티의 Context를 얻는다. 

 

3. getBaseContext() : 자신의 Context가 아닌 다른 Context에 접근하고자 할 때 사용한다.

 

4. this : 액티비티 인스턴스 자기 자신을 의미한다.

 

 

 

'기초개념 > 기초개념' 카테고리의 다른 글

안드로이드 xml 속성  (0) 2022.03.25
MVP 패턴이란?  (0) 2022.03.22
Fragment 생명 주기  (0) 2022.03.16
크기 단위인 dp와 sp의 차이  (0) 2022.03.08
Android API Level 및 버전  (0) 2022.03.01

1. 안드로이드 API Level 및 버전 코드

플랫폼 버전 API Level 출시일 Version Code
(Platform Name)
Android 12 31 Oct 4, 2021 S (Snow Cone)
Android 11 30 Sep 8, 2020 R (Red Velvet Cake)
Android 10.0 29 Sep 3, 2019 Q (Quince Tart)
Android 9 28 Aug 6, 2018 P (Pie)
Android 8.1 27 Dec 5, 2017 O_MR1 (Oreo)
Android 8.0 26 Aug 21, 2017 O (Oreo)
Android 7.1
Android 7.1.1
Android 7.1.2
25 Oct 4, 2016 N_MR1 (Nougat)
Android 7.0 24 Aug 22, 2016 N (Nougat)
Android 6.0
Android 6.0.1
23 Oct 2, 2015 M (Marshmallow)
Android 5.1
Android 5.1.1
22 Mar 2, 2015 LOLLIPOP_MR1 (Lollipop)
Android 5.0
Android 5.0.1
Android 5.0.2
21 Nov 4, 2014 LOLLIPOP (Lollipop)
Android 4.4W
Android 4.4W.2
20 June 25, 2014 KITKAT_WATCH (Kitkat Wear)
Android 4.4 19 Oct 31, 2013 KITKAT (Kitkat)
Android 4.3 18 July 24, 2013 JELLY_BEAN_MR2 (Jelly Bean)
Android 4.2
Android 4.2.2
17 Nov 13, 2012 JELLY_BEAN_MR1 (Jelly Bean)
Android 4.1
Android 4.1.1
16 July 9, 2012 JELLY_BEAN (Jelly Bean)
Android 4.0.3
Android 4.0.4
15 Dec 16, 2011 ICE_CREAM_SANDWICH_MR1
(IceCreamSandwich)
Android 4.0
Android 4.0.1
Android 4.0.2
14 Oct 18, 2011 ICE_CREAM_SANDWICH
(IceCreamSandwich)
Android 3.2 13 July 15, 2011 HONEYCOMB_MR2
(Honeycomb)
Android 3.1 12 May 10, 2011 HONEYCOMB_MR1
(Honeycomb)
Android 3.0 11 Feb 22, 2011 HONEYCOMB
(Honeycomb)

 

아래와 같이 버전에 따른 처리가 가능하다.

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.xxx) {
    // Version에 맞는 처리
}

 

 

2. API 버전 디바이스 점유율 (2021.11.05 기준)

 

 

 

 

 

'기초개념 > 기초개념' 카테고리의 다른 글

안드로이드 xml 속성  (0) 2022.03.25
MVP 패턴이란?  (0) 2022.03.22
Fragment 생명 주기  (0) 2022.03.16
크기 단위인 dp와 sp의 차이  (0) 2022.03.08
Android Context란??  (0) 2022.03.04

Jetpack

  • Android 앱을 만들기 위한 컴포넌트, 도구 및 지침들의 세트
  • 개발자가 관심 있는 코드에 집중할 수 있도록 권장사항 준수, 사용구 코드 제거,
    모든 안드로이드 버전과 기기에서 일관되게 작동하는 코드 작성을 돕는 라이브러리 모음

 

Jetpack 라이브러리

 

출처 : https://android-developers.googleblog.com/2018/05/use-android-jetpack-to-accelerate-your.html

 

 

 

Jetpack Components

기능에 따라 네가지의 컴포넌트로 구분이 가능하며, 각각 컴포넌트는 독립적인 활용이 가능하다

 

  1. Architecture
    • 구글에서 제안하는 안드로이드 아키텍처를 구현할 수 있는 기능들로 구성.
    • View를 포함한 UI 요소의 lifecycle management를 비롯하여
      LiveData, ViewModel, Room 등의 기능이 여기에 포함
  2. Foundation
    • 안드로이드 시스템의 핵심 기능을 담당하는 컴포넌트
    • AppCompat을 비롯하여 코틀린 익스텐션과 Multidex 등이 포함
  3. Behavior
    • 앱의 동작과 관련한 것
    • 알림(notification)을 비롯하여 다운로드 매니저권한(Permission) 관리 기능 등이 있다.
  4. UI
    • UI개발과 사용의 일관성을 보장해주는 컴포넌트들이 여기에 해당
    • Animation, Fragment, Layout 등의 일관된 처리가 가능

 

'기초개념 > Jetpack' 카테고리의 다른 글

DataBinding이란  (0) 2022.03.25
MVVM 아키텍처와 AAC  (0) 2022.03.24
LiveData란  (0) 2022.03.24
Room 이란?  (0) 2022.03.14

+ Recent posts