전체 글 49

속성값으로 enum 객체 얻기 (value to enum)

아래와 같은 Enum class가 있을 때, 객체 이름이나 속성값으로 객체를 얻는 것이 가능하다. enum class Type(val num: Int) { A(1), B(2), C(3), } // "A" -> Type.A // 1 -> Type.A "A" → Type.A : valueOf 메서드 사용 Enum class에는 객체의 이름으로 enum 객체를 찾는 메서드가 이미 존재한다. 이걸 사용하자. EnumClass.valueOf(value: String): EnumClass // Type.valueOf("A") -> Type.A 반환 없는 객체를 검색하려고 시도하면 excpetion을 던진다는 점에 유의해야한다. 1 → Type.A : 직접 메서드 정의 그러나 다른 속성값에서 enum 객체를 찾고싶다..

탐색을 위한 Position Class

data class Position( var x: Int, var y: Int, ) { operator fun plus(other: Position): Position { return Position(this.x + other.x, this.y + other.y) } // 깊은 복사에는 .copy 호출(data class에서 구현해줌) } enum class Direction(position: Position) { TOP(Position(-1, 0)), BOTTOM(Position(1, 0)), LEFT(Position(0, -1)), RIGHT(Position(0, 1)) } * copy 사용시 주의할 점 : x, y에 Primitive type이 아닌 객체를 사용한다면, 직접 깊은 복사를 구현해야한다..

Kotlin의 ArrayDequeue : Stack & Queue를 손쉽게 사용하기

public class ArrayDeque : AbstractMutableList Deque는 Double Ended Queue의 줄임말이다. 덱이라고 부르면 된다. 어느 방향으로든 삽입과 삭제가 구현되어있어서 Stack으로도, Queue로도 사용 가능하다. MutableList로 구현되어있어서 index를 통한 get/set operation도 가능하다. Stack으로 사용하는 법 /* Stack */ val stack = ArrayDeque() stack.add(e) // push, list 끝에 넣는다. stack.removeLast() // pop stack.last() // peek(조회) : Java에 Vector로 구현된 Stack이 있어서 Stack은 꼭 Deque을 사용하지 않아도 된다...

삽입정렬(Insertion Sort)

문은영 교수님의 데이터구조 수업 자료입니다. 문제시 삭제하겠습니다. 방식 i가 0 ~ n-1 일 때, 왼쪽 카드가 지금 카드보다 크다면 교환한다. 그렇지 않다면 다음 iteration으로 넘어간다. 이 작업을 index i부터 1까지 매 iteration에서 반복한다. 일부 항목만 정렬이 흐트러졌을 때 사용하면 유리한데, 1. 배열이 이미 정렬되었을 경우 linear time으로 동작하고 2. 구현이 쉽기 때문이다. 시간복잡도 Avg - O(n^2) iteration i에서 벌어지는 swap과 비교 횟수의 평균은 각각 i/2회이다. 시간복잡도를 big-O natation으로 표현하면 O(T(n)) = O(n(n-1)/4) = O(n^2) 이다. Best - O(n) 배열이 이미 정렬되었을 때 각 iter..

선택정렬(Selection Sort)

문은영 교수님의 데이터구조 수업 자료입니다. 문제시 삭제하겠습니다. 방식 i번째(0부터 시작) iteration에서 0 ~ i-1 까지는 정렬되어있음이 보장된다. 이때 i ~ n 까지의 entry 중에 가장 작은 값을 a[i]와 교환한다. 구현할 때 entry 범위가 헷갈릴 수 있다. arr[0]에 가장 작은 값이 들어가는 것이 보장되어야함을 기억하면 덜 헷갈린다. 시간 복잡도 Avg - O(n^2) ith iteration에서 n-i 개의 entry 중 가장 작은 값을 찾는데에는 평균 (n-i)/2 의 비용이 든다. i가 1부터 n까지 이므로 평균 시간복잡도는 T(n) = (탐색) + (교환) = ( 0+…+n-1 ) / 2 + ( 1 * n )이고 O(T(n)) = O(n^2) 이다. Best - O..

CoordinatorLayout에서 겹쳐진 뷰의 터치 이벤트를 처리하는 방식

BottomSheet를 구현하는 도중, BottomSheet 뒤에 가려진 버튼들이 클릭이 가능해지는 버그가 있었다. 스택 오버플로우의 글을 읽고 바텀시트에 clickable="true"를 추가해서 간단히 해결했지만, CoordinatorLayout에서 터치를 가로채는 방식에 대해서 정리해야겠다는 생각이 들었다. coordinatorLayout에서 상위 뷰가 하위 뷰의 터치를 가로채는 동작은 아래에 보이는 CoordinatorLayout.Behavior 를 상속받아서 구현한다. public class CoordinatorLayout extends ViewGroup implements NestedScrollingParent2, NestedScrollingParent3 { ... public static ab..

Jetpack Navigation Safeargs 사용법

navigation에서 argument는 프래그먼트에게 속성을 붙여주는 것과 비슷하다. fragment별로 앱바 종류를 argument에 저장해서 다른 앱바를 적용하게 할 수도 있고(Android10B MainActivity 참고) 다른 프래그먼트로부터 받을 데이터가 있으면 그걸 argument로 저장해서 받을 자리를 만들 수도 있다.(argument가 마치 우유 바구니같은 역할을 하는 것) 그러나 safe args를 통해 전달하는 데이터는 가능한 작은 값이어야한다. ex) 어떤 object를 줘야할 때, 오브젝트 대신 그 오브젝트를 찾을 수 있는 key 값이나 인덱스를 준다. 만약 대량의 데이터를 공유하는 화면인 경우 같은 뷰모델을 사용하는 것을 고려하자. 우리가 하는 디테일 정보 표시같은 경우 작은 ..