본문 바로가기
BackEnd/안드로이드

[안드로이드] 1일차

by summer_light 2023. 7. 28.

* 개인 복습용으로 작성한 글입니다. 

1. 개발 환경 준비하기

- 안드로이드 앱은 개발자가 작성한 패키지명으로 식별된다

 

최소 SDK버전 : 이 버전 이상의 폰에만 설치가능 *SDK: Software Development Kit

로그캣: 앱이 실행 중일 때 발생하는 로그가 출력되는 공간

AVD: Android virtual Device. 안드로이드 가상 기기

시스템 이미지: 안드로이드 운영체제 버전

 

APK: 전통적인 배포 형식

AAB: 새로운 배포 형식(Play 스토어에서 최적화된 APK 파일을 만들어 줌)

앱 서명: 서명 키 개발자 직접 관리 vs 구글 Play에서 관리

 

2. 안드로이드 앱의 기본 구조

안드로이드는 리눅스를 기반으로 한 오픈소스 소프트웨어 스택이다. 

 

하드웨어 추상화 레이어(HAL): 상위 API에서 하드웨어 기능을 이용할 수 있게 표준 인터페이스를 제공

ART: 안드로이드 런타임, 빌드된 DEX파일을 실행하는 주체

안드로이드 버전: API레벨

 

2-2 안드로이드 앱 개발의 특징

일반 클래스: 생명주기 관리를 개발자 코드에서

컴포넌트 클래스: 생명주기 관리를 안드로이드에서

 

컴포넌트: 애플리케이션의 구성 요소, 컴포넌트 끼리 서로 종속되지 않는 독립된 실행 단위 

- 액티비티 : 화면을 구성

- 서비스 : 백그라운드 작업

- 콘텐츠 프로바이더: 앱의 데이터를 공유(ex. 카톡 앱에서 갤러리 앱의 사진을 이용할 때)

- 브로드캐스트 리시버: 사용자 이벤트가 아닌 부팅 완료, 배터리 방전 같은 상황에서 실행되는 컴포넌트

 

앱 실행 시점이 다양하다: 단일 시작점을 의미하는 메인 함수 개념이 없다.

리소스: 코드에서 정적인 값을 분리(이미지 외 대부분 리소스는 XML파일로 작성)

 

메인 환경 파일

AndroidManifest.xml : 이 파일에 설정한 대로 사용자 폰에서 앱을 실행, 즉 여기에 컴포넌트를 등록해야 시스템이 인지

xmlns: xml의 네임스페이스 선언 xml+ns

package: 컴포넌트 클래스의 기본 패키지명. 이후 경로는 여기 지정한 이후부터 작성

xml  속성값이 @로 시작하면 리소스를 의미 

 

3. 코틀린 시작하기

3-1 코틀린 언어 소개

- 널 안정성

- 상호 운용성

-구조화 동시성

 

package 구문: 클래스 파일이 생성되는 위치(kt 파일의 위치와 다를 수 있음)

 

3-2 변수와 함수

val: value 불변

var: variable 가변

 

초기화 미루기

lateinit : var 중에서 기초타입 객체가 아닌 타입만 가능, 이후에 초깃값 할당할 것임을 명시

lateinit var data: String

lazy: by lazy{} 형식, 최초로 이용되는 순간 중괄호 부분이 자동 실행 후 할당

val data: Int by lazy {
    10
}

$: 문자열 템플릿

Any: 최상위 클래스

Unit: 반환문이 없는 함수

 

Array

선언 1) val data1: Array<Int> = Array(3, {0})

선언 2) val data2: IntArray(3, {0})

선언 3) val data3 = arrayOf<Int>(10,20,30)

 

컬렉션: List, Set, Map

 

3-3 조건문과 반복문

if~else 문: 표현식(결괏값을 반환하는 계산식) 가능

when 문: when (조건) { case1 -> ... } 

is: 타입을 확인하는 연산자

in: 범위 지정 연산자

data.indices: .indices는 컬렉션 타입의 인덱스 값을 의미

 

4.코틀린 객체지향 프로그래밍

4-1 클래스와 생성자

class User { }

주 생성자 : inite {} 영역에 주생성자 하는 일 작성

보조 생성자 : 반드시 주 생성자가 실행 되어야 함

 

4-2 클래스를 재사용하는 상속

open class Super {
}

class Sub: Super() { //Sub은 Super를 Super() 생성자를 이용해 상속받는다는 의미
}

재정의를 위해서는 상위 클래스에서 open 키워드가 있어야한다

 

4-3 코틀린의 클래스 종류

데이터 클래스

- VO클래스 (value-Object 클래스)를 편하게 이용하기 위함 

data class DataClass(val name:String, val age:Int)

equals() 

데이터 클래스 주 생성자에 선언한 멤버변수의 데이터 같으면 True
일반 클래스 같은 객체여야만 True

 

toString() 

데이터 클래스 data class toString: DataClass(name=Hong, age=10)
일반 클래스 com.example.test.asdf$safd$asdf$@adsf13r

 

오브젝트 클래스

- 익명 클래스를 만들 목적으로 사용

- 선언과 동시에 객체를 생성하기 때문에 object 클래스

val obj = object{
	var data = 10
    fun some() {
    	println("aa")
    }
}
fun main() {
	obj.data = 20 //오류
	obj.some() //오류
}

위의 코드는 타입을 명시하지 않아 Any타입 객체로 취급되는데, Any타입에는 data, some 이라는 멤버가 없어 오류가 발생한다 

open class Super {
	open var data = 10
    open fun some() {
    	println("asdf")
    }
}
val obj = object:Super(){
	override var data = 20
    override fun some() {
    	println("aa")
    }
}
fun main() {
	obj.data = 20 //성공
	obj.some() //성공
}

 

컴패니언 클래스

- 멤버 변수나 함수를 클래스 이름으로 접근하고자 할 때 사용

- 객체를 생성하지 않고도 클래스 이름으로 특정 멤버를 이용할 수 있음

- 클래스 내부에 companion 키워드와 함께 클래스를 생성

class MyClass {
	companion object {
    	var data = 10
        fun some() {
        	println("zz")
        }
    }
}

fun main() {
	Myclass.data = 20 //성공
    MyClass.some() //성공
}

 

5. 코틀린의 유용한 기법

5-1. 람다 함수와 고차 함수

람다함수

- 마지막 줄의 실행 결과가 반환값

{ 매개변수 -> 함수 본문 }
val sum = {a:Int, b:Int -> a+b} //변수에 대입하여 사용
{a:Int, b:Int -> a+b}(10,20) //바로 사용
{println("AAA")} //매개변수 없는 람다함수

fun main() {
	val some:(Int) -> Unit = {println(it)}
    some(10)
} //매개변수가 1개인 경우 it 키워드 사용 가능, 단 함수 타입을 명시해야함

타입 별칭 typealias

-함수 타입, 데이터 타입 선언

typealias MyInt = Int

fun main() {
    val data1: Int = 10
    val data2: MyInt = 10
}
typealias MyFunType = (Int, Int) -> Boolean

 

 

5-2. 널 안전성

- 널: 객체가 선언되었지만 초기화되지 않은 상태

- 참조 변수: 객체는 데이터가 저장된 주소를 참조하므로 참조 변수라고 함

- 널 안전성: 널 예외가 발생하지  않도록 코드를 작성하는 것

 

널 허용 - ? 연산자

널 허용: String?

널 불허: String

 

널 안전성 호출 - ?.연산자

널 허용으로 선언한 변수의 멤버에 접근할 때는 반드시 ?. 연산자 사용

var data: String? = "hihi"
var length = data?.length // 성공

 

엘비스 연산자 - ?: 연산자

- 변수가 널이면 널을 반환

println("data = $data : ${data?.length ?: -1}")

 

예외 발생 - !! 연산자 

- 객체가 널일 때 예외를 일으키는 연산자 

fun some(data:String?): Int {
	return data!!.length
}
fun main() {
	println(some("hihi"))
    println(some(null))
}

실행결과
5
Exception in thread "....

'BackEnd > 안드로이드' 카테고리의 다른 글

[안드로이드] 3일차  (0) 2023.08.06
[안드로이드] 2일차  (0) 2023.08.02

댓글