본문 바로가기

전체 글56

RecyclerView의 ViewHolder가 wrap_content만 적용될 때 분명 RecyclerView도 math_parent, ViewHolder의 xml도 math_parent로 만들었는데, 빌드해보면 ViewHolder가 자꾸 wrap_content로 적용되는 이슈가 있었다. LayoutInspector를 돌려봐도 wrap_content로 나온다. width 값을 고정 dp로 줘봐도 여전히 똑같고 이래저래 할 수 있는건 다 해봤는데 달라지지 않아서 혹시 ViewHolder를 Inflate할 때 주는 옵션같은게 있나? 해서 찾아보았더니, LayoutInflater를 잘못 쓰고 있었다. 공식 문서에서 가져온 LayoutInflater의 inflate 함수이다. 설명은 간단하게 인자값으로 넣은 xml으로 새로운 뷰 계층을 만들어준다. 인자값은 resource, root, att.. 2020. 12. 19.
Kotlin Coroutine 101 영상 번역 및 요약 youtu.be/ZTDXo0-SKuU Coroutine은 어떤 문제들을 해결할 수 있는가? - 안드로이드 비동기 프로그래밍을 단순화 함. 우리가 비동기 프로그래밍을 말할 때는 동기적 프로그래밍 방식을 빼놓을 수 없다. 동기적 프로그래밍 방식으로 네트워크 콜을 메인 쓰레드에서 진행하면 onDraw() 메소드가 블럭되어서 유저는 UI Freezing 현상을 겪게 될 것. 이러한 네트워크 콜을 어떻게 메인 스레드를 블럭하지 않고 비동기적으로 만들 수 있을까? 답은 콜백 방식이 있을 수 있다. (Retrofit의 enqueue) 콜백의 경우, 네트워크 콜을 다른 쓰레드에서 돌릴 수 있게 되어 메인 쓰레드를 블럭하지 않으므로 onDraw()가 잘 호출이 되고, 호출이 끝나면 콜백 함수에서 람다 구문을 실행시켜 U.. 2020. 11. 26.
코틀린이란 코틀린 vs 자바 간결한 문법 세미콜론을 넣지 않아도 된다. 객체를 생성할 때 new 키워들르 사용하지 않는다. 타입 추론을 지원하므로 일반적인 경우 타입을 명시하지 않아도 된다. //타입을 항상 명시해 주어야 한다. String name = "KnowRe"; //객체 생성 시 new키워드를 사용합니다. Person person = new Person(name); //타입을 적지 않아도 타입 추론을 통해 String 타입으로 지정합니다. val name = "KnowRe" //객체 생성 시 new 키워드를 사용하지 않는다! val person = Person(name) 널 안정성(Null Safety) 자바에서는 객체가 null을 허용하는지의 여부를 따로 구분하지 않는다. 코틀린에서는 컴파일 단계에서 객.. 2019. 7. 23.
익명 클래스(Anonymous Class) 정의 InnerClass의 한 종류로 이름이 없는 객체를 만들 수 있다. 익명 클래스를 사용하는 가장 큰 목적은 부모 클래스를 상속받는 서브 클래스를 생성하지 않고도, 단일 객체를 만들어서 부모 클래스에 정의된 동작에서 행위를 추가할 수 있다는 것이다. 익명 클래스는 그래픽 프로그래밍을 할 때 리스너 인터페이스를 만들 때 유용하다. 익명 클래스는 클래스와 인터페이스로부터 만들 수 있다. 익명 클래스를 사용하지 않은 예제 interface Age { int age = 29; void getAge(); } class MyClass implements Age { @Override public void getAge() { System.out.print("Age is "+age); } } class Anonymo.. 2019. 7. 21.
실력이 부족한 주니어 개발자의 이직기(2) 1편을 작년 11월에 썼었고, 열심히 이직 준비를 해서 2019년 3월 중순 경 좋은 회사에 오퍼를 받게 되었다. 1.1편에서도 썼듯이, 나는 성장에 대한 갈증이 좀 심한편이었는데 이유는 -개발 경력을 쌓은지 2년이 다 되어가는 시점에서 스스로의 개발 실력에 대해 확신이 없는 점. -주변 선후배나 동기들은 하루가 다르게 성장하는 모습, 실제 서비스 및 프로덕트를 출시하고 발전시키는 모습에 조급함을 느낌. -좋은 개발 문화가 있는 회사와 대척점에 있었던 회사의 모습 등 대부분 주니어 레벨의 개발자가 느끼는 갈증과 크게 다르지는 않았다. 사실 이러한 문제는 꼭 이직이 아니더라도 외부 개발 커뮤니티나, 팀을 이뤄 토이 프로젝트를 하는 개발 모임에서 일부는 해결할 수는 있을지 몰라도, 무엇보다 하루에 8시간 이.. 2019. 5. 27.
굿피플 우리집 티비에서 처음으로 결제까지 해서 본 프로그램이다. 1. 여덟명 중에서 단 2~3명만이 선택이 되는건 사실 채용시장에서 당연한거고 나도 겪어봤지만. 그럼에도 선택받지 못한 이들이 벌써부터 안타까운 마음이 든다. 근데 다시 생각해보면, 저 여덟명에 뽑힌것만으로도 다른 변호사들과는 다른 출발점 일수도 있겠다 싶다. 인맥부터 시작해서 억만금을 주고도 배울 수 없는 현장 경험들이니.. 모두가 원하는 결과를 얻어갔으면 좋겠다. 2. '이시훈 인턴'이 유독 눈에 띈다. 외모도 곱상하니 이름도 비슷한 이제훈을 닮은 감도 있는데 뭐랄까, 철저하게 본인만의 룰을 고수하며 살아온 완벽주의자 느낌이다. 사실 첫번째 과제 때 무려 한시간 가까이 시간을 넘겨서 제출하는걸 보면서 얼마 안가서 떨어지겠구나 생각했는데.. 나에.. 2019. 5. 9.
지식의 중요성 여러차례 기술면접을 보면서 깨달은것은 회사들은 대개 신입(경력직도 아마 어느정도 알겠거니 하고 넘어가는듯)에게 물어보는 질문을 보면 해당 기술의 원리와 발전하는 역사 위주로 물어본다. 나는 안드로이드 분야로 주로 지원을 했었는데, 물어봄직한 질문은 GET방식으로 통신할 때 실제 네트워크 상에서는 어떤일이 일어나는지, .. ... 오늘 VMWARE에 서버를 올리고 세팅할 일이 있었는데, VMWARE에 대해 아무것도 모를때는 망망대해 표류하는 느낌이었지만, VMWARE의 외부 서버 접속 이런식으로 검색해서 네트워크 동작방식에 대해 대략적으로 공부를 했다. 그러니까 왜 접근할 수 없습니다 와 같은 에러가 나는지 알겠더라. 나는 가이드대로 Host-only로 네트워크 모드를 설정했기 때문에, 외부에서는 죽어도 .. 2019. 4. 1.
HashMap vs HashTable vsTreeMap 그리고 HashSet HashMap은 자바 프로그래밍에서 널리 쓰이고 있으며 기술면접에도 단골질문으로 나온다. HashMap과 HashTable , HashSet을 정리해둔다. HashTable은 Map 인터페이스의 implementaion을 기반으로 한다. 이 implementaion은 Map의 모든 기능을 제공하며, Null 키값과 Null 밸류값을 허용한다. (HashMap은 거칠게? HashTable과 같지만, 비동기화이며, Null을 허용한다) HashMap은 Map의 순서를 보장하지 않으며 이 순서가 계속 유지되는것 또한 보장하지 않는다. Hash Function을 사용하여 get과 put에는 O(1)의 시간복잡도가 소요된다. HashMap은 초기 Capacity보다 입력값이 많아질 경우 동적으로 size가 늘어나.. 2019. 2. 19.
안드로이드 서비스 (2) Started Service시작된 서비스란 다른 구성요소가 startService()로 서비스를 호출하고, 서비스는 onStatCommand()에서 백그라운드 작업을 수행하는것을 말한다. 서비스가 시작되면 서비스만의 생애주기를 가지며, 백그라운드 작업은 무기한 실행될 수 있다. 해당 서비스를 호출한 구성요소가 소멸되어도 무관하며, 서비스를 종료시킬 때는 stopSelf()를 호출하여 종료시키거나 다른 구성요소가 stopService()를 호출하여 종료시킬 수 있다. 어플리케이션의 구성요소(액티비티)가 서비스를 시작하면서 intent를 전달하여 데이터를 전달할 수 있다. 서비스는 onStartCommand()에서 수신받는다. 시작된 서비스는 Service와 IntentService 두 가지 클래스를 확장하.. 2019. 2. 18.
안드로이드 서비스 (1) 서비스서비스는 백그라운드에서 오래 실행되는 작업을 수행하는 애플리케이션 구성요소이며 사용자 인터페이스를 제공하지 않습니다. 다른 구성요소(액티비티 같은)가 서비스를 시작할 수 있으며 사용자가 다른 애플리케이션으로 전환하더라도 계속 실행된다. 이 외에도 앱의 구성요소를 서비스에 바인드하여 상호작용 할 수 있다. 서비스의 예로는 네트워크 트랜잭션을 처리하고, 음악을 재생하고, I/O를 처리하며 ContentsProvider와 상호작용할 수 있고 이 모든 작업을 백그라운드에서 실행할 수 있다. 서비스는 두 가지 형태가 있다. -시작됨애플리케이션의 구성요소(예:액티비티)가 startService()를 호출하여 서비스를 시작한다. 서비스는 한 번 시작되면 백그라운드에서 무기한 실행될 수 있으며, 호출한 구성요소가.. 2019. 2. 18.
액티비티 재생성 액티비티 재생성 정상적인 앱 동작으로 인해 액티비티가 정지되는 경우를 알아보자. 사용자가 Back버튼을 누르는 경우액티비티가 finish()를 호출하여 자체적으로 종료하는 경우액티비티가 전면에서 오랬동안 사용되지 않는 경우전면에 있는 액티비티가 많은 리소스를 필요로 하여 백그라운드 프로세스를 종료할 때 앞의 두 경우는 더 이상 액티비티가 필요하지 않다는 사용자의 의지가 명확하므로 시스템에서 더 인스턴스를 유지하지 않는다. 그러나 시스템에 의해 강제로 소멸한 경우 시스템은 액티비티 인스턴스를 기억한다. Bundle 객체의 '키-값' 쌍의 컬렉션에 이러한 정보가 저장된다.*액티비티가 화면을 회전할 때마다 액티비티는 완전히 소멸된 후 다시 생성된다. 이유는 화면 구성이 바뀌어 레이아웃의 대체 리소스를 로딩해야.. 2019. 2. 16.
안드로이드 액티비티 생명주기 안드로이드 액티비티의 수명주기 콜백의 이해 액티비티 인스턴스가 살아있는동안 안드로이드는 계단식 피라미드와 비슷하게 각 생명주기에 해당하는 메소드를 호출한다. 새로운 액티비티가 생성되면 안드로이드는 액티비티의 생명주기를 점차 상향으로 이동시켜서 resumed에서는 사용자와 상호작용 할 수 있는 상태가 된다. 액티비티가 소멸될 때 피라미드에서 점차 내려오기 위해 해당 메소드를 호출하게 되며, 경우에 따라 완전히 하향 이동되지 않고 기다린다. (사용자가 다른 앱으로 전환했거나) 이런 경우 액티비티는 다시 피라미드의 최상향으로 이동할 수 있다.(다시 원래 액티비티로 돌아간 경우) 액티비티의 수명주기를 올바르게 구현하면, 다음을 포함하여 여러가지 상황에서도 앱이 제대로 동작하는것을 보장할 수 있다.사용자가 앱을 .. 2019. 2. 16.
String vs StringBuffer vs StringBuilder 기술면접을 볼 때 만약 지원자가 Java언어를 할 줄 안다면, 빠지지 않고 나오는 단골 문제인것 같다. 이 참에 정리해준다. 1.String -String instance는 character의 배열이며, immutable하기 때문에 생성이 되고 나면 변경할 수 없다. '+'를 써서 변경하는 경우는 다시 생성하는것이다. 2.StringBuffer -멀티 쓰레드 환경에서 사용할 수 있으며, String과 같지만 변경이 가능한 character의 배열 모음이다. -StringBuffer의 메소드들은 synchronized 되어있으며 이로 인해 멀티 쓰레드 환경에서 safe하다.-JDK5에서는 StringBuffer와 똑같이 동작하지만 Single Thread에 더 적합한 StringBuilder가 생겼다. s.. 2019. 2. 16.
집중력 그냥 문득 생각이 났는데2019년 올 해 도전해볼 목표는 내 스스로 인정할만 한 집중력을 기르는 것이었다.근데 집중력을 기른다는것은 사실 좀 추상적이고,결국 엄청난 집중력으로 괄목할만한 성과를 이뤄내거나, 아니면 꾸준한 성실성으로 결과를 이뤄내는것이다. 다시 말해서 목표는 성과와 수치로 증명하는게 맞다. 2019. 2. 14.
안드로이드 Notification 애플리케이션에 특정 이벤트(문자 메세지 도착이나 SD카드를 꽃았을 때)가 왔을때 사용자에게 그 사실을 인지시켜주어야 한다. Notification은 화면 상단바에 표시되며, 해당 Notification을 확인하고 지우기 전까지는 계속 상단바 리스트에 남아있고 클릭하면 원하는 컴포넌트를 호출할 수 있다. Notification을 사용하기 위해서는 크게 3가지를 구성해야 한다.TickerText(상태 표시줄에 표시되는 텍스트와 이미지)Notification List에 표시되는 항목 Notification List에서 항목을 눌렀을 때 수행할 작업 Notification 객체 생성하기Notification 객체를 생성하면서 상태 표시줄에 표시되는 문자 및 아이콘 이미지를 생성자로서 넣어준다. Notificat.. 2018. 12. 7.
dp/dip/sp/px 단위와 멀티해상도 안드로이드는 다양항 스마트폰의 해상도를 지원하므로 개발할 때 멀티해상도를 신경써야 한다. 스크린의 실제 단위 PX P는 화면을 구성하는 최소 단위이다. PX는 화면의 전체 화면 크기와 상관없이 지정한 수치만큼 표시되는 절대적 표시 단위이므로 안드로이드에서는 PX보다는 DP단위를 써야한다. DPIDot Per Inch의 줄인말로, 1인치에 들어가는 픽셀을 나타내는 단위이다. 안드로이드의 기본 단위는 mdpi : 160dpi 이다. 잠깐 살펴보자ldpi : 120dpimdpi : 160dpi(기본) 픽셀과 dp의 대응이 1:1이다. 즉 1dp는 1px가 된다.hdpi : 240dpixhdpi : 320dpixxhdpi : 480dpixxxhdpi : 640dpi 다양한 디바이스 크기에 대응하기 위해 필요한 .. 2018. 12. 7.
안드로이드 Firebase Auth / Realtime Databsae Firebase Auth는 사용자 인증에 관한 좋은 솔루션이다. 대부분의 앱에서는 사용자의 신원 정보를 필요로 한다. 사용자의 신원이 일단 확인되면, 사용자의 데이터를 클라우드에 저장할 수 있고 사용자의 모든 디바이스에서 사용자에게 맞춘 동일한 경험을 제공할 수 있기 때문이다. Firebase는 앱에서 인증에 필요한 SDK , 백엔드 , 인기 인증 업체에 대한 인증이 지원된다. 또한 Firebase 인증을 통해 다른 Firebase 서비스와 연동이 가능하며 OAuth 2.0 같은 산업 표준을 활용하므로 맞춤 백엔드와 쉽게 통합할 수 있다.1)오픈소스 형태로 제공하는 Firebase Auth UI를 삽입하거나2)Google, Facebook , Github같은 인증업체의 sdk를 통해 인증을 구현한다. 작.. 2018. 12. 6.
안드로이드의 구조 - MVC , MVP , MVVM 안드로이드를 처음 접할때 보통 액티비티에 안에 모든 작업을 수행하도록 코드를 짜는 경우가 많을것이다.가령, 액티비티 내에서 버튼 클릭 이벤트를 만들고, 해당 이벤트안에서 UI변경이나 데이터를 가져와서 넣어주거나 갱신된 데이터를 UI에 표현까지 모두 하나의 액티비티 안에 있는 경우이다. (반성한다.) 당연히 이렇게 코드를 짜다보면 서버와의 통신 부분이 추가되거나, 점차 기능이 추가될수록 가독성도 떨어지고 유지보수가 힘들어지는 코드로 가게 된다. 점점 화면이 복잡해지고 view에 의해 제어되는 로직들이 많아짐에 따라서 이를 분리하려는 노력들이 계속 진행되어왔다 MVC웹 서비스 개발자들이 가장 먼저 접하는 패턴일 것이다.Model : 데이터를 다루는 영역이다. 비지니스 로직이 들어있고, 네트워크, 데이터베이스.. 2018. 12. 6.