대딩 기록(~22.01) 29

안드로이드앱 배포 파일 APK vs AAB(Andriod app bundle)

안드로이드의 전통적인 앱 배포 파일은 APK (Android application package)이다. 이는 컴파일된 코드와 리소스를 묶어서 키로 서명한 것이다. apk는 기본적인 배포파일이기 때문에 수많은 기기들에 맞춰 최적화를 제공하지 못한다. 이를 개선하기위해 2018년 구글 IO에서 발표한 새로운 안드로이드 앱 배포 파일이 AAB이다. AAB파일을 PLAY 스토어에 올리면 사용자의 기기에 맞춰 최적화된 APK를 대신 만들어 준다. 개발자가 아니니 스토어에서 최적화를 담당하게 되는 것이다. 이에 따른 장점으로 각 기기 최적화를 위해 포함된 모든 파일 중에 각 사용자에 필요한 부분만 받기 때문에 앱의 크기가 줄어들게 되는 효과가 있다. 도입 이후 apk와 aab가 둘 다 사용되었지만, 2021년 8월..

안드로이드 액티비티 생명주기

*참고 저서 코틀린 기본 구문을 익힌 후엔, 책에 따라 여러 실습을 하고 있다. 중요한 개념들을 많이 거쳐온 것 같아, 몇 가지를 정리해보려 한다. 8장에 있는 액티비티 생명주기이다. 어플리케이션의 하나의 화면, 즉 액티비티는 특정한 생명주기를 지니고 있다. 특정 시점에 특정 메서드가 호출되도록 되어 있으며, 개발자는 해당 시점에 어떻게 동작할 것인지에 따라 각 메서드를 오버라이딩하는 것이다. 이 메서드들을 콜백 메서드라고 할 수도 있다. 가장 먼저, 액티비티의 생성과 함께 실행되는 메서드가 onCreate()이다. 안드로이드 스튜디오에서 액티비티를 생성하면 기본적으로 작성되어있는 메서드이기도 하다. onCreate 내에 코드를 추가하면, 생성과 동시에 코드들이 실행된다. package com.examp..

코틀린 기본 구문 (컬렉션, 람다)

*참고저서 1. 컬렉션(Collection) 자바에서와 마찬가지로 컬렉션은 유용한 자료구조들을 제공한다. 1)리스트 (List) 배열처럼 자료형을 순서대로 가지고 있는 자료구조로, 추가, 삭제, 교체가 더욱 간편하다. val foods:List = listof("라면","갈비","밥") // val foods = listof("라면","갈비","밥")도 가능 val drinks = mutableListOf("콜라","물","마운틴듀") drinks.add("우유") // 추가 drinks.removeAt(0) // 삭제 drinks[1] = "녹차" // 교체 listOf를 사용하여 작성하고, 자료형을 생략할 수 있다. 추가,삭제,교체가 가능한 리스트를 만들 경우 mutableListOf를 사용한다. 2..

코틀린 기본 구문 (인터페이스, null 가능성)

*참고 저서 1. 인터페이스 (interface) 자바에서의 인터페이스와 같이 기능해, 다중 구현이 가능하다. 사용법 역시 거의 비슷하다. interface Runnable{ fun run() } class Human : Runnable { overrride fun run() { println("달린다") } } 자바의 인터페이스와는 다르게, abstract 키워드를 생략할 수 있다. 2. null 가능성 코딩을 하다 보면 nullExceptionError를 빈번히 마주하게 된다. 객체에 null이 할당되어 있을 때, 생기는 에러이다. 코틀린의 경우 null safety에 상당히 엄격하다. null을 기본적으로 불허하며, 별도의 연산자를 이용해 null을 허용해야 한다. 이 경우 변수를 호출할 때도 별도..

코틀린 기본 구문 (제어문, 클래스)

*참고저서 1. 제어문 1) if 자바의 if 문과 동일하다. val max = if (a>b) a else b 와 같이 식으로도 사용이 가능하다. 2) when 자바의 switch 문에 대응하는 제어문이다. 조건을 상수값 하나로 주는 것은 당연히 가능하고 in 키워드를 이용해 범위로 주는 것도, else와 같이 지정하는 것도 가능하다. 자바에서는 각 case마다 break문이 필요했으나, 코틀린은 그렇지 않다. '숫자..숫자'의 문법은 두 숫자간의 범위를 말한다. 뒤 쪽 숫자도 포함하는 범위이다. val x = 1 when (x) { 1 -> println("x==1") 2,3 -> println("x==2 or x==3") in 4..7 -> println("4~7") !in 8..10 -> prin..

코틀린 기본 구문 (변수/상수 , 함수, 자료형)

* 참고 저서 1. 변수와 상수 (var,val) 코틀린에서는 변수를 var, 상수는 val을 사용하여 선언한다. 이때 var은 값을 변경할 수 있으며, val은 값을 변경할 수 없다. 선언 이후 값을 변경하려할 시 에러가 발생하게 된다. Java의 final 키워드와 같다고 할 수 있다. 또 변수 선언 시 자료형을 적게 되어 있으나, 명시하지 않아도 파이썬처럼 형추론을 지원한다. var a: Int = 10 //변수 val b: Int = 20 //상수 // var a = 10 과 같이도 선언 가능 2. 함수 (function) 코틀린에서 함수를 선언하는 방식은 다음과 같다. fun 함수명(인수1:자료형, 인수2:자료형): 반환자료형 { // 함수 내용 } 반환값이 존재하지 않을 시에는 반환자료형 자리..

알고리즘 - 힙정렬, 기수 정렬, 계수 정렬(Heap sort, Radix sort, Counting sort)

1) 힙 정렬 원리: 1. 배열 전체 최대 힙으로 바꾼다 2. 배열의 첫 원소(=최댓값)와 마지막 원소를 교환한다 3. 배열의 마지막 원소를 가르키는 포인터를 1 줄인다 4. 배열을 최대 힙으로 다시 바꿔준다 코드(파이썬): def heapsort(a,n): for i in range(n//2-1,0,-1): rebuildheap(a,i,n) heapsize = n for last in range(n-1,1,-1): a[0],a[last] = a[last],a[0] heapsize -= 1 rebuildheap(a,0,heapsize) def rebuildheap(a,r,n): current = r value = a[r] while 2*current + 1 < n: leftchild = 2*currren..

[Git] 풀 리퀘스트와 포크 (pull request, fork)

1) 풀 리퀘스트 앞서 머지는 브랜치 간의 병합 과정에서 충돌의 위험을 충분히 살피지 못한다고 말했다. master 브랜치의 안정성을 높이기 위해 풀 리퀘스트를 사용한다. 풀 리퀘스트는 말 그대로 레포지토리의 누군가가 master 브랜치에 대한 병합을 요청하면, 레포지토리의 소유자가 충돌 사항에 대해 살펴본 후 승인을 해주는 방식이다. 풀 리퀘스트를 하는 방법은 두 가지가 있다. 1. 동일 레포지토리의 다른 브랜치에서 풀 리퀘스트를 보내는 것 2. 포크(fork)를 통해 다른 레포지토리에서 풀 리퀘스트를 보내는 것 2) 브랜치에서 풀 리퀘스트 보내기 지난 시간에는 로컬 브랜치만을 생성했다. 오늘은 Github 상에서 풀 리퀘스트를 해야만 하기에 레포지토리에도 동일한 브랜치를 만들어 주어야만 한다. add..

[Git] 브랜치와 머지(merge)

1) 브랜치 그 동안은 master라는 하나의 브랜치 위에서만 커밋, 푸쉬 등을 진행했다. 하지만 분업을 하다보면 각 작업자들마다 각자의 흐름이 형성되며, 이를 하나의 공간에서 처리하기란 어려워진다. 이 때문에 git에서는 브랜치(branch)라는 개념을 두어 따로 버전 관리를 할 수 있게 하고, 이 중 확실한 부분만 master, 즉 메인 브랜치에 합치는 기능을 제공하고 있다. git branch 작업 폴더에서 git bash를 연 다음, 위 명령어를 사용하면 현재 브랜치 목록을 확인할 수 있다. 브랜치 생성을 하지 않은 상태라면 master라는 브랜치명만 뜰 것이다 git branch (브랜치 이름) 위 명령어를 통해 새로운 브랜치를 생성할 수 있다. 이후 'git branch' 를 한 번 더 실행하..

알고리즘 - 병합 정렬, 퀵 정렬(Merge sort, Quick sort)

병합 정렬과 퀵 정렬은 간단한 정렬 알고리즘인 선택 정렬, 삽. 입 정렬, 버블 정렬에 비해 수행시간이 빠르다 또한 각자 수행시간 면에서 유리한 상황이 상이해 이에 대한 이해가 필요하다 1) 병합 정렬 원리: 1. 리스트를 반으로 나눈다 2. 두 부분을 재귀적으로 정렬한다 3. 정렬된 두 부분을 하나로 병합한다 코드(파이썬): def mergesort(a,first,last): if first < last: mid = (first + last) / 2 mergesort(a,first,mid) mergesort(a,mid+1,last) merge(a,first,mid,last) def merge(a,first,mid,last): f = first l = last k = 0 b = [] while(f < m..