아고.. 이번 주가 앱 배포라 바쁘다. 최근에 사이드 프로젝트에도 참여하려고 했으나.. 여유가 없으니./ 우선 코딩테스트를 더 적응하고 나서 해도 늦지 않을 것 같다. (아니면 병행을 해도..) 8393 이 문제는 전 문제와 비슷하여 쉽게 풀었다. import java.io.*; class Main { public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int value = Integer.parseInt(bf.readLine()); int result = 0; for(int i = 1; i
오늘 우리나라와 UAE와 축구가 하는 날이다.. 쉽더라도 두 문제만 풀고 어서 축구를 보려고 한다. 두문제 모두 Stream과 StringTokenizer를 이용하여 쉽게 해결하였다. 2739 import java.io.InputStreamReader; import java.io.BufferedReader; import java.io.IOException; import java.util.StringTokenizer; class Main { public static void main(String[] args) throws IOException{ BufferedReader bf = new BufferedReader(new InputStreamReader(System.in)); int num = Integer..
오늘 풀어본 코딩 테스트는 백준 "주사위 세 개"라는 문제였다. 코딩 테스트를 진행할 때 나는 문제 푸는 것에만 즉, 정답을 맞히는 것만 집중을 하다가 오늘은 명확하게 잘 알 수 있게 코드를 정리하면서 쓰는 것에 집중하여 작성하였다. 코드 스타일에 대해서 좀 더 신경을 써보자. 3개의 주사위가 모두 같을 때를 구분하기 위해 불리언 값으로 미리 나누어 두었는데, 마지막에 if를 세 개를 써서 사용하니, 예외 처리를 하지 못해 답이 올바르게 나옴에도, 틀렸습니다가 나왔다. 되도록이면 if if else else 문으로 사용을 해야겠다. import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; impo..
바쁘다 바뻐... 회사일도, 코딩 테스트도 준비하다보니, 글을 많이 쓰지 못했다. 거의 한달만에 글을 쓰는 것 같다. 이제 매일매일 하루에 하나 이상 코딩 테스트를 풀고 기록하려고 한다. 다음은 내가 푼 백준 오븐시계 이다. import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; import java.util.StringTokenizer; import java.lang.Math; public class Main{ public static void main(String[] args) throws IOException { BufferedReader bf = new BufferedReader(new ..
너무 오랜만에 글을 써서 어색하다. 요 며칠 동안 코딩 테스트, 스마트 스토어 준비, 회사 앱 개발, 마블 정주행 등등.. 아무쪼록 빈틈없는 바쁜 날들을 보내고 있다. 오늘은 카카오톡 로그인 기능을 구현하고, 디버그와 릴리즈 해시 키를 등록하였음에도 불구하고, KakaoTalk is installed but not connected to Kakao account. 같은 오류가 뜨는 이유를 알아보자. 위에 영어 뜻은 카카오톡은 설치되엇지만, 카카오 계정이 연결되지 않았다는 뜻이다. 말 뜻 그대로, 카카오톡은 설치했지만, 카카오톡 로그인을 하지 않았다는 뜻이다. 이에 대한 예외 처리를 해주면 된다. 다음 코드를 보자. public void signInKakao(Context context) { this.co..
오늘은 간단히 터미널로 private 되어 있는 깃 레포지터리를 가져오는 방법을 알아보겠다. git clone https://[git userName]:[git password or git token]@github.com/[repositary path] 정말 간단하다 터미널에 다음과 같이 입력한다. git userName은 이 녀석이고, git password or git token에다가는 깃 비밀번호나 토큰 값을 넣어주면 된다. 나 같은 경우는 토큰을 넣었다. 그리고 repositart path에다가는 깃 주소를 넣어준다. 이 드래그 친 부분을 넣어주면 된다. 이런식으로 넣어주면 된다.
안드로이드 레트로핏을 연동 rxJava2를 통해 스트림으로 서버를 호출하였다. 그런데 하루 종일 다음과 같은 오류가 계속 떴다. Unable to create call adapter for io.reactivex.Observable for method LeaveOutApi.postLeaveOutUser 호출하는 어뎁터를 만들 수 없다는 뜻인 것 같은데, 해결법을 찾아보니, .addCallAdapterFactory(RxJava2CallAdapterFactory.create()) 레트로핏 빌더에다가 다음과 같은 AdapterFactory를 추가해주라는 것이었다. 하지만 이미 난 레트로핏에다가 추가를 해주었다. 그렇다면 무엇이 문제일까? 문제는 이것이었다. REST를 호출하는 인터페이스 부분에서 Observa..
요즘 일찍 일찍 자는 중이다. 취미도 잘 즐기고 있고, 코딩도 즐겁게 하고 있다. 12시에 자야 하고, 배운 것도 써야 하니, 오늘 배웠던 것은 크립토 라이브러리이다. https://developer.android.com/guide/topics/security/cryptography?hl=ko 암호화 | Android 개발자 | Android Developers Android의 암호화 기능을 알아보세요. developer.android.com 자세한 정보는 이 곳에서 볼 수 있다. 암호화는 보통 로그인을 할 때 아이디나 비밀번호 등 보안을 위한 값들(키 스토어 라이브러리 사용을 하는 경우이지만 여기서는 암호화)을 보통 암호화를 해주고 서버에 보내주곤 한다. 보통 크게 암호화에는 두 가지가 있다. 대칭 암..
이 글은 간단한 인터페이스에 대한 예제만을 보여드립니다. 깊게는 들어가지 못하는 제 게으름과 실력을 탓합니다. flutter만 하다가 자바로 넘어온 지 어언 2주가 넘어간다. 문득 궁금한 기능이 생겼는데, 바로 A라는 액티비티에 있는 메서드를 내가 B액티비티 혹은 프래그먼트에 있을 때, 실행시키고 싶다면 어떻게 해야 할까? flutter에 경우는 생성자로 Function을 넘겨주어 그 function을 실행하면, 생성자를 넘겨준 쪽에서 이 함수가 실행이 되었다. 그렇다면 자바에서 어떻게 할까? 바로 인터페이스다. 나도 항상 이 인터페이스를 그날그날 이해하면서도, 잘 모르고 넘긴 경우가 있다. 사실은 아직도 잘 모르지만, 이번에 내가 위와 같은 상황에서 인터페이스를 활용하는 법을 기록하기 위해 적어둔다. ..
간혹 이런 일이 있는 듯하다. 나 또한, 회사에서 디바이스별로 대응하기 위해서도 있지만, 일반적인 디바이스와 태블릿 디바이스로 크게 나누었을 때, 일반적인 디바이스에서 크기를 고정해서 앱을 출시하는 쪽으로 가는 경우 말이다. 그런 경우 때문에 회사에 요구대로 기존 텍스트를 sp로 사용했던 것을 dp로 변환하는 작업을 하게 되었다. 하지만, 이미 만들어진 앱은 모든 text가 sp로 되어 있었다. 나는 그래서 답을 찾았다. sp로 되어 있어도, 모든 앱을 sp 자체를 고정시킨 값으로 디바이스에 적용시킬 수 있다. 바로 다음 코드이다. @Override protected void attachBaseContext(Context newBase) { final Configuration override = new ..
현재 회사의 앱에서 영어와 한국어, 이렇게 두 글로벌 언어를 두고, 기기에서 언어에 맞게 대응하고 있다. 그러다가, 자바 코드에서 언어뿐만 아니라, 해당 언어에 따라, ui나 메서드를 달리하고 싶은 일이 생겼다. 그렇게 해서 알아낸 코드가 이것이다. Locale mSysLocale = getResources().getConfiguration().locale; String strLanguage = mSysLocale.getLanguage(); 다음 코드를 사용하면, 현재 디바이스에 설정되어 있는 언어 코드가 String에 담긴다. 메서드를 만들어 예를 들면 public class MainActivity extends AppCompatActivity { @Override protected void onCre..
하 정말 감격스러운 순간이다. 앱 개발자를 시작한 이례로 딱 두 번 앱을 출시했다. 첫 번째 앱은 "그만 : 금연 다이어리" 앱이다. 취업을 위한 첫 포트폴리오를 위해 만들었던 앱으로, 정말 한 땀 한 땀 정성스레 만들어 4개월 만에 만들었다. 지금 만들라고 하면, 한 달이면 가능할 것 같다... 하지만 그 앱은 망했다.. 멋진 추억이지만, 사용자수도 10명 안팎이었고, 서버 비용도 들어서.. 그냥 추억은 추억으로 묻어두고 싶어, 앱을 플레이스토어에서 내렸다. 그렇게 시간을 흘러 나는 앱 개발자로서 직장을 다니던 무렵, 요소수 대란이 찾아오게 되었다는 소식을 화물을 하시던 아버지께 들었다. 뭔가 좋은 방법이 없을까 생각하던 중에 혹시나 하고 공공데이터 포털 사이트로 들어가게 된다. 그곳에는 무료로 국가에..
요소수 앱이 벌써 다운로드 100회를 돌파했다!! 아 지금은 이 얘기보다는 새로운 회사에 들어가 내가 모르고 커밋을 실수로 하는 바람에 쓸데없는 커밋이 깃허브로 푸시되었다. 자 간단하게 지우는 법을 알아보자. 우선 커밋 내역을 확인하자 터미널에 다음과 같이 입력한다. (Android Studio 터미널이나 맥 터미널 윈도는 명령 프롬프트) git log 커밋 내역을 확인하는 기능인데, 사실 이 기능은 어떤 커밋이 있나 확인만 하는 거라 굳이 안 해도 된다. git reset HEAD^ 이렇게 입력하면 최근 커밋이 하나 사라진다. 아쉽게도 내가 어떤 특정 커밋을 지우는 법은 잘 모르지만, 순차적으로 최신 것부터 차례대로 지우는 법만 알고 있다. 만약 여러 개를 지우고 싶다면 git reset HEAD~n ..
이 글은 잭 코딩님의 글을 참조했습니다. https://jackjeong.tistory.com/100 [Java] Shallow copy(얕은 복사) vs Deep copy(깊은 복사) 안녕하세요~ 잭코딩입니다! 이번 내용에서는 Shallow copy(얕은 복사)와 Deep copy(깊은복사)를 살펴봅시다 코드를 짜다보면 객체를 복사해야할 경우가 생깁니다 이 때 실수로 복사를 잘못하면 큰 이 jackjeong.tistory.com 코딩 중에 갑자기 문득 궁금한 게 생겼었다. 나 같은 경우는 리사이클러뷰 어뎁터를 사용하다가 검색창 기능을 만들기 위해 같은 ArrayList를 두개 만들어주고, 똑같은 값을 이런 식으로 넣어 주었다. 그런데 이렇게 값을 넣어주는데, 검색을 해도 아이템이 나오지 않았다. 구글링..
2021.11.26 - [Programing/Android Studio With Java] - Android Studio/ Java Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 오류 해결하기 TIL # 71 Android Studio/ Java Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 오류 해결 안드로이드 스튜디오에서 자바로 main를 두고 어느 때와 다름없이 RunTime 버튼을 눌렀는데 다음과 같은 오류가 떴다. Deprecated Gradle features ..
안드로이드 스튜디오에서 자바로 main를 두고 어느 때와 다름없이 RunTime 버튼을 눌렀는데 다음과 같은 오류가 떴다. Deprecated Gradle features were used in this build, making it incompatible with Gradle 8.0. 빌드 시에 deprecated 된 기능들이 있어서 현재의 gradle과 호환이 맞지 않다는 이야기이다. 그 아래에 --warning mode all을 사용하라고 명시까지 해주었다. 그렇다면, 이 녀석을 어디서 사용할까? 맥은 preferences로 윈도는 settings로 가게 되면, Build, Execution, Deployment -> Compiler를 들어가면, Command-line Options 입력창에 --w..
최근 sdk 버전 31까지 나와 이러한 오류가 뜬 것 같다. The minCompileSdk (31) specified in a dependency’s AAR metadata is greater than this module’s compileSdkVersion 이 말인즉슨, 현재 사용되는 라이브러리 패키지들의 최소 sdk 버전이 이 앱의 compileSdkVersion 보다 크다고 한다. 그러면 우리는 compileSdkVersion을 31로 바꾸어 주면 된다. android { compileSdkVersion 31 //
개발 공부도 좋지만, 역시 성공을 하려면 돈을 벌고, 그 돈을 어떻게 쓰는지가 중요하다고 생각한다. 돈은 유동적이야 그 가치가 생긴다고 생각한다. 돈을 벌고 투자를 하는 법을 알아보자. 그래서 시작한게, 주식 책을 산 것이다. 주식 책을 하루에 30분정도라도 보면서 이렇게 배운 것을 정리하려고 한다. 지금은 초반이니까 그냥 무지성으로 필기했던 것을 쓰려고 한다. 이렇게 하는 게 맞겠지.. 하하 참고 책 : 왕초보 주식 투자 시크릿 (박동우) 2011년 1월 주식 투자자는 460만명에 달한다. 시가총액은 1300조 원에 이른다. 2010년 7월에는 외국인 투자자가 3만명을 돌파했다. 1년 동안 돈을 가장 많이 번 수단이 부동산 다음으로 주식이 높았다. 주식은 기본에 충실해야 한다. 남들이 많이 사는 종목이..
로딩 창을 간단히 띄우는 법에 대해 소개하려고 한다. 우선 로딩 창 화면을 만들기 위해 SplashActivity라는 이름으로 EmptyActivity를 하나 만들어 주자. 현재 나는 뷰바인딩을 같이 쓰고 있는 상태이다. public class SplashActivity extends AppCompatActivity { ActivitySplashBinding binding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); binding = ActivitySplashBinding.inflate(getLayoutInflater()); setContentView(binding.get..
네이티브로 돌아온 느낌은 꽤나 신선하다. 오늘은 현직에서도 자주 사용되고 있는 Retrofit을 다루려고 한다. 보통 서버 api 통신을 할 때 편리하고 간단하게 사용될 수 있는 라이브러리로써 많은 사람들에게 사랑받고 있는 라이브러리라고 할 수 있다. 그렇다면 한 번 예제를 봐보자. 사용법 dependencies { //retrofit2 implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' } 우선 이 두 종속성을 build.gradle(:app)에 추가를 해주는 것으로 시작합니다. 최신 버전이 있다면 버전을 올려주세요! 여기서 잠깐 알고 갈 것!! g..
앱 출시일 현재 앱 검토 중이니 느리면 1주일에서 2주일 정도 소요될 것 같습니다ㅠㅠ 빠르면 4일 안에 검토 완료되고 배포 될 것 같습니다. 앱을 만들게 된 계기 시작은 요소수 대란이 일어나고, 운수업을 하시던 아버지께서 부족해진 요소수로 인해, 물량이 있고, 싼 가격에 거점 주유소를 찾기가 힘들어졌고, 화물 운수를 종사하시는 분들이 단톡방을 만들어서 서로 공유를 주고받고 있으시다는 걸 알게 되었다. 그 와중에 나 또한 플러터 회사에서 네이티브로 옮기게 되면서, 한 번 엄청난 기능은 아니지만, 오랜만에 네이티브도 경험할 겸, 도움도 될 겸, 저 데이터들을 편하게 볼 수 있는, 굳이 정부 데이터 사이트 들어가서 정보를 가져오는 번거로움을 줄이고자, 앱을 만들자고 생각이 들었다. 그래서 부리나케 앱을 만들었..
지금 회사에서 플러터를 거의 마무리하면서, 내가 토이 프로젝트를 하지 않는 이상 이제 플러터와는 살짝 멀어지면서, 네이티브에 더 집중할 것으로 예상이 된다. 오늘은 이전 글이었던, 2021.10.04 - [Programing/Android Studio With Kotlin] - flutter/dart /JSON과 직렬화 api 서버통신 자동으로 만들기 / retrofit, dio, retrofit_generator, build_runner, json_serializable /TIL # 64 flutter/dart /JSON과 직렬화 api 서버통신 자동으로 만들기 / retrofit, dio, retrofit_generator, build_runner, json_ 오늘은 api 서버통신에 대한 글을 작성..
예전에 봐둔 내용이지만 유용할 수 있어서 정리 해본다. 맥북을 이용하면서 플러터를 사용하다보니 App Store에서 Xcode를 업데이트하라는 메세지를 받게 되어 업데이트를 진행하였다. 그런데... 무슨 3시간이 지나도 끝 지점에서 그대로 있는 것이다.. 구글링을 해보니 8시간 기다려도 그대로인 사람도 있다고 하더라. 앱 스토어 리뷰를 보니, 엑스코드 자체가 설치가 굉장히 느린 듯하다. 다른 사람들도 비슷한 피해를 입은 듯하다. 빠르게 설치하는 해결법은 다음과 같다. 해결법 차리리 이렇게 업데이트하는 것보다 삭제하고 다시 설치하는게 더 빠르다는 의견을 보았다. 그러나, 앱스토어에서 다운을 받으면 안된다. (이상하게 앱스토어에서 다운을 받으면 느렸다.) http://developer.apple.com/do..
여느 떄와 같이 플러터 작업을 하던 중에 저런 오류가 떴다. 일시적인 오류로 디바이스를 찾지 못하는 이유인 것 같아서, 구글링을 해보니 해결법은 생각보다 간단했다. 아이폰 시뮬레이터에 경우에는 기존 바탕화면에 설치되었던 앱을 삭제하고, usb 포트를 뽑고 다시 연결 후 앱을 빌드하면 정상 빌드가 되고, 안드로이드 같은 경우는 Tools -> AVD Manager로 들어가 해당 안드로이드 기기를 Wipe Data(데이터 초기화) 해주고, 다시 재빌드를 해보면 정상 작동하는 것을 알 수 있다. 끝!
코딩을 하다 보면 배우고 싶거나 모르는 라이브러리에 대한 소스코드를 찾아다니게 된다. 나 같은 경우는 githup에서 소스코드를 찾는 경우가 있는데, 깃 헙 홈페이지에서 소스를 참고하면서 라이브러리 예제를 보면서 적용을 할 수가 있다. 혹은 예제 소스를 그대로 다운을 받아 우리가 빌드를 해보려고 시도하는 경우가 있는데, 아주 자주자주 이 오류와 마주치게 된다. could not resolve com.android.tools.build:gradle:x.x.x. could not resolve all files for configuration ':classpath'. No cached version of com.android.tools.build:gradle:4.0.0 available for offline..
오늘은 api 서버통신에 대한 글을 작성하려 한다. 참고 자료는 코딩 팩토리님의 영상과 아래 공식 문서를 참고했다. https://flutter-ko.dev/docs/development/data-and-backend/json JSON과 직렬화 어느 시점부터 웹 서버와 통신하지 않거나 구조화된 데이터를 적절하게 보관하지 않는 모바일 앱을생각하기 어려워졌습니다. 네트워크와 연결된 앱을 제작할 때, 결국에는 제법 괜찮은 JSON을사 flutter-ko.dev 우선 이 직렬화를 자동으로 쓰지 않으면 생길 수 있는 문제점에 대해서 설명하겠다. 보통 우리가 서버에서 api를 통해 json 데이터를 받아오는데, 모델 클래스를 만들어 받는 경우가 흔하다. class User { final String name; fi..
오늘 벌써 글만 3개째이다. 공부량이 많은 만큼 좋다고 생각한다. 오늘도 역시 깡샘의 안드로이드를 출처로 한다. 오늘 배울 것은 코틀린의 컬렉션 타입이다. Array - 배열 표현 코틀린의 배열은 Array라고 표현하며, 첫 번째 매개변수는 배열의 크기를 지정하며, 두 번째 매개변수는 초기값을 지정하는 함수이다. (size: Int, init: (int) -> T) 예를 들어 이렇게 선언할 수 있다. val data: Array = Array(3, { 0 }) 배열의 데이터에 접근할 때는 대괄호([])나 set(), get() 함수로 값을 넣어주거나 가져올 수 있다. fun main() { val data1: Array = Array(3, { 0 }) data1[0] = 10 data1[1] = 20 d..
예전에도 이와 비슷한 글을 올린 적이 있다. 2021.07.27 - [Programing/Android Studio With Flutter(Dart)] - Flutter/Dart 리스트 슬라이드 로딩 구현 SmartRefresher 사용법 / Refresh 새로고침 구현 하기 TIL # 47 Flutter/Dart 리스트 슬라이드 로딩 구현 SmartRefresher 사용법 / Refresh 새로고침 구현 하기 TIL # 47 요즘 뜻대로 코드가 잘 짜여서 기분이 좋다. 오늘은 회사앱에도 적용 SmartRefresher이라는 패키지에 대해서 소개해 볼까 한다. https://pub.dev/packages/pull_to_refresh/install pull_to_refresh | Flutter Pa.. d..
이 글은 코딩 팩토리님의 equatable 강의를 바탕으로 참고했습니다. 이제 회사에서 새로운 앱을 만들기 앞서, 필요한 플러터 지식을 쌓기 위해 고전해야겠다고 생각이 들어 필요할 것 같은 플러그인을 찾고 있는 중이다. 그중에 Formz라는 로그인 기능 구현 시 유용한 플러그인을 발견하게 되었는데, 같이 사용할 수 있는 Equatable이라는 플러그인을 알게 되었다. Formz를 배우기 앞서 Equatable에 대한 개념을 잡고 가고자 한다. 객체의 인스턴스 우선 인스턴스에 대해 알아볼 필요가 있다. 객체의 인스턴스에 대한 개념은 지난 싱글톤 글에 대해서 설명한 적이 있다. 2021.07.11 - [Programing/Android Studio With Flutter(Dart)] - flutter/Dar..
내 블로그 - 관리자 홈 전환 |
Q
Q
|
---|---|
새 글 쓰기 |
W
W
|
글 수정 (권한 있는 경우) |
E
E
|
---|---|
댓글 영역으로 이동 |
C
C
|
이 페이지의 URL 복사 |
S
S
|
---|---|
맨 위로 이동 |
T
T
|
티스토리 홈 이동 |
H
H
|
단축키 안내 |
Shift + /
⇧ + /
|
* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.