개발로그

[프로그래머스/Kotlin] Lv2 가장 큰 수 : 정렬
문제 설명 0 또는 양의 정수가 주어졌을 때, 정수를 이어 붙여 만들 수 있는 가장 큰 수를 알아내 주세요. 예를 들어, 주어진 정수가 [6, 10, 2]라면 [6102, 6210, 1062, 1026, 2610, 2106]를 만들 수 있고, 이중 가장 큰 수는 6210입니다. 0 또는 양의 정수가 담긴 배열 numbers가 매개변수로 주어질 때, 순서를 재배치하여 만들 수 있는 가장 큰 수를 문자열로 바꾸어 return 하도록 solution 함수를 작성해주세요. 문제 풀이 아이디어 사전식 정렬을 이용해서 문제를 풀 수 있다. [6, 10, 2] 가 예제로 존재 할 때 6과 10으로 610과 106 조합을 만들 수 있다. 이 때 더 큰 값은 610 이므로 6,10,2 순서를 유지한다. 10과 2 로 1..

[프로그래머스/Kotlin] Lv2 프로세스 : Queue
문제 설명 운영체제의 역할 중 하나는 컴퓨터 시스템의 자원을 효율적으로 관리하는 것입니다. 이 문제에서는 운영체제가 다음 규칙에 따라 프로세스를 관리할 경우 특정 프로세스가 몇 번째로 실행되는지 알아내면 됩니다. 실행 대기 큐(Queue)에서 대기중인 프로세스 하나를 꺼냅니다. 큐에 대기중인 프로세스 중 우선순위가 더 높은 프로세스가 있다면 방금 꺼낸 프로세스를 다시 큐에 넣습니다. 만약 그런 프로세스가 없다면 방금 꺼낸 프로세스를 실행합니다. 3.1 한 번 실행한 프로세스는 다시 큐에 넣지 않고 그대로 종료됩니다. 현재 실행 대기 큐(Queue)에 있는 프로세스의 중요도가 순서대로 담긴 배열 priorities와, 몇 번째로 실행되는지 알고싶은 프로세스의 위치를 알려주는 location이 매개변수로 주..

[Kotlin] isNullOrBlank vs isNullOrEmpty 헷갈리지말자
오늘 포스팅에서는 string의 null과 공백을 비교하는 비슷하지만 다른 두 메서드에 대해서 알아보고자 한다. 아래 예시를 통해서 두 메서드의 차이를 알아보자. var a = "string" var b = "hyeon" var c = null var d = "" var e = " " isNullOrBlank fun CharSequence?.isNullOrBlank(): Boolean isNullOrBlank는 string 값이 null이거나 공백으로만 채워진 경우 true를 반환하는 함수 이다. 위 예시 string에 isNullOrBlank 메서드를 사용하면 출력값은 다음과 같다. var a = "string" var b = "hyeon" var c = null var d = "" var e = " ..

[Android] registerForActivityResult로 팝업 Activity를 만들어보자
들어가기 전 엄빠도 어렸다 서비스를 만들면서 두 사용자가 7일차까지 모두 답변을 마쳤을 때 홈화면 대신 엔딩화면이 팝업처럼 띄워지도록 구현해야했다. registerForActivityResult를 통해서 이 기능을 구현한 과정과 겪은 트러블슈팅을 포스팅해보도록 하겠다. registerForActivityResult 란? 기존의 Activity간의 이동을 할 때 startActivity(intent : Intent )를 통해서 단방향 이동을 하고, 데이터값 전달과 함께 양방향 이동을 위해서는 startActivityForResult(intent:Intent, requestCode:Int) 을 사용했다. 하지만 startActivityForeResult는 콜백 수행의 안정성, 보일러플레이트 코드의 증가 이슈..

[Android] 기존 코드를 Hilt로 마이그레이션 해보자
들어가기 전‘엄빠도어렸다’ 프로젝트 2차 스프린트 중, 기존 코드를 Hilt를 통해 의존성 주입 리팩토링을 진행하였습니다.그 과정과 의존성 주입으로 인해 변경된 점, 의존성 주입과 Hilt의 장점 등을 포스팅하고자 합니다.기존 코드와 Hilt의 필요성class HomeRemoteDataSource { private val homeService = ServicePool.homeService}2차 스프린트 이전의 코드는 정적 객체에 직접 의존하는 방식으로 작성되어 있었습니다.이 방식의 문제점은 다음과 같습니다:의존성 관리의 어려움HomeRemoteDataSource 클래스는 ServicePool의 정적 객체에 직접 의존합니다.이로 인해 코드 변경이나 테스트에 유연성이 떨어지고, Mock 객체를 활용한 ..

[Android] LifecycleOwner란? viewLifecycleOwner와의 비교
들어가기 전 이번 포스팅에서는 ViewModel의 LiveData를 View에서 observe 할 때 사용하는 LifecycleOwner를 잘못 사용한 나의 사례를 바탕으로 LifecycleOwner란 무엇인지, viewLifecycleOwner와 비교해 fragment에서는 무엇을 사용해야하는지에 대해 알아보고자 한다. 안드로이드 프로젝트에서 mvvm 패턴을 구현할 때, model 에서 받아온 데이터를 가공해 view에 제공하기 위해서 viewModel을 활용한다. 이 때 AAC ViewModel에서 LiveData를 활용해 observerPattern을 이용할 것이다. 아래는 예시 코드이다. [그림 1]은 ViewModel에서 listQnaResponse라는 LiveData 객체를 생성하고, View..

[Android] UI State란 무엇일까?
들어가기 전 현재 나는 부모님과의 문답 서비스 엄빠도 어렸다 라는 프로젝트를 진행하고 있다. 프로젝트 진행 중 서버로부터 받아온 데이터가 UI에 나타날 때 빈 화면(데이터가 덜 표시된 화면)이 노출되는 경우가 종종 발생했다. 이 부분을 해결하고자 로딩뷰를 추가하기로 하였고, 공부하면서 로딩뷰를 어떻게 관리할까? 라는 의문이 생겼다. 그 과정에서 활용을 위해 UI State가 무엇인지에 관련된 글을 작성해보겠다. UI Layer UI의 역할은 화면에 애플리케이션 데이터를 표시하고 사용자의 상호작용의 기본 지점으로서의 역할을 수행하는 것이다. 상호작용 (Button 누르기) 또는 외부압력 (네트워크 응답)으로 인해 데이터가 변할 때 마다 변경사항이 반영하도록 UI가 업데이트 되어야 한다. https://hy..

[Kotlin] 코틀린의 sealed class 란?
Sealed class 정의 sealed calss는 Super 클래스를 상속 받는 Child 클래스의 종류를 제한하는 특성을 갖는 클래스이다. 어떤 Super 클래스를 상속받는 하위 클래스는 여러 파일에 존재하기 때문에 컴파일러는 해당 Super 클래스를 상속받는 하위 클래스가 얼마나 있는지 알지 못한다. 하지만 sealed class 는 동일한 패키지에 정의된 자신의 하위 클래스들을 인지해 컴파일러에서 그 외 다른 하위클래스는 존재하지 않음을 알 수 있다. 아래 예시를 통해 해당 상황을 보도록 하겠다. abstract class DogState class Running : DogState() class Eating : DogState() class Barking : DogState() 강아지의 상태를..

[우테코/Kotlin] 우아한 테크코스 온보딩 풀이 및 공부
들어가기 전 Kotlin 언어에 더 익숙해지기 위해서 요즘 우아한 테크코스 5기의 미션들을 하나씩 풀어가고 있다. 그 중 온보딩 미션의 풀이과정과 공부하면서 배운 내용들을 정리하고자 이 포스팅을 쓰게되었다. 문제1 : pobi 와 crong 각각 왼쪽,오른쪽 페이지 중 + / * 값이 더 큰 값을 구하고 이를 pobi와 crong의 대표값으로 설정한다. pobi와 crong 의 대표값 중 더 큰 값을 찾는 문제이다. 나의 풀이 fun getMaxNumber(page: Int): Int { var add = page var mul = page var resultAdd = 0 var resultMul = 1 while (add != 0) { resultAdd += (add % 10) add /= 10 } w..

[Android] Dependency Injection이란? + Hilt
들어가기 전 Clean Architecture를 공부하면서 '의존성' 낮추기, '결합도' 낮추기, '의존성' 주입, '의존성' 역전 등 지속적으로 의존성에 대한 내용이 언급되었다. 그래서 소프트웨어 설계에서 Dependency는 무엇을 의미하는지, 안드로이드에서는 이를 어떻게 적용할 수 있는지를 공부해보고자 한다. Dependency "A가 B를 의존한다." 라는 표현은 아래와 같은 뜻을 담고 있다. 의존대상 B가 변하면, 그것이 A에 영향을 미친다. - 이일민, 토비의 스프링 3.1, 에이콘(2012), p113 이런 의존관계를 UML의 표현을 빌려 A--->B로 표현할 수 있다. 이는 B의 기능이 추가나 변경되면 그 영향이 A에 미친다. B의 기능 추가나 변경이 A에 영향을 미치게되는 경우, B에게 ..

[Android] 안드로이드 MaskFilter로 blur 효과 구현하기
들어가기 전 엄빠도 어렸다 서비스를 만들면서 그림과같이 내가 답변을 하기 전에 상대가 답변을 할 경우 문답화면에서 상대 답변이 블러처리가 되어있는 디자인을 구현했어야 했다. 이 때 블러를 구현하기 위해서 사용했던 방법을 소개하고자 한다. Blur 효과 만들기 안드로이드 Paint BlurMaskFilter 사용 private fun setBlurText(isBlur: Boolean) { with(binding) { tvAnswerOther.setLayerType(View.LAYER_TYPE_SOFTWARE, null).apply { if (isBlur) tvAnswerOther.paint.maskFilter = BlurMaskFilter(16f, BlurMaskFilter.Blur.NORMAL) else..

[Android] Clean Architecture + MVVM 패턴
들어가기 전 안드로이드 프로젝트를 하면서 MVVM , Clean Architecture, Dependency injection etc... 이런 키워드들을 정말 많이 들었다. Sopt 처음 시작할 때 Clean Architecture를 적용한 프로젝트를 진행하고 싶다고 말할 정도로 나는 이 부분에 대한 공부를 하고싶었다. 이번 앱잼에서 MVVM 패턴을 적용했다는 점(Hilt (x))에서 반은 이뤘지만, 어떻게보면 왜 이렇게 사용하는지 조차 모르고 사용한 부분들이 많았다. 이번기회에 제대로 이해되지 않은 부분들도 다 이해하고 넘어가고자 이 포스팅을 작성한다. MVVM (Model - View - ViewModel) MVVM 패턴은 MVP 패턴에서 파생된 패턴으로 비즈니스 로직과 프레젠테이션 로직을 사용자 ..