Do it 코틀린 정리 - 2,3강 (안드로이드와 코틀린 기본 문법)

박경현·2024년 1월 4일
0
post-thumbnail

코틀린 책 중에 기본서로 가장 적합한 Do it을 보면서 매일 한 강씩 정리를 시작했다

단순히 책을 정리하는것을 넘어서서 왜 이렇게 쓰이고 어떻게 활용할 수 있는지 더 깊게 찾아보고 정리하려고 합니다


안드로이드 운영체제

더 자세하게는 안드로이드 OS는 리눅스 커널과 안드로이드 소프트웨어 스택으로 구성되어 있습니다


안드로이드 OS에서 리눅스 커널

  • 안드로이드 OS에서 하드웨어를 제어하고 안드로이드 어플리케이션과 다른 시스템 서비스가 상호 작용할 수 있도록 인터페이스를 제공합니다

  • 리눅스커널은 멀티태스킹, 메모리 관리, 네트워킹 등의 기능을 제공합니다

  • 모바일기기의 하드웨어 리소스를 관리하고 이를 통해 사용자에게 다양한 기능을 제공합니다(스피커, 마이크, 디스플레이 등 제어)

안드로이드 소프트웨어 스택 4계층

응용 프로그램 계층(Application Layer)
  • 안드로이드 운영체제의 가장 상위 계층으로, 사용자와 직접 상호작용하는 어플리케이션들을 포함합니다

  • 안드로이드 사용자 경험의 핵심을 이루며, 거의 대부분의 어플리케이션이 여기서 실행 됩니다

  • UI, 어플리케이션 로직, 데이터 관리 및 다양한 기능을 수행할 수 있습니다

어플리케이션 프레임워크 계층(Application Framework Layer)
  • 어플리케이션 개발을 위한 API를 제공하는 계층

  • 안드로이드 응용프로그램 계층과 런타임 계층 사이에 위치합니다

  • 안드로이드의 컴포넌트들(액티비티, 서비스, 브로드캐스트 리시버, 컨텐츠 프로바이더), 데이터베이스 연동 등을 다루는 API를 제공함

안드로이드 런타임 계층(Android Runtime Layer)
  • 안드로이드 어플리케이션을 실행하는데 필요한 기능(컴파일)을 제공하는 계층

  • JVM기반의 런타임 환경인 Dalvik을 사용하다 최근에는 ART(안드로이드 런타임)를 사용

  • ART는 JIT이 아닌 AOT 컴파일러를 사용하기 때문에 Dalvik보다 성능은 좋으나 메모리를 많이 사용합니다

  • 이 계층은 네이티브 코드(C/C++)를 실행할 수 있는 인터페이스를 제공함

하드웨어 추상화 계층
  • 안드로이드 운영체제는 다양한 하드웨어와 함께 동작하는데, 각각의 하드웨어를 추상화해서 어플리케이션 프레임워크 계층에 제공함

  • 개발자들이 하드웨어 관련 복잡한 업무를 하지 않아도 됩니다 - 추상화된 하드웨어 인터페이스를 제공하기 때문에!

그렇다면 AOT(Ahead of Time)이란?

JIT컴파일러가 바이트코드를 런타임에 기계어로 바꾼다면, AOT는 실행 전에 바이트코드를 기계어로 바꾸는 컴파일러임

AOT 컴파일러를 사용하면 실행전에 전체 파일을 빌드해야하기 때문에 빌드 속도가 느려진다

컴파일러의 결과로 얻어진 기계어는 특정 플랫폼에 맞게 조정되며 매우 빠른 실행이 가능해집니다

코틀린 기본 문법

코틀린 컴파일러가(kotlinc)가 .kt파일을 컴파일하면 자바 바이트코드가 만들어짐
자바 클래스가 만들어지고 이걸 JVM이 실행합니다


여기서 보면 package구문이 맨 위에 있는데 컴파일했을때 만들어지는 클래스파일의 위치를 나타냅니다!

package org.techtown.myapplication

val data = 20
lateinit var str1: String

fun main() {
	val data4: Int by lazy {
    	println("data4 hello...")
        10
    }
    val data2: Any = 10
    
}
fun some2(data1: Int, data2: String = "hello"): String {
	return data1 + data2 // 10hello
}
fun arrayAndCollection(): Unit {
	val data1: Array<Int> = Array(3){0}
    // data1 = Array(4){0}
    data1[0] = 1
    
    var list = listOf<Int>(0,10,20)
    var mutableList = mutableListOf<Int>(100,200,300)
    mutableList.add(400)
    
    var map = mapOf<String, String>(Pair("one", "two"), "a" to "b")
    println(map["a"])
}
fun forEach(): Unit {
	var data = 0
    for (i in 1..10) {
    	data += i
    }
    var data5 = intArrayOf(10,20,30)
    for (i in data5.indices) {
    	print(data5[i])
    }
    
}

val -> 값을 바꿀 수 없습니다 -> const val는 함수나 클래스 밖에서 사용하는 방식입니다
var -> 변수(타입 추론 가능)

lateinit -> 변수나 상수를 처음 작성하면 초기값을 지정해줘야하는데 이때 초기값을 변수가 실행할 때 넣어주게 늦춰주는 방법입니다

단 var에서 밖에 안되고 var의 타입을 정확하게 적어줘야합니다

Any는 모든 클래스의 최상위 클래스입니다 이걸 사용하면 모든 타입이 가능합니다(내가 작성한 클래스도 넣기 가능)


함수별로 봐보자

some2() 함수를 보게 되면 data2 인자의 default값을 "hello"로 설정했습니다
그리고 리턴값을 String으로 설정했습니다. 리턴 값이 없을때는 비워두거나 Unit으로 작성하면 됩니다

arrayAndCollection() 함수에서는 val data1: Array <Int = Array(3){0}으로 초기화 했습니다

이때 val인데 아래 값이 각각 들어가는데 이유는 data1자체의 배열을 재할당하는게 아닌 안에 개별로 값을 넣는것이기 때문에 가능했습니다

Collection들의 경우 mutable 과 immutable로 나눠집니다
그래서 위처럼 그냥 list인경우는 immutable이고 mutableListOf의 경우 mutable합니다

Set, Map모두 마찬가지입니다

profile
SW로 문제를 해결하려는 열정만 있는 대학생

0개의 댓글