!in setOf범주안에 포함되어 있지 않을 경우를 찾을수 있다계산기 만들때 입력된값이 부호가 아닐때를 구분해서 반복문을 다시 실행 시킬수 있었다.Try-catch 블록예외처리할때 사용했는데Int를 받는 변수가 문자를 받았을때 NumberFormatException오류
오늘 배운것들을 생각나는대로 정리해보자SQLite를 추상화하고 쉽게 사용할 수 있도록 도와주는 라이브러리휴대폰을 비행기모드로 해놔도 이미 받은 문자와 사진등을 볼수 있는데이걸 데이터 캐싱이라고 한다네트워크연결이 없어도 로컬 데이터많으로 앱을 사용할 수 있게 해주는 해주
패턴은 특정한 규칙이나 형식을 가진 데이터를 나타내는 것을 말합니다. 예를 들어, "수박수박수박"이라는 문자열은 "수"와 "박"이라는 패턴을 반복하여 구성되어 있습니다. 패턴을 이용하면 특정한 형태를 갖는 데이터를 쉽게 생성하거나 분석할 수 있습니다. filter는 컬
깃으로 브랜치를 만들어보자git pull origin maingit checkout maingit switch -c maingit switch -d maingit mergegit pushgit branchadd commitpull requestmerge서순 1.브랜치
사용자에게 문자열을 입력받았다숫자인지 알파벳인지 알수 있는 방법이 없을까?🤔isLetter()함수를 쓰면 주어진 문자가 알파벳 글자인지 여부를 확인 할 수 있다.그럼 반대로 숫자인 경우는?isDigit() 함수를 이용하면 알 수 있다.오늘은 깃 브랜치 작업도 했다클론
lateinit var 늦게 초기화사용할때는 값이아니라 참조형태로 사용해야하기 때문에 this:: 또는 ::를 붙임상수는 lazy프로그램이 메모리에 올라가서 실행될때 이를 프로세스 1개 라고 함쓰레드는 프로세스보다 더 작은 단위프로세스 안에서 더 작은 작업의 단위가 쓰
Duration.between( ) 두시간의 간격을 계산한다LocalDate.now().atStartOfDay() 현재 날짜를 현재시간으로 초기화한뒤 해당날짜의 자정으로 설정item.checkin.atStartOfDay() 체크인의 시작 날짜 설정diff는 현재 날짜의
Kotlin의 복수 데이터 리턴 방법Pair를 활용해서 두 개의 인스턴스 리턴 Triple를 활용해서 세 개의 인스턴스 리턴설명코틀린에서는 Scope Functions들을 제공해요객체를 사용할때 임시로 Scope를 만들어서 편리한 코드 작성을 도와줘요Kotlin의 S
오늘은 구글에서 제시하는 표준 스타일 가이드를 공부했다Google의 Android 코딩 표준모든 소스 파일은 UTF-8로 인코딩되어야 합니다.UTF-8 -> 문자 인코딩하는 방식최상위 클래스가 하나 뿐인 경우 파일 이름에 대소문자를 구분하는 이름과 .kt 확장자최상위
문법 정리 replace() 문자열에서 특정문자를 다른문자로 바꾸는 메서드 replace(바꾸고싶은내용, 바꾸려는내용)으로 사용한다 예시) 이건 매핑해서 바꿔준것 sortedBy 그냥 sort()는 오름차순으로 정렬하는거라면 sortedBy { arr[n] }
알고리즘 성능을 평가하기 위해 복잡도의 척도를 사용한다동일한 기능을 수행하는 알고리즘이 있을 경우 복잡도가 낮을 수록 좋은 알고리즘 이라고함그중 시간 복잡도와 공간 복잡도가 포함되어 있다시간 복잡도는 알고리즘 수행 시간을 분석하고공간 복잡도는 알고리즘의 메모리 사용량을
Linear Layout오직 가로또는 세로 한방향으로함중첩 못시킴Weight를 줘서 무게 3 무게 7이면 3:7 이런식으로 씀Relative LayoutA를 표시하고 그옆에 B를 표시한다처럼 관계를 지정해줌위젯간의 중첩가능Table Layout테이블 처럼 맞춰놓음실무에
드롭다운 메뉴선택 항목 목록으로 스피너를 채우려면 Activity 또는 Fragment 소스 코드에 SpinnerAdapter를 지정해야 함주요 클래스SpinnerSpinnerAdapterAdapterView.OnItemSelectedListener이러한 배열과 함께
https://thdev.tech/kotlin/2018/03/25/Kotlin-lateinit-lazy/class 생성과 동시에 변수가 초기화되면, 재 접근시 빠르게 접근이 가능하여 이득을 볼 수 있다.변수를 꼭 사용하는 게 아니라면 오히려 메모리 손해를 볼
HashMap은 키와 값의 쌍을 저장하는 자료구조로, 키를 통해 값을 빠르게 검색할 수 있다.linkedMapOf는 Kotlin에서 제공하는 함수로, 순서를 유지하는 링크드 해시 맵(LinkedHashMap)을 생성키-값 쌍의 집합을 관리하는 해시 맵이지만, 요소의 삽
groupBy는 Kotlin의 표준 라이브러리 함수 중 하나로, 컬렉션의 각 요소를 그룹화하여 맵을 생성하는 데 사용이 함수는 주로 컬렉션 내의 요소를 특정 조건에 따라 그룹화할 때 유용함asSequence() 함수는 Kotlin에서 컬렉션을 시퀀스로 변환할 때 사용되
문법 정리코틀린에서 두개의 컬렉션을 결합하는대 사용한 쌍의 요소로 구성된 리스트를 생성한다람다를 제공해서 각쌍의 요소를 처리할 수 있다toMap을 사용하면 키-쌍으로 묶어 매핑할 수 있다.컬렉션의 요소를 특정 기준에 따라 그룹화하는 데 사용한다이 함수는 Grouping
문법정리숫자를 올림해서 나타낸다Double 타입의 인자를 받아, 그 값을 올림한 결과를 Double 타입으로 반환한다offer() 함수는 코틀린의 코루틴 라이브러리에서 제공하는 함수로, Channel 이라는 특별한 형태의 데이터 구조에 값을 추가하는 데 사용한다Chan
코틀린에선 else if문 왠만하면 when으로 쓴다else if문은 보기 지저분하기떔에enum class를 이용해서 메시지들을 타입별로 관리하기 용이하게 할수있다.SignUpErrorMessage.NAME.message 를 사용하면 sign_up_name_error를
layoutInflater LayoutInflater는 Android에서 XML 레이아웃 파일을 실제 View 객체로 변환하는데 사용된다 이 클래스의 인스턴스는 일반적으로 getSystemService(Context.LAYOUTINFLATERSERVICE)를 통해 얻
sns에 페이지 구현이 끝났다자세한 사항은 깃헙(https://github.com/heesoo-park/TeamAssignment3_2/blob/dev/DetailPageActivity.md주의 해야 할 부분을 정리하자면image게시물 에서 포스트의 정보를가진
ViewModel = ViewModel 개요| ViewModel 클래스는 비즈니스 로직 또는 화면 수준 상태 홀더이다 UI에 상태를 노출하고 관련 비즈니스 로직을 캡슐화 한다. > UI는 사용자에게 데이터를 표시하고 사용자의 입력을 처리하는 역할을 담당한다. 하지만
오늘은 팀프로젝트 발표가 있었다각팀의 결과물을 보고 훔쳐갈걸 생각해보자3조프로필 이미지 추가게시물 애니메이션자동 로그인 기능UI8조다이얼로그 깜빡함메인페이지 닉네임 텍스트 애니메이션2조이미지 클릭시 다이얼로그 나와서 이미지 확대 < 이거뭐임?상태메세지 다이얼로그
그 외 복습리사이클러뷰 뷰바인딩 어댑터뷰 프래그먼트 다이얼로그 알림첫 번째 방식에서는 lazy 위임을 사용하여 FragmentFirstBinding 객체를 초기화함.이 방식은 프래그먼트의 뷰가 생성될 때까지 바인딩 객체의 초기화를 지연시킨다.그러나 onDestroyV
View model변경 전 코드SignUpActivity.kt변경 후SignUpViewModel.ktSignUpActivity.kt액티비티의 코드가 단순해져서 이름,아이디,비밀번호등 유효성 검사가 차이가 났는데 유효성 검사를 뷰모델에서 하니 코드들이 매우 유사해짐이런식
스크롤을 최상단으로 이동시키는 플로팅 버튼 기능 추가 플로팅 버튼은 스크롤을 아래로 내릴 때 나타나며, 스크롤이 최상단일때 사라집니다. 플로팅 버튼을 누르면 스크롤을 최상단으로 이동시킵니다. 플로팅 버튼은 나타나고 사라질때 fade 효과가 있습니다. 플로팅 버튼을 클
저번 팀과제를 하면서 UI부분을 좀 많이 공부해야겠다는 생각이 들었다일단 보기에도 이쁜 앱이 사용자의 만족감을 채우기 좋고가독성과 편리성도 챙기며현업의 고급 개발자들이 어떤식으로 앱을 만드는지 생각해볼수있다고도 느끼고무슨기능을 추가할지 아이디어도 떠올리기 좋기때문에 정
뷰모델을 쓰다보면 파라미터가 필요한경우가 있다asset폴더에 접근해서 데이터를 불러오려면 context가 필요한데viewmodel에서 직접 context를 불러오면 View의 UI와 직접적으로 연결되기때문에 MVVM패턴이 깨지게 되고그렇다고 View에서 직접 데이터를
Invoke와 UseCase = Invoke 인보크 참고 Invoke란? > 이름 없이 간편하게 호출될 수 있는 함수 예시를 들면 여기서 인보크가 아닌 다른 함수라면 Test클래스에 있는걸 사용하기위해 보통 Test.함수명(str) 형태로 하지만 인보크 함수는
sealed class‘봉인된’ 이라는 의미로 무언가 안전하게 보관하기 위해 묶어 두는 것sealed 키워드를 이용함실드 클래스 그 자체로는 추상 클래스와 같아 인스턴스 생성 불가능생성자가 기본적으로 private, private이 아닌 생성자 허용x실드 클래스는 같은
ViewPager2앱을 실행할때 인트로화면 이후에 이미지를 넘기면서 페이지를 소개하는 창을 흔히들 볼 수 있을것이다KakaoTalk_20240108_033711069_09예를 들어 이런 화면인데 양옆으로 스와이프가 가능하면서 가만히 있으면 자동으로 페이지를 이동하는등로
휴대폰에서 연락처 가져오기이러면 이제 사용자가 권한을 설정할 수 있게되는데권한이 없을때 사용자한테 알림을 띄워 요청을 해야 한다checkSelfPermission 사용해서 사용자의 권한을 확인한다현재 상태가 퍼미션 허용인경우 연락처를 가져오는 getContacts를 실
Swipe-to-Action앱을 사용하다가 보면 옆으로 스와이프하면서 액션을 주는 걸 볼수 있을것이다예를 들어 통화앱 같은 경우 이런식으로 스와이프해서 통화가 가능하다ItemTouchHelper를 사용하면 구현이 가능한대스와이프외에도 롱클릭하며 삭제하기등 다양하게 구현
MotionLayout모션 레이아웃을 이용하면앱을 구현할때 애니메이션 효과를 주는 등 다양하게 표현이 가능하다2024-01-2221-25-07-ezgif com-crop이번에 만든 인트로 화면인데스와이프하면서 통화하는걸 표현해봤다.스와이프, 클릭등 액션 없이 그냥 재생
뷰모델을 인터페이스로연락처 관련 앱을 만들고 있었는데화면은 프래그먼트 2개로 이루어져 있고 뷰페이저로 넘겨 볼 수 있게 구성되어있다연락처에 대한 데이터를 공유하고 있어서 공유 뷰모델로 관리하고 있었는데뷰모델을 사용하지 말고 구축하라는 말을 듣고 새로 만들기 시작했다.사
연락처 가나다순 헤더연락처를 보면 가나다라 순으로 정렬되면서 헤더에 초성 'ㄱ''ㄴ'등이 들어간걸 볼 수 있다.정렬을 할때 처음엔 sort를 쓰긴했는데 그러면 한글은 후순위로 쭉 밀리게 된다어떻게 해결할까?일단 정렬하는 함수를 만들어줬다Java에서 Collator라는
XML 포맷의 텍스트 파일에 키-값 세트로 정보를 저장.SharedPreferences 클래스Preferences의 데이터(키-값 세트)를 관리하는 클래스응용 프로그램 내의 액티비티 간에 공유하며, 한쪽 액티비티에서 수정 시 다른 액티비티에서도 수정된 값을 읽을 수 있
리사이클러뷰는 타입별로 나눠 다양한 레이아웃을 꾸밀 수 있다리소스를 남기지 않고 재사용하기 때문에 화면의 대부분의 UI는 리사이클러뷰로 꾸며주는게 좋다지금까진 리사이클러뷰를 구성할때 RectclerView Adapter를 사용했는데 내용 갱신할땐 notifyItem메소
https://developers.kakao.com/product/search일단 카카오에서 제공하는 API를 사용할건데위링크에서 시작하기를 들어간다음 애플리케이션을 추가해 주고REST API키를 받아준다.image다시 링크로 들어가서 문서 버튼을 누르면 이렇
API에서 복수 데이터 정렬하기지난 시간에 이미지 데이터를 서버에서 받아 왔는데이제 동영상 정보도 가져와 줄거다우선은 데이터를 받을 모델을 하나더 만들어야한다동영상은 이런식으로 데이터를 받아오는데, 이전에 만든 이미지 뷰의 데이터 클래스가이렇게 되어있다.이걸 이용해서
SharedPreferences에 Json타입으로 저장하기지난 시간에 데이터를 불러오는걸 구현했는데 이제 이미지를 눌렀을때내 보관함으로 이동시키는 부분이 남았다.SharedPreferences를 이용하라는데, 내 데이터 모델은이런식으로 구성 되어있다. Parcelabe
Rest_API키를 숨기기API를 불러올때 API키가 필요하다.그러면 코드에 API키를 적어줘야하는데그냥 class파일등에 적을경우 apk를 뜯어보는 사람이 있다면 키를 볼 수 있고그렇게되면 데이터를 삭제하거나, 서비스를 마비시키거나, 아니면 그걸 사용해서 aws등을
Jetpack Compose바텀 네비를 만드려고 다양한 바텀 네비 디자인을 보고 있었는데demo이런 걸 봐버렸다.특히 2번째 공이 통통 튀는 애니메이션을 보고 아이디어가 샘솟아 버렸다.현재 이미지 검색앱을 만들고 있는데image이런식으로 토끼를 마스코트로 만들고 있었다
Column과 Row가 Linear레이아웃같은 컴포즈였다면 Box는 FrameLayout같은거라고 보면된다Box는 contentAlignment = Alignment.TopEnd 얼라이먼트로 이렇게 그래비티 같은걸 정해줄수 있다.저번에 Column같은 컴포즈를 알아봤는
이번에는 이미지를 누르면 좋아요 표시가되는걸 만들어볼꺼다앞서 말했던 @Composable를 이용해서 만들자일단 setContent에 이미지 카드를 구현할 컴포즈인 ImageCard()를 넣어준다.Card는 xml에서 카드뷰 같은 것 이라고 보면된다,radius를 정해주
TextField와 구조분해 ,Button ,스낵바와 코루틴스코프 = image 이번에 editText처럼 값을 입력받을수 있는 TextField와 Button을 컴포즈로 만들어볼것이다 TextField 일단 TextField를 Column안에 넣어주자 >Te
앱을 테스트하려고 ExampleInstrumentedTest 클래스에 함수를 옮겨봤는대Duplicate class error가 뜨며 실행이 안됬다.imageDuplicate class에러는 동일한 클래스가 두 번 이상 정의되었을 때 발생한다고 한다.에러 코드를 보면
유효성검사의 에러메세지, 액티비티 혹은 프래그먼트에 진입하는 entry type등을 정해줄때 주로 enum class를 사용한다.관련있는 상수들끼리 모아주기때문에 데이터 관리에 효과적이나, 서로의 타입이 다르면 안된다는 한계가 있다.그런 단점을 보완하기 위해 seale
뷰모델등 사용하다보면 파라미터로 레포지토리, 유즈케이스등등 로직을 수행할 다양한 클래스들을 받게 되는데 일반적으로 액티비티나 프래그먼트 같은 뷰에서 뷰모델을 선언할때 바로 파라미터에 넣어주면 안된다.이렇게 선언하게 되면 이렇게 하면 뷰와 뷰모델, 그리고 이들 종속성 사
이미지를 로드하는 외부 라이브러리로 주로 쓰이는 3가지가 Coil, Glide, 그리고 Picasso가 있다. 얘네는 무슨 차이가 있을까? Coil 주로 쓰던 라이브러리인데 이녀석 코루틴을 사용한다는건 알고 있었는데 이름이 Coroutines Image Loade
https://console.cloud.google.com/welcome/new?supportedpurview=project 구글 클라우드 서비스에서 프로젝트를 생성하고 유튜브 API3 키 를 받으면 유튜브 API를 쓸 수 있다. Interface 유튜브 api 문
유튜브 API3를 사용하면 다양한 유튜브 영상들을 가져 올 수 있다.그런데 유튜브에서 불특정 다수에게 무료로 막 풀면 사용자가 이상하게 사용할 경우 요금을 감당하지 못할 것인데그걸 막기위해 할당량이라는 제한이 존재한다.할당량은 키당 10000인데 검색을 한번 할 때마다
앱을 보다 보면 다양한 바텀 네비게이션이 있다.정말 수많은 UI들이 있는데 이번엔 안드로이드 스튜디오에서 제공하는 코드만으로가운데가 움푹들어간 바텀 네비게이션을 만들 것 이다.BottomAppbar는 Android Material Design 컴포넌트 라이브러리의 일부
유튜브 쇼츠 영상처럼 영상이 재생되고 가득찬화면에서 반복되는 쇼츠영상을 만들려고한다. 유튜브 쇼츠 영상을 보면 아이콘들이 있고 채널 프로필, 채널명, 영상 타이틀 그리고 전체적인 화면을 채우는 영상이 있다. 그리고 화면을 넘기면 일정이상 드래그 했을때 휙하고 다음
동영상 앱을 만드는데, 처음에 인기동영상과 그 밑에 키워드가 달린 동영상을 보여주는데데이터를 갱신하는 과정에서 앱 최초 실행시 캐시데이터가 없고 Room생성하는등 시간이 조금 걸려서 그 동안 화면을 가려줄 Splash Screen이 있으면 좋겠다 싶어서 만들었다.유튜브
바텀 네비게이션 설정을 하는데, 바텀네비가 아닌 다른 외부 버튼으로 프래그먼트를 이동할때 바텀 네비게이션이 원하는대로 동작하지 않게 된다.이유를 찾다가 백스택에 대해서 알게 되었다.액티비티나 프래그먼트의 이력을 관리하는 스택(stack) 구조의 메커니즘이다프래그먼트(혹
뷰페이저로 쇼츠 화면을 만들었는데 현재 보고 있는 뷰페이저의 홀더가 아니라다른 곳에서 영상이 재생되는 현상이 발생했다.뷰페이저의 특징 때문에 발생한 건데,뷰페이저는 미리보기로 화면에 보이지 않더라도 주위에 홀더를 1개씩 미리 만들어둔다그렇기 때문에지난번에 설정한 loa
뷰모델을 다루다보면 계속 듣던 StateFlow SharedFlow에 대해 알아보려고한다.그 동안 라이브 데이터를 사용해서 구현했는데현업에선 StateFlow SharedFlow만 쓰고 라이브 데이터는 이제 잘 안쓴다는 얘기를 들었다.이 둘의 라이브 데이터와 다른점은
지난번에 StateFlow의 라이브 데이터와 차이점 SharedFlow 와 차이점에 대해 알아봤는데 좀더 자세히 알아보려고한다. StateFlow 스테이트 플로우 내부로 들어가보면 AbstractSharedFlow(), MutableStateFlow, Canc
클릭아키텍처는 추상화 개념으로 관심사를 분리시키고 의존도를 낮추는 것에 목적을 둔 아키텍처이다.그 동안 MVVM패턴을 구현하면서 클린아키텍처를 공부했지만 좀 더 명확하게 정리를 해볼까 한다.MVVM 패턴은 클린아키텍쳐를 구현하기위한 설계 과정이라 보면된다.MVVM 패턴
오늘은 간만에 다시 컴포즈를 공부해 보려구 한다.이전까진 뷰를 그려봤는데 이번엔 뷰모델을 구현해보려구한다.Hello라는 문구가 보이고 버튼이 하나로 구성된 간단한 뷰를 만들었다.mutableStateOf(value = "Hello")는 컴포즈의 UI상태를 관리 한다.리
이번엔 컴포즈에서 중요한 state에 대해 다뤄 보려고 한다.컴포즈에서 State는 화면의 UI상태를 관리하는데 사용되는 개념이다.값의 변경을 추적하고, 값이 변경될 때마다 관련 UI를 자동으로 다시 구성 하는데 사용되는데라이브 데이터나, Flow가 있는데 굳이 이게
이번엔 단위 테스트에 대해 다뤄보려구 한다.앱을 만들때 우리는 수 많은 문제들을 생각하고 로직이 잘 작동하는지 확인해야한다.기존에 앱을 만들고 중간중간 확인을 하게 되면 시간도 오래걸리고 여러번 반복해서 확인하기 힘들기 때문에 테스트를 한다.테스트는 테스트의 대상범위나
이전엔 DI로 Hilt를 사용했었는데, 좀 더 심화해서 Dagger2를 파보려구 한다.Hilt는 Dagger2를 쉽게 사용하기 위해 만들어진 것이기 때문에, 다양성과 성능면에서 Dagger가 더 앞서고 Hilt는 에러가 생긴 경험이 많다는 얘기를 듣고 Dagger2를
오늘은 최종 프로젝트가 정해진 날이다. 최종 프로젝트이기에 프로젝트 기간을 넓게 잡아서 이전보다 좀 더 자세하고 체계적으로 진행했던 것같다. 기획을 하면서 찾아봐야한다는게 많이 느껴져 정리해두려고 한다. 1. 브레인 스토밍 너무나도 중요하고 기본적인 방식인 브레
요즘 취업 시장에선 개발자에게 UI/UX에 대한 이해도를 묻는다고 한다. 그쪽은 디자이너의 영역아닌가? 싶지만 UI/UX에 대한 이해가 있다면 현업에서 디자이너와의 원활한 소통과, 디자이너의 의도 파악하고 기술적 제약사항을 전달하며 타협점을 찾을 수 있을 것 이다.
지난 시간에 이어UI/UX에 대한 모바일 가이드라인을 정리해 보려구 한다.입력한 비밀번호는 기본적으로 (....) 형태로 가려져 있어야 한다. 모바일에서는 작은 키보드로 인해 오타가 빈번히 발생하니 입력한 비밀번호를 볼 수 있는 옵션을 토글 형태로 제공해준다.근접성의
팀원들과 만든 와이어 프레임을 만들고 계속 시뮬 레이션 하며앱의 오류가 있나 찾아봤다.그러다가 워크플로우에 대해 알게 되었는데팀프로젝트를 할때 유용한 과정이라 생각하게 되어 정리해 보게 되었다.워크플로는 적절한 시기에 알맞은 담당자를 정확한 데이터로 연결하여 팀이 목
프로젝트를 기획했는데, 서버가 필요하다.팀프로젝트를 원하는 인원들끼리 매칭하고, 팀 결성을 도와주는 앱을 만들건데게시물 작성, 유저 정보등 데이터를 저장해야한다.그런데 팀에 백엔드 개발자가 없고 전부 안드로이드 개발자 밖에 없다.그러면 서버를 어떻게 해결 할까?안드로이
지난 시간에 로그인 기능에 이어 이번엔 중요한 게시물, 유저 등의 데이터를 파이어 베이스에 저장할 것이다.파이어 베이스에서 데이터를 저장할땐 Realtime Database와, Firestore를 사용한다.그럼 둘의 차이가 뭐고, 게시물 데이터, 유저 데이터 등은 어떤
이번시간엔 RealTimeDataBase를 이용해서 채팅기능을 만들어볼 예정이다.데이터를 json으로 저장하고 모든클라이언트에게 실시간으로 데이터 변경사항을 자동으로 동기화해주기 때문에 채팅기능을 구현 할 수 있다.채팅을 어떻게 구현할까.채팅 방을 만들고 그안에 메세지
Proguard는 Java 바이트코드를 최적화, 난독화, 축소하는 데 사용되는 도구다.앱 개발에서 주로 앱의 APK 크기를 줄이고, 리버스 엔지니어링을 어렵게 해 앱의 소스 코드를 보호하는데 사용된다.제공하는 기능은클래스, 필드, 메서드의 이름을 짧고 의미 없는 이름으
이번 프로젝트에서 로그인 회원가입 페이지를 맡게 되었는데,에딧텍스트를 꾸밀때 TextInputLayout이라는게 있었다.에딧 텍스트를 커스텀 할까 하다가 지원해주는 것도 많고 내가 구현 하려고 한 모양과 유사하게 만들 수 있어서 TextInputLayout을 사용하게
메세지 보냈는데, 알림이 떠야 상대방이 알것이다.파이어베이스에선 FCM을 지원해 알림을 보낼수 있다.파이어베이스에서 알림 보내는 방법을 알아보자우선 gradle에서 FCM관련 의존성을 추가해줘야 한다.gradle.ktmanifest에서도 권한을 허용해주자AndroidM
파이어 베이스에 저장된 데이터를 검색해보자.검색 기능을 구현하고 있는데, 파이어베이스에선 라이크 쿼리를 지원해주지 않는다,,키워드 검색으로 얼추 만들어 볼 순있다.이렇게 구현하면 query가 포함된 문장으로 시작되는 title을 가진 데이터들을 가지고 올 수 가 있다.
다시 돌아온 UI/UX 정리시간이다.UI/UX를 알면 알수록 생각해야될게 많은 것 같다.뷰를 배치해도 계속 고민하고 이게 주로 어떻게 표현되지? 다른 사람들은 어떻게 사용하지? 하면서 리서치도 계속하게 되면서 시간도 많이들고다시 고치고 하지만 앱은 좀 더 완성도가 있어
지난번엔 서버에서 전체 사용자에게 알림을 보냈는데,실제 앱을 보면 전체 알림뿐만 아닌 개인적으로 오는 알림도 나온다.채팅을 보내면 상대방이 우선 채팅이 왔는지 알아야 할 것아닌가.그렇기 때문에 메세지등을 보내면서 알림 또한 같이 사용자에게 보내줄 필요가있다.사실 사용자
이전엔 앱 개발을 할때 JAVA를 사용해서 개발을 했다.어쩌다가 현재 주류가 Kotlin으로 변경되게 됬을까?안드로이드는 07년도 베타버전부터 시작된 17년이라는 역사를 가지고 있다.개발 초기에 사용된 주요 프로그래밍 언어는 Java였다.이후 계속 Java로 개발을 하
지난번에 FCM으로 알림을 보내는 기능을 만들었다.이번엔 알림 데이터로 알림창을 꾸며줄 거다.요즘 앱들을 보면 알림을 받을때 그냥 알림 하나만 있고 클릭시 바로이동 하는 경우 보다눌렀을때 확장되면서 상세한 내용을 보여주는 경우가 많다.그리고 카카오톡 같은 경우 메세지를
파이어 베이스는 데이터 베이스를 규칙으로 데이터를 읽고 쓰게 할 수 있다.이는 콘솔에서 설정하는데,RealTimeDataBase, FireStore, Storage등 데이터 베이스들에 설정을 한다.이런식으로 설정하면 모든 유저들이 채팅 방에 어떻게 접근을 하게되면 대화
프로그래머스 문제를 풀며 DFS나 BFS 개념을 요구하는 문제들이 있어 개념을 한 번 정확하게 짚고 넘어가야겠다 싶어 오늘은 DFS와 BFS에 대해 정리해보려고 한다.깊이 우선 탐색은 그래프의 한 경로를 끝까지 탐색 후 다음 경로를 탐색하는 방식의 알고리즘이다. 깊이에
함수형 프로그래밍이란 뭘까?함수형 프로그래밍은 프로그래머가 프로그래밍의 관점을 갖게 하고 코드를 어떻게 작성할지 결정할때 도움을 주는 프로그래밍 패러다임이다.우선 프로그래밍 패러다임을 알아보자.최근 프로그래밍의 패러다임은 크게 2개로 구별된다.명령형 프로그래밍: 어떻게
compose를 이용해서 간단한 BMI 계산기를 만들어 보자단순 구현보다 좀더 현업에서 쓰는 코드에 가깝게 만들어 보고자 노력했다.우선 화면은 입력 화면, 결과 화면으로 구성된다.우선 메인 액티비티에선 두 화면을 navigate할 컴포저블로 이동하자기존엔 MainAct
Compose에서 화면을 구성할때 컴포저블을 후행 람다로 구현을 많이 한다고 한다.컴포저블을 분리해서 관리하는데, 람다로 빼 놓으면 코드의 가독성이 더 좋아진다.간단한 체크 박스를 만들었다.content를 맨 아래로 빼 줘서 후행 람다로 구현할 수 있게 만든다.여기서
이번엔 로또 번호 생성기를 만들어 볼 예정이다.사용자는 번호를 선택할 수 있고, 버튼을 누르면 선택하지 않은 번호만큼 로또 번호를 랜덤으로 추천 해 준다.우선 번호를 선택할 넘버 피커를 만들어 보자.컴포즈에선 넘버 피커를 지원해주지 않는다.하지만 커스텀 해서 만들 수
오늘은 코루틴 스코프에 대해 정리 해보려 한다.코루틴 스코프는 코루틴이 언제 어디서 실행 될지, 그리고 어떻게 생명주기를 관리할지를 결정하는 데 사용된다.실행 범위와 생명주기를 제어하는건데, 다양한 종류의 스코프가 있다.애플리케이션의 생명주기와 연결되어 있다.코루틴은
callbackFlow는 callbackFlow는 코루틴의 Flow API를 사용해 콜백 기반의 비동기 패턴을 선언적인 스트림으로 변환할 수 있게 해주는 함수다.flow블록 내에서는 context를 하나만 사용할 수 있는데,flowOn을 통해 context를 바꾸어 줄
프로그래밍언어 개념소프트웨어 개발 절차를 알아야함.분석 -> 설계 -> 구현 -> 테스트 -> 유지보수컴퓨터가 이해하는 언어는 2진수임0,1 기계어 저급언어라고 함. 사람중심이 아닌 컴퓨터 중심C,JAVA,Python 사용자 중심의 고급언어, 영문자 중심Bit라고 불리
OkHttp, retrofit을 사용하면 안드로이드에서 Json파일을 직렬화 해서 사용해야한다.그럴때 컨버트 라이브러리로 주로 Gson을 사용했는데, 요즘 잘 안쓴다고 한다.20년도에 Jake Wharton이 말하길 개발자 3명중 2명은 Gson은 deprecate되었
사이드 이펙트 = 부수효과LaunchedEffect: 컴포저블의 범위에서 정지 함수 실행rememberCoroutineScope: 컴포지션 인식 범위를 확보해 컴포저블 외부에서 코루틴 실행 (코루틴 스코프를 만들고 유지하기 위해, 컴포지션 인식범위를 확대해서 컴포지션
Unidirectional Data Flow는 Jetpack Compose에서 사용되는 기본적인 아키텍처 패턴으로, 데이터가 단일 방향으로 흐르는 특징을 갖는다. 이 패턴은 상태와 이벤트의 단방향 흐름을 중심으로 구성되어 있다.주요 특징상태는 최상위 컴포저블에서 하위
AAC란,Android Architecture Components(AAC) 테스트와 유지보수를 위한 라이브러리 모음이다.MVVM의 VM과 이름이 유사한대, AAC ViewModel과 MVVM의 ViewModel은 다르다.MVVM에서 VM은 View와 Model 사이에서
\[Compose] 수명주기\[Compose]@Stable
일관성 있는 UI를 위한 Compose에서 theme관리하는 방법앱에 사용할 커스텀 컬러 data class 를 만들어준다.colorScheme을 지정해주고 사용하는 메소드들을 정의 해준다.이제 Light모드와 Dark모드를 구별해서 사용 할 수 있는 ColorSet를
코루틴 스코프를 사용할때, viewmodelScope, lifecycleScope등 생명주기에 따라가는 코루틴을 사용하기 위한 스코프 인것 외에 더 활용하는 방법을 모른다.이번에 Flow를 사용하며 코루틴 스코프에 대한 이해도를 키우고 비동기 처리를 더 확실하고 효율적
컴포즈로 프로젝트를 구현 하다 보면 CompositionLocalProvider를 쓸때가 있는데,생긴게 독특하다.X provides Y 이 부분이 평소에 보기 힘든 모습이라 그런지 코드를 들어가봤다.provides를 보면 infix fun으로 구현되어 있는데,prvid
Flow를 보기전에 동기에서 데이터 처리하는 것을 먼저 공부해둘 필요가 있다.리스트를 만들때 buildList 를 통해 리스트를 만들수 있는데,다음과 같이 구성하면 각요소들이 전부 계산이 완료된 후 forEach를 통해 출력한다.그래서 실행하고 시간을 보면 다 비슷한
Kotlin의 채널은 큐와 유사한 개념이다. 코루틴 간 데이터를 전송하고 수신하는 통신 수단을 제공한다.채널과 관련 있는 코루틴으로 Producer와 Consumer가 있다.생산자(Producer): 데이터를 채널에 보내는 코루틴소비자(Consumer): 채널에서 데이
Flow의 메소드를 더 알아보자flow에는 collectLatest라는게 있는데, 가장 최신화된 데이터만 받아오게 된다.이 함수를 실행하게 된다면collect내부에 작업이 수행중임에도 emit되는 순간 새로운 기존의 수행중인 로직을 무시하고 새로 포착된 로직을 수행한다
원활한 협업을 위해 CI/CD 파이프 라인을 사용해보자CI(Continuous Integration) 지속적인 통합CD(Continuous Deployment) 지속적인 배포배포를 할때 프로세스를 확인해보면 빌드> 테스트> 배포이렇게 3단계를 거친다.배포를 자주 해야한
LRU(Least Recently Used)는 가장 오랫동안 참조되지 않은 페이지를 교체하는 방식,사용된지 가장 오래된 페이지는 앞으로도 사용될 확률이 낮다는 가설에 의해 만들어진 알고리즘이다.이를 통해 불필요한 서버와 통신을 줄여, 사용성을 개선할 생각이다.캐시는 이