오늘부터 코딩 미라클 모닝을 시도 중이다. 아침에 한 시간 일찍 일어나서 코딩 테스트를 푸는데 시간을 할애하는 것이다. 처음이라 조금 피곤하긴 했지만 나쁘지 않은 것 같다. 회사가 끝나고 돌아와서는 안드로이드 공부와 사이드 프로젝트를 할 수 있는 여유를 만들어 둘 생각이다. 오늘은 고로 한문제밖에 풀지 못하였다. 4344 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.Locale; import java.util.StringTokenizer; public class Test4344 { public static vo..
새벽에 삘이 꽂혀 풀은 3문 제이다. 내일부터는 아침 6시 30분에 일어나서 코딩 테스트를 풀려고 한다. 저녁에는 사이드 프로젝트나, 안드로이드 강의를 들을 시간을 남겨두어야 할 것 같다. 3052 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.HashSet; import java.util.Set; public class Test3052 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(S..
오늘은 어머님 생신 기념으로 복어를 먹으러 간다. 난생처음으로 먹는 복어라서 설레는 마음이 가득하다. 복어 먹으러 가기 전에 여자 친구와 스터디 카페에 와서 공부 중이다. 오늘 문제는 조금 고전했다. int [] 배열과 Integer [] 배열에 적용되는 메서드가 달라서 애를 먹었기 때문이다. 문제 풀이를 보자. 2562 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Arrays; import java.util.stream.IntStream; public class Main { public static void main(String[] args) throw..
어제 반복문 과제의 마지막 문제인 "더하기 사이클"을 풀다가, 아무리 풀어도 시간 초과가 되어 푸는데 어려움 겪었다. 풀이는 다음과 같다. 1110 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.io.BufferedWriter; public class Main { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); Bu..
오늘 정말 수난시대였다. 물론 내가 릴리즈를 제대로 실행시켜 보지 못하고, (그 전날에 테스트해서 괜찮을 줄 알음) 그대로 올린 것이다.. 결과는.. 로그인이 되지 않는 대형사고를 쳐버린 것이다. 서둘러 아침부터 원인을 찾아 나섰다. 우선 어젯밤 내가 aab 파일이 180mb가 넘어서 구글 플레이 콘솔 정책상 150mb가 넘으면 안 된다는 규칙 때문에, 올리지 못하게 된 것이다. 그래서 다음과 같이 릴리즈 버전에 설정을 달리 하였다. 바로 이 shrinkResources와 minifyEnabled 속성을 true로 바꾸어 주는 것이다. shrinkResources는 드로어블 파일을 전체적으로 축소시켜 주어, 앱의 사이즈를 줄여 주는 역할을 하고, minifyEnabled은 코드를 난독 처리하여, 보안 강..
앱을 배포하는데 이슈가 생겼다. 이 이슈에 대해선 글을 하나 더 써야겠다. 오늘은 3문제를 풀었는데, 한 문제는 백준이 중간에 서버가 이상하여 풀다 말았다. 내일 올려야겠다. 오늘은 두 문제를 풀었다. 10951 import java.util.StringTokenizer; import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in))..
오늘은 여자 친구와 벚꽃을 보러 갔다 왔다. 아침에 조기축구까지 해서 너무 피곤하다.. 하지만 한 문제라도 풀자.. 10871 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.i..
오늘은 채팀장님과 술을 마시고 와서, 시간이 늦어 하나만 풀어보았다. StringBuilder에 익숙해지고 있다. append와 replace에 익숙해지자. https://github.com/qjsqjsaos/CodingTest GitHub - qjsqjsaos/CodingTest: 하루에 하나씩 목표로 하는 코딩테스트 하루에 하나씩 목표로 하는 코딩테스트. Contribute to qjsqjsaos/CodingTest development by creating an account on GitHub. github.com 2439 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public..
오늘은 3문제를 풀었다. 문제를 풀다가 String과 StringBuffer와 StringBulider의 차이점에 대해서 검색해보았다. String 같은 경우는 하나의 메모리 주소를 가지고 있기 때문에 값이 변하지 않는 immutable 성격을 가지고 있다. 그런데 이 String의 문자열을 붙이면, 기존의 있던 String의 주소가 힙 메모리에 임시로 저장되게 되어, 성능 저하로 이어진다. 이러한 문제를 해결하기 위해 두 가지 해결방안이 제시된다. StringBuffer와 StringBuilder이다. 이 둘 중 어느 것을 써도 상관은 없다. 하지만, 코드 양이 많아지고, 문자열 연산이 많아지면, 두 개중에서 적절한 것을 사용해야 한다. StringBuffer 같은 경우는 동기화를 고려하고, 멀티 스레..
오늘 부터 풀은 문제를 깃헙에 정리해서 올리려고 한다. https://github.com/qjsqjsaos/CodingTest GitHub - qjsqjsaos/CodingTest: 하루에 하나씩 목표로 하는 코딩테스트 하루에 하나씩 목표로 하는 코딩테스트. Contribute to qjsqjsaos/CodingTest development by creating an account on GitHub. github.com 2741 import java.io.*; public class Main { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamRead..
아고.. 이번 주가 앱 배포라 바쁘다. 최근에 사이드 프로젝트에도 참여하려고 했으나.. 여유가 없으니./ 우선 코딩테스트를 더 적응하고 나서 해도 늦지 않을 것 같다. (아니면 병행을 해도..) 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..