전체 글

I’m currently learning Android, ComputerScience, Algorithm and etc....
Android/Study

[Android] RecyclerView에서 onCreateViewHolder와 onBindViewHolder의 차이

블로그에 지난 졸업프로젝트에서 했던 주요 기능부분을 기록으로 남기려고한다. 조금? 오랜 시간이 지났지만 기억을 되살려서 기록을 해보자. 졸업 프로젝트에서는 다른 여타 프로젝트와 달리 RecyclerView에 대해서 사용할 일이 많았다. 그렇다면 RecyclerView에서 자주 사용하는 메서드 onCreateViewHolder와 onBindViewHolder의 차이에 대해서 알아보자. onCreateViewHolder와 onBindViewHolder class CommentAdapter( private val onClickMenu: (CommentItemUiState) -> Unit ) : ListAdapter(diffCallback) { override fun onCreateViewHolder(paren..

Android/Study

[Android] ComposeUi 도입기

지난 프로젝트에 대한 회상 겸 정리할 겸 작성을 해보았다. (물론 너무 오랜 시간이 지나긴했지만...) 우리가 ComposeUi를 도입한 이유 선언형 프로그래밍: Compose는 선언적인 구문을 사용하므로 UI의 현재 상태를 더 직관적으로 표현할 수 있습니다. XML의 경우 계층적인 구조를 가지기 때문에 UI 구조를 이해하기 어려울 수 있지만, Compose는 코드의 순서대로 UI를 정의하여 가독성을 높입니다. 간편한 실시간 미리보기: Compose는 실시간 미리 보기(Real-time Preview)를 제공하여 UI 변경 사항을 즉시 확인할 수 있습니다. 이는 빠른 반복 및 디자인 작업을 도와줍니다. (XML또한 볼 수는 있지만....) 상태 관리의 편의성: Compose는 내부적으로 상태를 자동으로 ..

Android/Study

[Android] 포스팅 업로드 구현 (4) - Repository

전체 코드 data class PostDto( val uuid: String = "", val writerUuid: String = "", val content: String = "", val imageUrl: String = "", val dateTime: Date = Date() ) @RequiresApi(Build.VERSION_CODES.O) suspend fun uploadPost( content: String, imageUri: Uri ): Result { val currentUser = Firebase.auth.currentUser require(currentUser != null) val db = Firebase.firestore val storageRef = Firebase.storage..

BaekJoon

[BaekJoon] 2589번 보물섬 (Java) 문제 풀이 [Gold 5]

문제 https://www.acmicpc.net/problem/2589 2589번: 보물섬 보물섬 지도를 발견한 후크 선장은 보물을 찾아나섰다. 보물섬 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 각 칸은 육지(L)나 바다(W)로 표시되어 있다. 이 지도에서 www.acmicpc.net 어떻게 풀 것인가? 문제는 간단한 BFS 문제이다. 다만 매번 Visit 2차원 배열을 초기화하여 가장 긴 거리를 찾아야한다. 그렇기에 이 부분만 주의하여 푼다면 어렵지않다. 풀면서 놓쳤던점 X 이 문제를 통해 얻어갈 것 기본적인 BFS 풀이 내 코드 import java.io.BufferedReader; import java.io.IOException; import java.io.InputSt..

Android/Study

[Android] 포스팅 업로드 구현 (3) - 화면 XML

이번에는 화면 구현 XML에 대해서 리뷰해보자. 사실 크게 어려운 부분은 없다. XML을 통해서 화면을 구현할 때마다 느끼는 것이지만 사실 디자인적인 재능도 있어야하나 싶다.. 전체코드 실제 구현 화면

Android/Study

[Android] 포스팅 업로드 구현 (2) - ViewModel

이번에는 PostCreateViewModel에 대해서 리뷰를 해보자. 전체 코드 class PostCreateViewModel : ViewModel() { private val _uiState = MutableStateFlow(PostCreateUiState()) val uiState = _uiState.asStateFlow() fun selectImage(uri: Uri) { _uiState.update { it.copy(selectedImage = uri) } } fun changeToEditMode() { _uiState.update { it.copy(isCreating = false) } } @RequiresApi(Build.VERSION_CODES.O) fun uploadContent(conte..

Android/Study

[Android] 포스팅 업로드 구현 (1) - Activity

이번에는 포스팅을 업로드하는 PostCreate 부분에 대해서 리뷰를 해보자. 이 기능은 EditTextView 뿐만 아니라 이미지 또한 스마트폰 갤러리에서 선택하여 파이어베이스 저장소에 저장해야 전체코드 class PostCreateActivity : AppCompatActivity() { lateinit var binding: ActivityPostCreateBinding private val viewModel: PostCreateViewModel by viewModels() private val fileChooserContract = registerForActivityResult(ActivityResultContracts.GetContent()) { imageUri -> if (imageUri !=..

Android/Study

[Android] 로그인 기능 구현 (4) - Repository

object AuthRepository { suspend fun signIn(email: String, password: String): Result { return try { Firebase.auth.signInWithEmailAndPassword(email, password).await() Result.success(Unit) } catch (e: Exception) { e.printStackTrace() Result.failure(e) } } } 이번에는 AuthRepository 코드에서 설명하고자 한다. Firebase를 기반으로 로그인, 로그아웃, 회원가입 기능을 만들었기에 Firebase 인증(Authentication)과 관련된 기능을 처리하는 AuthRepository라는 싱글톤 객체를 ..

Android/Study

[Android] 로그인 기능 구현 (3) - ViewModel

이번에는 ViewModel에 대해서 어떤식으로 구성을 하였는지에 대해서 보이려고 한다. 코드 import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.example.sangsangstagram.data.AuthRepository import com.google.firebase.auth.ktx.auth import com.google.firebase.ktx.Firebase import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.update impo..

Android/Study

[Android] ktlint, detekt를 적용해보기

오늘은 ktlint, detekt에 대해서 공부를 해보자. Ktlint와 Detekt는 모두 Kotlin 언어로 작성된 코드에서 코드 품질을 유지하고 개선하기 위한 도구들이다. ktlint 목적: Ktlint는 Kotlin 코드의 일관된 스타일을 유지하고 코드 포맷을 검사하는 데 사용된다. 기능: 코드 포맷팅 규칙을 정의하고 이를 기반으로 Kotlin 코드의 스타일을 검사한다. 코드베이스의 일관된 형식을 유지하면서 코드 리뷰 및 유지보수를 용이하게 한다. 사용법: Ktlint는 Gradle, Maven, 등의 빌드 도구에서 통합하여 사용할 수 있다. 터미널에서 직접 사용하거나 CI/CD 파이프라인에 통합하여 자동 검사할 수 있다. detekt 목적: Detekt는 Kotlin 코드에서 일반적인 코드 품질..

Programming Language/Kotlin

[Kotlin] coroutineScope와 supervisorScope

coroutineScope와 supervisorScope가 각각 무엇인지 그리고 차이가 무엇인지에 대해서 알아보자. coroutineScope coroutineScope는 Kotlin의 코루틴에서 사용되는 스코프 중 하나로, 여러 개의 코루틴이 모두 완료될 때까지 대기하거나, 그 중 하나라도 예외가 발생하면 모든 코루틴을 즉시 취소하는 기능을 제공한다. coroutineScope 함수는 suspend 함수 내에서만 사용될 수 있으며, coroutineScope 내에서 시작된 코루틴이 완료되거나 예외가 발생할 때까지 현재 코루틴을 일시 중단한다. import kotlinx.coroutines.* suspend fun main() { try { coroutineScope { // 이 부분은 coroutine..

Android/Study

[Android] android에서 multipart로 image 전송 및 받아오기

블로그에 지난 졸업프로젝트에서 했던 주요 기능부분을 기록으로 남기려고한다. 조금? 오랜 시간이 지났지만 기억을 되살려서 기록을 해보자. 졸업 작품에서 이미지와 관련된 기능을 구현하다보니 이미지들을 가져오거나 서버측으로 이미지를 보내줘야하는 상황이 발생하였고, 이를 해결하기 위해서 MultiPart란 것을 사용하게 되었다. MultiPart란 무엇인가? 멀티파트는 클라이언트와 서버 간에 전송되는 HTTP 요청 또는 응답에서 여러 종류의 데이터를 동시에 전송하기 위해 사용되는 방식이다. 일반적으로 파일 업로드와 관련된 데이터를 전송하는데 주로 사용된다. HTTP 프로토콜은 기본적으로 텍스트 기반의 요청과 응답을 처리한다. 하지만 파일과 같은 이진 데이터를 전송해야할 때는 이진 데이터를 텍스트 형식으로 인코딩..

Tenacity_Dev
인성의 개발 공부 노트