문제 - 21313https://www.acmicpc.net/problem/21313문제에서 핵심만 뽑자면 다음과 같다.문어의 팔은 1~8 숫자로 부르는데, 규칙은 없다.서로 같은 번호 손을 잡는다.한 문어와 둘 이상 손을 잡을 수 없다.한 손으로 여러 문어의 손을 잡을 수 없다.1번과 2번 문어가 잡은 손의 번호는 1번째 항, 2번과 3번 문어가 잡은 손의 번호는 2번째 항, ..., N - 1번과 N번 문어가 잡은 손의 번호는 N - 1번째 항, N번 문어와 1번 문어가 잡은 손의 번호는 N번째 항이다.문어의 수 N이 주어질 때, 이렇게 만들 수 있는 수열 중 사전순으로 제일 앞서는 수열을 알아보자해결 방법문제 그대로 해결하기문제 그대로 읽고 해결 방법을 생각하면 다음과 같다.1번과 2번 문어가 손 ..
Coroutine 이 뭘까?주로 Coroutine 을 설명하면 Coroutine 은 루틴의 일종으로 “Co(협력하다)” + “routine” 이며 실행의 지연과 재개를 허용하여 비선점적 멀티태스킹을 위한 서브 루틴을 일반화한 구성요소라고 한다.사실 이 말로는 Coroutine을 이해하기에 매우 어렵기에 하나하나 뜯어보고자 한다.Routine 이란?우리가 만드는 프로그램은 Main Routine 과 Sub Routine 으로 나뉘게 된다.말이 어렵지만, 쉽게 보면 다음과 같다. fun main() { // Main routine 은 main 함수라고 볼 수 있다. (프로그램이 시작되는 그 main 함수) // main 함수로 인해 실행되는 흐름을 이야기 한다. // ... v..
서론사실 Coroutine 을 처음 접하고 학습한 것은 2020년에서 2021년 사이였다. 당시에는 단순한 학습을 하고 사용할 기회만 있었을 뿐, 깊이 이해하고 다양하게 활용할 기회가 없었다.최근 근무하며 다양한 Coroutine 코드를 접하고 직접 테스트 코드를 작성해본 경험을 바탕으로, 앞으로 만들어갈 Mulitplatform Project에서 Coroutine 을 더 잘 활용하기 위해, 과거에 알던 내용에 새로 생긴 궁금증을 해결하며 다시 한번 Coroutine 을 복습하고 다시 정리해보고자 한다.들어가기에 앞서...처음 비동기 작업을 위해 학습을 시작하던 때가 Android 11에서 12로 넘어가던 시절이던 것 같다.Coroutine 에 대해 자세하게 작성해보기 전에 왜 어쩌다가 Coroutine..
서론최근 근무하며 진행중인 프로젝트에서 Timber 세팅과 일부 SDK 설정을 해야했다.현재 프로젝트에서 Application 의 onCreate()에는 다른 설정이 존재하여 Timber 및 SDK 초기화 설정을 추가하면 Apllication.onCreate() 가 복잡도가 증가하는 상황이었다.따라서 Timber 및 SDK 설정을 마치 Spring 의 @Configuration 를 참고하여 분리된 설정을 만들고자 생각했다.이미 과거에 Jetpack Startup 을 도입했던 경험이 있기 때문에 단순하게 도입을 하면 되는 상황이었지만 문서화를 하는 과정에서 보다 명확한 설명을 위해 알아본 내용을 정리해보고자 한다.개인이나 지인 단위 프로젝트라면 그냥 적용하고 끝났겠지만...새로 도입하는 내용이기 때문에 적..
서론...최근 테스트 코드를 작성하는 과정에서 가독성 개선을 시도한 적이 있다.기존 UnitTest 는 Android 환경에서 Junit4 + Truth + MockK 와 같은 수단을 사용했고 Spring 환경에서는 Junit4 or Junit5 + AssertJ + Mockkito 와 같은 수단을 사용했다.더불어 이해와 가독성을 위해 BDD 기반의 given-when-then 패턴 또한 사용하며 한글 이름의 메소드를 작성했다.하지만 이 과정에서 Junit 뿐 아니라 Mocking, Stubbing 등을 위한 다른 라이브러리의 사용법 또한 알아야 기본적으로 Test 코드를 이해할 수 있었다.따라서 보다 직관적으로 테스트 코드를 작성할 방법을 고민하던중 Naver D2, 우아한 기술 블로그, 지마켓 기술 ..
서론...최근 Spring Boot 를 활용하여 백엔드 및 DevOps 포지션에서 3주간 서비스를 만드는 해커톤에 참여했다.서비스 배포를 앞두고 배포후 발생할 수 있는 장애를 대비하는 과정에서 성능 개선의 필요성을 느꼈다.하지만 백엔드 & DevOps 경험이 거의 없었기 때문에 무엇을 기준으로 성능을 개선하고, 어떤 부분을 개선해야할지 막막한 상황이었다.분명 급하게 만든 만큼…성능을 개선할 부분이 많을 것으로 예측되지만…추측으로 현재 어느정도의 성능인지도 모르고 개선을 이야기 하는 것도 말이 안되는 상황이었다. 무엇보다 팀원들의 리소스를 비효율적으로 사용할 수 없었다..이런 상황에서 여러 기술 블로그를 참고하고 많은 고민을 한 후, 결국 JPA 쿼리 효율성을 먼저 개선하기로 결정했다.이 과정에서 가장 처..

서론...개인적으로 진행중인 프로젝트에서 Scaffold 내부 topBar 에서 지정한 부분만 접거나 확장해야하는 요구 조건이 있었다.초기에는 androidx.compose.material3 에 포함된 LargeAppBar()를 사용하여 구현하고자 했다.하지만 원하는 디자인 요구사항을 만족시키기 어려웠기 때문에, 직접 fraction 과 같이 진행도를 바탕으로 구현할 수 밖에 없었다.(다양한 라이브러리 역시 결국 같은 결과에 도달했다..)해당 과정에서 구현을 위한 변수나 함수 그리고 상태를 관리하는 값이 너무 많았다.수정사항이 실제로 발생하고 유지보수가 힘들었기 때문에 재사용성도 고려하고 역할과 책임을 적절하게 분리하고자 했다.이 과정에서 nestedScroll에 대해 자세하게 알아본 과정을 풀어보고자 ..
Kotlin 을 이용한 Spring Boot 스터디 진행 중 Kotlin 기초를 진행한 후 Java를 Kotlin 으로 변환하는 과정에서 자바와 다른 생성자를 만드는 과정에서 Kotlin 만의 생성자 생성 방식이 햇갈릴 수 있다는 생각이 들어 내용을 정리하게 되었습니다. Kotlin 의 Class와 Interface의 경우 Java의 Class, Interface와 약간의 차이가 있습니다. 대표적인 부분이 Kotlin 은 기본적으로 대부분의 선언이 public final 이라는 부분에서 생기고, 중첩 클래스의 경우 기본적으로 내부 클래스가 아닌 점 등 기본적으로 Kotlin 에서는 Java에서 진행하던 번잡스러운 과정이 없기 때문에 발생하는 차이라고 생각됩니다. 이러한 부분에 대해 Kotlin 에서 생성..

서론SOPT 30th 앱잼을 진행하며 Git 에 대해 많은 이슈를 겪는 경우를 보았습니다.주로 SOPT 에서는 많은 분들이 GitKraken 혹은 GUI 툴을 많이 사용하시는 것을 보았습니다. GUI 툴도 많은 기능을 제공하지만 쉽게 사용할 수 있다는 것에서 특히 reset 의 경우 이를 되돌릴 수 있다는 점을 모르시는 경우도 많다고 생각되어 포스팅을 하게 되었습니다.Git Reset --hard 는 복구할 수 없다?결론을 먼저 말하면 그렇지 않다 입니다.git 에서 저장되는 commit 의 경우는 쉽게 삭제되거나 사라지지 않습니다.우리가 보는 git log 의 경우는 해당 브랜치에서 그래프 형태로 참조중인 변경사항의 연속을 보는 것과 같습니다.만약 우리가 commit 을 한다면 그래프에 새로운 참조를 ..

2020/11/23 - [개발로 쓰는 공부/Java 지식] - [Java] Wrapper class - Auto Boxing, Unboxing [Java] Wrapper class - Auto Boxing, Unboxing 🙄 Auto Boxing 과 Auto Unboxing auto boxing과 unboxing은 사실 java를 배울때 서적에도 적혀있는 내용이지만, 개념을 배운후에 개발하다 보면 사실 망각하기 쉬운 부분이기도 한 부분인데요 Wrapper Classes와.. antilog.tistory.com 해당 글에서 Auto Boxing과 Auto Unboxing을 설명하며 아래와 같은 부분이 있었습니다. Integer integerNumber = new Integer(1); Integer oth..