Y_Ding

안드로이드 앱의 기본 구조 본문

TodayILearned/Android&Kotlin

안드로이드 앱의 기본 구조

YJ_ILY 2023. 9. 14. 00:34

안드로이드

  • 구글에서 제작한 모바일 운영체제 (리눅스 기반)
  • 전 세계 모바일 플랫폼 시장의 70~80% 차지
  • 자바나 코틀린 언어를 이용해 개발
  • 구글의 플레이 스토어뿐만 아니라 다양한 방법으로 사용자에게 배포 가능
  • 안드로이드폰은 다양한 제조업체에서 만들 수 있음
    • 개발자는 크기가 다양한 폰에서 앱이 똑같이 보이도록 호환성을 고려해야 함
    • 자신이 만든 앱이 여러 장치에서 제대로 동작하는지를 점검해야 함
  • 운영체제 버전별로 API레벨이 지정돼 있어서 소스코드에서는 대부분 API레벨을 이용
  • 개발자는 운영체제 버전과 API레벨을 함께 알고있어야 함

컴포넌트

  • 안드로이드 앱 개발의 핵심
  • 애플리케이션을 구성하는 단위
  • 하나의 애플리케이션은 여러 컴포넌트로 구성
  • 안드로이드에서는 클래스로 컴포넌트를 개발
  • 즉, 하나의 클래스가 하나의 컴포넌트

 

  • 컴포넌트로 구성된 안드로이드 앱은 애플리케이션 라이브러리를 사용할 수 있음
    • 애플리케이션 라이브러리? 다른 애플리케이션을 라이브러리처럼 사용하는 것
    • 카톡 채팅 화면에서 카메라 앱을 실행해 사진을 찍은 뒤 이 사진 데이터를 반환받아 다시 채팅 화면에 출력할 수 있음
    • 이 때 카톡 앱에서 카메라 앱을 이용해 사진을 찍었으므로 카톡 앱이 카메라 앱을 라이브러리처럼 이용한 것
    • 안드로이드 앱은 사용자가 실행하지 않아도 실행될 수 있고 실행 시점도 다양해서 다른 앱과 연동할 수 있음

 

컴포넌트 클래스와 일반 클래스

  • 앱은 여러 클래스로 구성되는데 크게 컴포넌트 클래스와 일반 클래스로 구분
  • 둘 다 개발자가 만드는 클래스
  • 런타임 때 생명주기를 누가 관리하는가에 따라 차이
일반 클래스 앱이 실행될 때 클래스의 객체 생성부터 소멸까지 생명주기 관리를 개발자 코드에서 함
컴포넌트가 아닌 개발자가 임의의 목적으로 만든 클래스 
컴포넌트 클래스 개발자가 만들기는 했지만 생명주기를 안드로이드 시스템에서 관리

★ 컴포넌트는 애플리케이션 안에서 독립된 실행 단위

  • 독립된 실행단위? 컴포넌트끼리 서로 종속되지 않아서 코드 결합이 발생하지 않음
  • 예시로 '채팅방 목록 화면(ListActivity)'에서 '채팅 화면(ChatActivity)'를 실행해야 한다면 안드로이드 시스템에 의뢰해서 시스템이 ChatActivity를 실행해야 함 / 두 클래스가 서로 종속되지 않고 독립해서 실행되게 해야 함
  • ListActivity에서 ChatActivity의 객체를 생성해 실행하는 것은 안드로이드에서 불가능한 방법
  • 직접 실행 X , 간접 실행 O
  • 독립된 실행 단위이기 때문에 앱 실행 시점이 다양함 (메인함수 개념이 없음)
  • (예 : 알림창에서 메세지 수신 알림을 터치하면 바로 채팅화면이 뜸)

안드로이드 컴포넌트의 4가지 종류

  • 액티비티, 서비스, 콘텐츠 프로바이더, 브로드캐스트 리시버 4가지로 구분
  • 앱이 실행될 때 각각 다른 기능을 함
  • 개발자가 컴포넌트 클래스를 만들 때는 지정된 클래스를 상속받아야 함
  • 개발자가 만들고자 하는 앱의 기능과 화면을 고려해 필요한 만큼 구성
액티비티 화면을 구성하는 컴포넌트
앱이 실행되면 액티비티에서 출력한 내용이 안드로이드 폰에 나옴
서비스 백그라운드 작업을 하는 컴포넌트
화면 출력 기능 없음(서비스가 실행되더라도 화면에 출력되지 않음)
화면과 상관없이 백그라운드에서 장시간 실행해야 할 업무를 담당
콘텐츠 프로바이더 앱의 데이터를 공유하는 컴포넌트
만약 하나의 앱이 자신의 데이터를 다른 앱에 공유하려면 콘텐츠 프로바이더를 만들어야 함
다른 앱에서 그 콘텐츠 프로바이더를 이용해 데이터에 접근
(예시: 카카오톡 앱에서 프로필 변경 시, 갤러리 앱의 사진을 이용하는데 이 때 콘텐츠 프로바이더를 이용해서 데이터를 주고받음)
브로드캐스트 리시버 시스템 이벤트가 발생할 때 실행되게 하는 컴포넌트
*이벤트 : 시스템에서 발생하는 특정 상황을 의미 (예: 부팅 완료, 배터리 방전)

앱 개발의 특징

  • 리소스를 많이 활용함
  • 리소스? 코드에서 정적인 값을 분리한 것
  • 앱에서 발생하는 데이터가 항상 똑같은 값이라면 굳이 코드에 담지 않고 분리해서 개발하는 것
  • 이렇게 하면 코드가 짧아져서 개발 생산성과 유지,보수성이 좋아짐
  • 문자열 이외에 색상,크기,레이아웃,이미지,메뉴 등 많은 요소를 리소스로 활용
문자열을 리소스로 등록하기
<string name="mytxt">
	가나다라마바사
    아자차카타파하
</string>

리소스 사용
textView.text = resources.getString(R.string.mytxt)

앱 구성 파일

  • 프로젝트를 만들면 app이라는 모듈이 자동으로 생성
  • 모듈 하나가 앱 하나
  • 프로젝트는 여러 모듈을 묶어서 관리하는 개념

그래들(gradle)

  • 안드로이드 앱의 빌드 도구
플러그인 선언
plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
}

compileSdk 33
* 앱을 컴파일하거나 빌드할 때 적용할 버전 설정
* 안드로이드 SDK33 버전을 적용해서 컴파일 하라는 의미

applicationId 'com.example.androidlab'
* 앱의 식별자를 설정
* 고유한 문자열로 지정
* 만약 플레이 스토어에 똑같은 식별자를 이미 사용하고 있는 앱이 있다면 
  이 앱은 스토어에 등록되지 않음

minSdk 31
targetSdk 33 
* targetSdk : 개발할 때 적용되는 SDK 버전
* minSdk : 이 앱을 설치할 수 있는 기기의 최소 SDK버전(31 버전까지 지원한다는 의미)

versionCode 1
versionName "1.0"
* 앱의 버전을 설정
* 초깃값은 1이지만 앱이 설치 후 이용되다가 업데이트될 때 버전을 올려 다시 배포

compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }
* 개발 언어의 버전 설정
* 자바 버전 선언을 생략하면 기본으로 1.6이 적용됨


dependencies {
    implementation 'androidx.core:core-ktx:1.8.0'
    implementation 'androidx.appcompat:appcompat:1.6.1'
    implementation 'com.google.android.material:material:1.5.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'com.google.android.material:material:1.2.1'
    testImplementation 'junit:junit:4.13.2'
    androidTestImplementation 'androidx.test.ext:junit:1.1.5'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
}
* 앱에서 이용하는 라이브러리의 버전 설정
* 개발자가 추가하는 오픈소스 라이브러리나 구글의 androidx 라이브러리 등은 모두 여기 선언

Manifest.xml

  • 앱의 메인 환경 파일
  • 이 파일에 설정한 대로 사용자의 폰에서 앱을 실행
  • 개발부터 실행까지 중요한 역할
  • 컴포넌트는 매니페스트 파일에 등록해야 시스템이 인지

res 폴더

  • 앱의 리소스를 등록하는 목적으로 사용
  • 리소스 파일명은 알파벳 대문자를 이용할 수 없음
  • 모듈이 만들어지면 res 폴더 아래 4가지의 폴더가 기본으로 생김
    • drawable : 이미지 리소스
    • layout : UI 구성에 필요한 xml리소스
    • mipmap : 앱 아이콘 이미지
    • values : 문자열 등의 값으로 이용되는 리소스
  • 리소스가 등록되면 R.java 파일에 int형 변수가 생김
  • 개발자가 임의의 폴더를 사용할 수 없고, 지정된 폴더명을 사용해야 함

매인 액티비티 파일

class MainActivity : AppcompatActivity() {
	override fun onCreate(savedInstanceState: Bundle?) {
    	super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }
}

* AppcompatActivity는 Activity의 하위 클래스
* MainActivity는 액티비티 컴포넌트 클래스
  즉, 화면 출력을 목적으로 하는 액티비티 클래스라는 의미
  
* MainActivity클래스 실행 -> onCreate()함수 자동 호출
* setContentView() 함수는 매개변수에 지정한 내용(R.layout.activity_main)을 액티비티 화면에 출력

'TodayILearned > Android&Kotlin' 카테고리의 다른 글

구글 지도앱 만들기  (2) 2023.09.14
사용자 위치 얻기  (0) 2023.09.14
Room  (0) 2023.09.13
SharedPreferences  (4) 2023.09.13
팀프로젝트 TIL  (0) 2023.09.07