⛔ 문제사항 여행 채널 추천 카테고리를 보면 5개 밖에 출력되지 않은 현상을 볼 수 있다. 내가 의도한 것은 총 6개의 채널이 추천되며 그리드뷰가 꽉 채워지는 것이었는데 다른 화면을 이동하거나, 앱을 재실행하여 해당 Fragment가 다시 그려질 때마다 채널이 2개부터 6개까지 그려지는 개수가 그때그때 다르다는 것이었다. 그러나 아래 스크린샷과 같이 로그캣을 찍어보면 itemList의 총 개수는 6개로 잘 넘어오는 것을 알 수 있었다. 당시 코드다. channelList는 LiveData로 관리하고 있고, channel을 가져오는 api는 async await을 통해 비동기적으로 받아오고 있었다.class HomeViewModel( private val channelRepository: Chann..
전체 글
디자인 전공자가 모바일 개발자 되기0️⃣ 메모리의 영역에서,메모리에 대해서 먼저 기초학습이 필요하다면 아래 블로그 링크를 통해 복습하고 오자! [얼레벌레 공부하는 CS] RAM0️⃣ 메모리란? 메모리의 사전적 정의는 아래와 같다. 늘 사전적 정의는 이해하기 어렵지만 이렇게 간결한 설명 또한 없다.데이터나 명령을 비롯하여 컴퓨터 내부에서 계산 처리 한 결과kkevido.tistory.com 메모리에 저장되는 영역은 크게 코드 영역, 데이터 영역, 힙 영역, 스택 영역 총 4가지가 있다.코드 영역 : 실행할 프로그램의 소스코드가 저장되는 영역 (텍스트 영역이라고도 부름)데이터 영역 : 전역 변수, 정적 변수힙 영역 : 프로그래머가 직접 할당하고 해제할 수 있는 동적할당 영역스택 영역 : 프로그램이 자동으로 사용하는 임시 메모리 영역간단하게..
0️⃣ 4대 구성요소?안드로이드 앱의 필수 구성요소를 흔히들 4대 컴포넌트라고 부르는데, 각 구성요소는 시스템이나 사용자가 앱에 들어올 수 있는 진입점이다.액티비티서비스브로드캐스트 수신자콘텐츠 제공자이렇게 총 4가지의 구성요소로 이루어져있으며, 각 구성요소는 독립적으로 존재하여 생명주기를 가지고 있기 때문에 고유의 기능을 수행할 수 있으며, 인텐트를 통해 서로 상호작용할 수 있다.1️⃣ Activity (액티비티)액티비티는 사용자 인터페이스를 나타내는 단일 화면으로 주로 사용자와의 상호작용을 담당한다.class MainActivity : AppCompatActivity() {}2️⃣ Service (서비스)서비스는 백그라운드에서 실행되는 구성요소로 앱이 종료되어도 백그라운드에서 처리되는 기능들을 말한다..
⛔ 문제사항RecyclerView로 표현하고 있던 Item들 중에서 하나를 remove 하는 로직을 동작하자 이러한 에러가 나타났다.✅ 해결방안이는 Apapter에서 관리하는 데이터와 ViewHolder게 그리는 View가 일치하지 않아 발생하는 문제다.그냥 notifyDataSetChanged() 해주면 쉽게 해결되는 문제였다! 하지만 구글링을 좀 더 하다보면 스크롤을 빠르게 내린다거나 둥, 스크롤 관련된 문제로 많이 나타나는 것처럼 보였는데 대부분 LinearLayoutManager를 Wrapper로 감싸주는 방법을 많이 사용했다. 나 같은 경우엔 단순히 데이터가 바뀌었다고 notify 해주기만 하면 됐기 때문에 손쉽게 해결할 수 있었다.
0️⃣ 왜? 사실 Fragment, TabLayout, RecyclerView는 뗄레야 뗄 수 없는 존재다. 정말 많은 앱에서 이러한 구조로 구현하고 있을테니 이 기회에 확실하게 복습하고 넘어가면 좋다. ViewPager도 함께 쓰면 좋겠지만 우선은 제외하고 설명하겠다. 다른 좋은 포스팅들도 많으니 꼭 함께 참고할 것.1️⃣ MainActivityFragment와 TabLayout 같이 사용하는 핵심 부분! XML 파일은 생략하겠다.class MainActivity : AppCompatActivity() { private val binding: ActivityMainBinding by lazy { ActivityMainBinding.inflate(layoutInflater) } private ..
⛔ 문제사항레트로핏을 연습하는 과정에서 BuildConfig를 찾을 수 없다는 에러가 나타났다.✅ 해결방안해결방법은 비교적 간단한데, build.gradle 파일에서 buildConfig 값을 true로 지정해주고android { namespace = "com.example.myApplication" compileSdk = 34 ... 중략 buildFeatures{ buildConfig = true //여기 viewBinding = true }} gradle.protperties 파일에 값을 또 하나 추가해주면 된다.android.defaults.buildfeatures.buildconfig=true 이렇게 추가해도 안 된다? 안드로이드 스튜디오를 한..
0️⃣ 확장함수를 왜? 우선 확장함수를 쓰게 된 계기는 정말 단순한데, 수준별 학습반에서 과제를 받았기 때문이다! 기존에 진행한 프로젝트를 함수평 프로그래밍이 가능하도록 리팩토링하는 것이 과제였다. 과제를 진행하고 피드백 받으며 배운 점을 기록해보겠다.1️⃣ 확장함수란? 코틀린은 클래스에 상속하거나 디자인 패턴을 사용하지 않고 새로운 기능으로 클래스를 확장할 수 있는 기능을 제공하는데, 이를 확장이라는 선언을 통해 이루어진다. 이 때 추가적인 메소드를 구현하면 확장함수라고 일컫게 되는 것이다. 마치 기본 클래스에 정의된 함수인 것처럼 새로운 기능을 추가하는 것이지만 실제로 확장 함수는 클래스 외부에서 선언된다. 그렇다면 확장함수의 장점과 단점은 무엇이 있을까?장점단점코드 가독성 향상외부 라이브러리 확장코..
⛔ 문제사항코틀린으로 함수형 프로그래밍을 해보자! 라는 과제에 맞추어 기존에 진행 했던 프로젝트를 리팩토링 하는 겸, 함수로 분리할 수 있는 것들을 최대한 분리하는 과정에서 마주친 문제다.// 달력 다이얼로그 출력private fun dialogCalendar(dateText: String) { val calendar = Calendar.getInstance() val year = calendar.get(Calendar.YEAR) val month = calendar.get(Calendar.MONTH) val day = calendar.get(Calendar.DAY_OF_MONTH) val listener = DatePickerDialog.OnDateSetListener { _..
⛔ 문제사항xml내부에 재사용되는 UI를 include하여 코드를 작성하고 있는데 자꾸 이런 에러가 발생했다.✅ 해결방안원인은 include한 코드와 include 내부 xml 코드의 id값이 달라서 발생하는 문제였다.이렇게 include한 바깥 Activity xml과 내부 Layout xml의 id값을 맞춰주면 해당 에러는 사라지게 된다.그런데, 나는 한 가지 더 문제가 있었는데 바로 include한 TabLayout에서는 id값을 맞춰주어도 에러가 발생한다는 것이었다.원인은 바로 tabItem에 id값을 주어서였는데, tabItem은 원칙적으로 id값을 주지 못하는 게 원인으로 보인다. (버그일수도)id를 사용해서 tabItem값에 접근할 수 없기 때문에 아래 코드처럼 getTabAt 메소드에 in..
⛔ 문제사항fakeDataList.forEachIndexed { idx, itm -> if (idx == position) { fakeDataList.removeAt(idx) mainAdapter.notifyItemChanged(idx) }}forEachIndexed를 통해 List 안의 값을 삭제하려고 했는데, 이 코드가 동작하기만 하면 앱이 강제 종료 되며 java.util.ConcurrentModificationException 과 같은 에러가 나타났다.✅ 해결방안원인은 List나 Map과 같은 컬렉션을 수정하는 도중에 다른 스레드에서 동시에 컬렉션을 수정하려고 해서 그러는 것인데, 쉽게 말하자면 List는 수정되었는데 수정되기 이전의 List에서 forEach가 계속 수행 되고 있기 때문이다...
❓ 제목(중략)검사 결과는 모든 질문의 성격 유형 점수를 더하여 각 지표에서 더 높은 점수를 받은 성격 유형이 검사자의 성격 유형이라고 판단합니다. 단, 하나의 지표에서 각 성격 유형 점수가 같으면, 두 성격 유형 중 사전 순으로 빠른 성격 유형을 검사자의 성격 유형이라고 판단합니다.질문마다 판단하는 지표를 담은 1차원 문자열 배열 survey와 검사자가 각 질문마다 선택한 선택지를 담은 1차원 정수 배열 choices가 매개변수로 주어집니다. 이때, 검사자의 성격 유형 검사 결과를 지표 번호 순서대로 return 하도록 solution 함수를 완성해주세요. 💡 풀이class Solution { fun solution(survey: Array, choices: IntArray): String { ..
0️⃣ StringBuilder()는?일반적으로 문자열은 String인데, 프로그래머스를 통해 문제를 풀다보면 StringBuilder()를 활용하는 경우가 정말 많다.그 둘의 차이점이 무엇이길래 다르게 이용하는 것일까? String은 immutable 객체다. 우리가 String을 통해 연산을 하면 + 또는 - 연산자를 이용하는데, string1 + string2 와 같은 연산을 하면 새로운 String을 생성한다. 기존에 참조하고 있던 값에 연산하는 것이 아닌 추가된 문자열을 갖는 새로운 String을 생성 후 참조를 바꾸는 형식인 것이다. 연산이 많아질 수록 자원 관리가 비효율적이게 되는 것이다. 때문에 이렇게 자원을 낭비하지 않기 위해 나온 것이 StringBuilder이다. StringBuild..