본문 바로가기

분류 전체보기310

[Android] API 키 관리하기 - Groovy, KTS ApiKey를 왜 숨겨야 하는걸까? 깃허브의 모든 커밋과 리뷰는 기록이 남습니다. 만약 ApiKey와 같은 중요한 정보들이 제대로 처리하지 않고 기록에 남는다면 소중한 정보들이 노출되므로 조심해야 합니다. 이번 포스팅에서는 어떻게 하면 이런 정보들을 관리할 수 있는지에 대해 정리해보고자 합니다. 관리하는 방법 1. gitignore에 기록이 남지 않았으면 하는 파일들을 명시 우선, 가장 먼저 깃으로의 노출을 막아야할 것은 local.properties입니다. 우리는 여기에 API 키를 포함한 중요 정보들을 저장하고 관리할 것입니다. 그 이후에 /build 경로를 막습니다. 해당 경로에 BuildConfig가 존재하는데, 저희가 local.properties에서 키값을 불러오면 BuildConfig에 명시.. 2023. 2. 27.
[알고리즘] Dynamic Programming (동적 계획법) Dynamic Programming (동적 계획법)이란? 기본적인 아이디어로 하나의 큰 문제를 여러 개의 작은 문제로 나누어서 그 결과를 저장하여 다시 큰 문제를 해결할 때 사용하는 것입니다. DP는 왜 사용하는 걸까? 피보나치 수열을 예시로 들 수 있습니다. 피보나치 수열은 아래와 같습니다. 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, ... => fibo(n) = fibo(n-1) + fibo(n-2) 이런 알고리즘에서 f(n)을 호출한다고 하면 아래와 같이 중복되는 숫자들이 늘어나게 됩니다. 즉, 시간복잡도가 O(2^n)이 걸리게 됩니다. 하지만 이미 계산했던 값들을 저장한다면 O(n)까지 줄일 수 있습니다. 이것이 DP를 사용하는 이유입니다. DP의 접근방식 기본적.. 2023. 2. 12.
[Image] JPEG, PNG, BMP, GIF, SVG, Webp에 대해 알아보자 각 이미지 타입에 대해 알기 전 먼저 알아야할 몇 가지 요소에 대해 정리하고 넘어가보겠습니다. 1. Lossless(무손실) & Lossy(손실) Lossless: 이미지를 압축해도 이미지의 Quality는 손상되지 않는 것 Lossy: 이미지를 압축하여 크기를 줄이지만 이미지의 Quality는 손상되는 것, 만약 이미지를 손실 압축 포맷으로 변환하여 계속해서 저장하게 되면 이미지의 퀄리티는 점점 나빠짐 2. Indexed color & Direct Color Indexed Color: 제작자에 의해 Color Map이라는 곳에 제한된 수의 색상 (256가지의 색상)을 가진 Palette로만 저장할 수 있는 속성 Direct Color: 제작자가 직접 선택하지 않은 수천가지의 컬러를 저장할 수 있는 속성.. 2023. 2. 11.
[디자인 패턴] 싱글톤(Singleton) 패턴 싱글톤(Singleton)이란? 소프트웨어 디자인 패턴에서 싱글턴 패턴(Singleton pattern)을 따르는 클래스는, 생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나이고 최초 생성 이후에 호출된 생성자는 최초의 생성자가 생성한 객체를 리턴한다. 이와 같은 디자인 유형을 싱글턴 패턴이라고 한다. 주로 공통된 객체를 여러개 생성해서 사용하는 DBCP(DataBase Connection Pool)와 같은 상황에서 많이 사용된다. by 위키피디아 핵심은 객체의 인스턴스를 한 개만 생성되도록 만드는 패턴입니다 싱글톤 패턴을 사용하면 총 3가지 측점에서 이점을 얻을 수 있습니다. 1. 메모리 측면 싱글톤 패턴을 사용하게 된다면 한 개의 인스턴스 만을 고정 메모리 영역에 생성하고 추후 해당 객체를.. 2023. 2. 8.
[Kotlin] != null과 ?.let 퍼포먼스 차이가 있을까? 공부배경 코틀린을 사용하다보면 null체크를 스코프함수인 let을 통해 간편하게 체크하곤 합니다. 하지만 문득 if로 비교하는 것과 ?.let으로 비교하는 것에 차이는 없는 것일까 확인해보고 싶어서 각 코드를 바이트코드로 변환하여 비교해보고자 합니다. 바이트 코드 명령어 우선 바이트코드 변환에 앞서 명령어들이 어떤 의미를 가지는지 간단히 정리하겠습니다. aload : local variable 을 stack 에 push 한다 ldc : constant pool 에서부터 #index 에 해당하는 데이터를 가져온다 astore : local variable 에 값을 저장한다. invokespecial : instance Method 를 호출하고 결과를 stack 에 push한다. new : 새로운 객체를 생.. 2023. 2. 6.
[디자인 패턴] 프록시 (Proxy) 패턴 공부 배경 android context를 공부하며 context, contextImpl, contextWrapper가 프록시패턴으로 이뤄져있다는 것을 확인할 수 있었습니다. 왜 프록시를 사용하여 아래 그림과 같이 구현된 것인지 공부해보려고 합니다. 프록시 패턴이란? 프록시는 대리인이라는 뜻으로, 무엇인가를 대신 처리하는 의미입니다. 일종의 비서라고 생각하면 됩니다. 연예인에게 먼저 접촉하기 전에 매니저과 일정조율을 하듯 먼저 구현체가 아닌 프록시에게 먼저 물어보는 개념입니다. 이렇게 어떤 객체를 사용하고자 할 때, 객체를 직접 참조하는 것이 아니라, 해당 객체를 대행하는 객체를 통해 대상 객체에 접근하는 방식을 사용하면 해당 객체가 메모리에 존재하지 않아도 기본적인 정보를 참조하거나 설정할 수 있고 또한.. 2023. 2. 4.
[Kotlin] filter, map 호출 순서에 따른 성능 차이 이번에 filter와 map의 호출 순서에 따른 성능차이를 확인해보려고 합니다. map, filter VS filter, map 먼저 사용될 data class를 정의합니다. data class Food( val name: String, val price: Int ) 1. map() 함수를 수행한 뒤, filter() 함수를 수행한다. fun main() { val list = listOf( Food("chicken", 20000), Food("pizza", 25000), Food("sushi", 21000), Food("coffee", 5500), Food("beer", 3800) ) val result = list.map(::mapToName) .filter(::filterByPrice) print(.. 2023. 2. 3.
[Kotlin] Collection 관련 함수들 (filter, map, flatmap) filter 주어진 람다의 조건을 만족하는 원소만 필터링하는 기능입니다. List와 Set을 필터링하는 경우에는 List로, Map을 필터링하는 경우에는 Map으로 반환합니다. filter 함수는 요소의 값만 확인할 수 있습니다. val list = listOf("A", "B", "C") val newList = list.filter { it != "A" } println(newList) // input: [A, B, C] // Result: [B, C] map 각 원소를 원하는 형태로 변환해서 새 컬렉션을 만듭니다. 새로 만들어지는 컬렉션은 원본 컬렉션과 원소의 개수는 같지만 각 원소는 주어진 람다(함수)에 따라 변환됩니다. val list = listOf("A", "B", "C") val newLis.. 2023. 2. 3.
[Android] BaseFragment 만들기 문제 배경 Android에서 Binding을 처리할 때는 항상 연결과 해제를 구현해줘야 합니다. class TestFragment : Fragment() { private lateinit var _binding: FragmentTestBinding val binding: FragmentTestBinding get() = _binding!! override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ) { _binding = DataBindingUtil.inflate(inflater, R.layout.fragment_test, container, false) return bindi.. 2023. 2. 2.