목록Dev (34)
에르노트
파이썬에서는 C관련 언어들에서 흔히 보이는 'try~ catch~' 대신에 'try: except:' 형태로 예외를 처리한다. 우선 파이썬에서 흔히 볼 수 있는 예외(에러) 상황들을 정리해보자. 1. Value Error list = [1.0, 2.0, ''] for i in list: print(float(i)) 문자열을 float() 함수의 인자로 넣으면 당연히 float 타입으로 변환할 수 없으므로 ValueError가 발생한다. 2. Zero Division Error a = 1 b = 0 c = a/b 가끔 정신없이 코드를 짜다보면 종종 발생하는 에러.. 3. Index Error list = [1, 2, 3] print(list[3]) 실제로 존재하지 않는 인덱스에 대해서 접근하려 할 때 발생..
앱에 광고를 게제해서 수익을 창출하기 위해 페이스북 오디언스 네트워크(Facebook Audience Network)를 사용해왔다. 그러던 중 오디언스 네트워크 SDK의 버전이 오래되었으니 최신 버전으로 업데이트하라는 알림을 받았고, 무심코 앱 단위 build.gradle에서 버전을 높여주었다. (5.5 -> 5.10.0) 그랬더니 다음과 같은 문제가 발생하기 시작했다.. 해당 문제는 기존에 안드로이드9에서 발생하던 ERR_CLEARTEXT_NOT_PERMITTED 에러와 연결되어 있다. 그래서 페이스북에서도 이 해결법대로 자체적인 해결 가이드(네트워크 보안 구성)를 따로 마련해두었다. 즉 그대로 따라하기만해도 손쉽게 해결할 수 있다는 것이다. 여기서 핵심은 오디언스 네트워크가 localhost를 캐싱에..
루비 공부를 처음 시작하면서 흥미로웠던 부분은 역시 파이썬과 매우 닮아있다는 것이다. 파이썬에 인터랙티브 모드인 REPL이 있다면 루비에는 IRB(Interactive RuBy)가 있다. REPL가 거의 같은 느낌으로 사용할 수 있으므로 이것도 계산기로써 유용하다. 리눅스 쉘에서는 irb 명령어를 쳐서 진입할 수 있고 'exit'으로 빠져나올 수 있다. 또는 'Ctrl + D'로 시그널을 발생시켜서 종료할 수도 있다. irb에서는 직접적인 계산부터 변수 할당까지 잘 작동한다. 위의 예시에서는 a와 b에는 값을 할당했지만 c는 정의되지 않은 변수이므로 에러가 발생하는 것까지 확인할 수 있다. 추가적으로 Math라는 내부 모듈을 이용하여 수학 계산을 위한 함수들을 활용하는 등 라이브러리 함수를 끌어다쓰는 것..
일반적인 속도로 화면을 끌어내릴 때는 거의 그 속도에 맞춰서 onBindViewHolder()가 호출되고, 사용자는 위화감을 느끼지 않는다. 그런데 위 예시처럼 급격하게 스크롤을 꺽어올려버리면 아이템이 다시 바인딩되는 과정에서 다소 딜레이가 발생할 수 있다. 위 경우는 미리 구성된 데이터를 바인딩하는 것이 아니라 api 콜을 통해 비동기적으로 선수 이름을 불러와서 바인딩하는 경우였으므로 그 딜레이를 사용자가 눈으로 느낄 수 있기에 문제가 되었다. 여러가지 시도를 해보았는데 결국 해결법은 매우 간단했다. 아이템의 개수가 정해진 경우라면 그 개수만큼, 혹은 스크롤이 지나갈 충분한 양만큼을 캐시해두면 된다. 그리고 안드로이드 리사이클러뷰에서는 자체적으로 그 메소드를 제공하고 있다. RecyclerView.se..
안드로이드 앱을 사용하다보면 서로 다른 앱 간 데이터를 공유해야 할 일이 종종 생긴다. 메모 앱의 텍스트 내용을 카톡으로 넘겨주거나 반대로 카카오톡 메세지 내용을 메모장에 공유해서 저장시키는 것이 대표적인 예시라고 볼 수 있다. 그래서 안드로이드에서는 미리 Intent.ACTION_SEND 라는 공유 인텐트를 만들어 두었다. 이를 통해 다른 앱으로 간단한 데이터 보내기를 쉽게 구현할 수 있다. 한편 다른 앱이 보낸 간단한 데이터를 받을 앱 목록에 내 앱을 추가하고 싶을 수도 있다. 이때는 manifest에다가 Activity 태그 아래에 intent-filter를 추가해주는 방법으로 역시 손쉽게 처리가 가능하다. 공식 문서는 여기 참조. 여기서 mimeType은 전달받을 데이터 타입이라고 보면 된다. 표..
안드로이드 초창기(킷캣 이전)에 카메라 프리뷰를 다루는 예제는 매우 간단했다. 그런데 5.0롤리팝에 오면서 기존 android.hardware.camera가 Deprecated 되버리고 새롭게 더 복잡한 camera2로 대체되었다. 더불어 6.0마시멜로에 와서는 권한 체크가 강화되면서 더 신경쓸 일이 많아져서 이전과는 완전히 새로운 코드가 필요하게 되었다. 그래서 최신 트렌드에 맞추어 camera2 예제를 코틀린으로 리팩토링 해보았다. 우선 카메라2 공식문서는 여기를 확인하면 된다. 그리고 본 예제는 이 블로그의 예제를 기반으로 작성되었다. 카메라에 보이는 것들은 SurfaceView를 통해 표현된다. 일반 뷰의 경우 뷰를 그리는 일은 메인 스레드에서 담당한다. 그러나 카메라가 표현하는 프리뷰는 실시간으..
자바와 비교했을 때 코틀린의 가장 특징적인 부분을 하나만 고르라면 이 범위 지정 함수(Scope Function)가 아닐까 싶다. 이들은 코틀린의 표준 라이브러리에 포함되어 있는 표준 함수 중에서도 형제처럼 비슷한 형태를 띄고 있으면서 묘하게 다르게 동작한다. 공식 문서에도 대놓고 'Basically, these functions do the same..' 이라고 나와 있으며 람다식의 접근 방법과 반환형의 차이가 있을뿐이라고 한다. 하지만 이 미묘한 차이로 인해 관습적으로 제각각 다른 용도로 쓰이고 있으며, 그러한 일반적인 사용법들에 대해서 정리해보고자 한다. let() public inline fun T.let(block: (T) -> R): R { contract { callsInPlace(block..
자바에서는 연산자 오버로딩을 문법적으로 지원하지 않는다. 하지만 코를린에서는 연산자의 역할을 함수로 정의함으로써(Convention) 일반적인 함수를 정의하는 느낌 그대로 연산자를 이용할 수 있다. 따라서 플러스(+)와 같은 연산자에 여러 가지 다른 의미를 심어줄 수 있는데 이를 연산자 오버로딩(Operator Overloading)이라고 한다. val a = 1 val b = 2 println(a + b) //1번 println(a.plus(b)) //2번 //1번과 2번은 100%은 같은 의미이다! 이처럼 연산자를 사용하는 것은 관련된 멤버 메서드를 호출하는 것과 같다. fun main(){ println(Point(1, 3) + Point(2, 2)) } class Point(var x: Int, ..
fun Array.reverse() fun ByteArray.reverse() fun ShortArray.reverse() fun IntArray.reverse() fun LongArray.reverse() fun FloatArray.reverse() fun DoubleArray.reverse() fun BooleanArray.reverse() fun CharArray.reverse() fun MutableList.reverse()자바에서 Collections 클래스의 reverse(list) 형태로 제공되었던 reverse() 함수가 코틀린에서는 확장 함수 형태로 제공된다. 따라서 Collections를 import 할 필요없이 사용하려는 Array 혹은 MutableList에서 바로 reverse()..
구글 JetPack component에 포함되어 안드로이드 로컬 데이터베이스 접근을 도와주는 Room 라이브러리를 공부하던 중 'Entity class must be annotated with @Entity'라는 에러를 겪었다. 다행히 별 복잡한 문제는 아니었고 에러문구 자체가 해결법인 간단한 문제였다. 전에 사용해 본 또 다른 모바일 로컬 DB인 Realm에서는 RealmObject을 상속받는 형태로 Entity를 정의했었다. 그런데 Room Database에서는 일반적인 자바 클래스 혹은 코틀린의 데이터 클래스를 그대로 사용한다. 따라서 내가 작성한 클래스가 DB의 엔티티로 쓰일 것임을 명시해줘야하고, @Entity 어노테이션이 바로 그 표식인 것이다. 실제 예시는 아래와 같다. @Entity dat..