* 개인 복습용으로 작성한 글입니다.
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 |
댓글