목록All (86)
에르노트
루비 공부를 처음 시작하면서 흥미로웠던 부분은 역시 파이썬과 매우 닮아있다는 것이다. 파이썬에 인터랙티브 모드인 REPL이 있다면 루비에는 IRB(Interactive RuBy)가 있다. REPL가 거의 같은 느낌으로 사용할 수 있으므로 이것도 계산기로써 유용하다. 리눅스 쉘에서는 irb 명령어를 쳐서 진입할 수 있고 'exit'으로 빠져나올 수 있다. 또는 'Ctrl + D'로 시그널을 발생시켜서 종료할 수도 있다. irb에서는 직접적인 계산부터 변수 할당까지 잘 작동한다. 위의 예시에서는 a와 b에는 값을 할당했지만 c는 정의되지 않은 변수이므로 에러가 발생하는 것까지 확인할 수 있다. 추가적으로 Math라는 내부 모듈을 이용하여 수학 계산을 위한 함수들을 활용하는 등 라이브러리 함수를 끌어다쓰는 것..
일반적인 속도로 화면을 끌어내릴 때는 거의 그 속도에 맞춰서 onBindViewHolder()가 호출되고, 사용자는 위화감을 느끼지 않는다. 그런데 위 예시처럼 급격하게 스크롤을 꺽어올려버리면 아이템이 다시 바인딩되는 과정에서 다소 딜레이가 발생할 수 있다. 위 경우는 미리 구성된 데이터를 바인딩하는 것이 아니라 api 콜을 통해 비동기적으로 선수 이름을 불러와서 바인딩하는 경우였으므로 그 딜레이를 사용자가 눈으로 느낄 수 있기에 문제가 되었다. 여러가지 시도를 해보았는데 결국 해결법은 매우 간단했다. 아이템의 개수가 정해진 경우라면 그 개수만큼, 혹은 스크롤이 지나갈 충분한 양만큼을 캐시해두면 된다. 그리고 안드로이드 리사이클러뷰에서는 자체적으로 그 메소드를 제공하고 있다. RecyclerView.se..
이오스(EOS) 기반 모바일 블록체인 게임인 ROR GAME을 해보았다. 아직까지 IOS에서는 이용할 수 없고 현재 안드로이드폰에서 곧바로 플레이해볼 수 있다. 이 ROR GAME은 세계 최초 100% 유료 결제 수익 보상을 슬로건으로 내걸고 있다. 플레이어는 랭킹전 리그를 통해 게임에서 발생하는 인앱 결제 수익의 일부를 상금으로 획득할 수 있고, 나머지는 ROR 토큰 홀더가 보상을 받는다고 한다. 여기서 ROR 토큰은 블록체인 토큰으로 쉽게 말해 캐시슬라이드의 포인트와 같은 개념이다. ROR GAME의 토큰 이코노미에 대한 자세한 설명은 공식 사이트에서 확인할 수 있다. 회원가입 창에서는 EOS를 비롯한 여러 블록체인 종류를 선택할 수 있다. 또 글로벌 서비스가 진행중이어서 한국을 비롯한 다양한 국가에..
종이에 그린 그림이 그대로 디지털 코드로 변환되어 인터넷 세상에서 표현된다. 이제 더 이상 영화 속 이야기가 아니다. Microsoft에서 그림을 HTML로 바꿔주는 사이트를 각잡고 만들어버렸다. Sketch2Code에 종이에 그린 사이트 도안을 사진 찍어서 올리거나, 그림판으로 그린 이미지 파일을 그대로 올리기만 하면 진짜로 HTML 코드를 만들어준다. 과정은 그야말로 단순하다. 위 한 문장이 전부이다. 4차 산업 혁명을 몸소 느낄 수 있는 대목이다. 실제 생성된 코드는 다음과 같다. 말그대로 인공지능이 만들어낸 자동 생성된 코드라 그런지 사람이 보기에 가독성이 좋지는 않다. 이 변환기의 목적은 개발자가 이어나갈 초안을 만드는 것이 아니라 아예 완성품을 만들어내는 것 같으므로 큰 문제는 없을듯하다. S..
안드로이드 앱을 사용하다보면 서로 다른 앱 간 데이터를 공유해야 할 일이 종종 생긴다. 메모 앱의 텍스트 내용을 카톡으로 넘겨주거나 반대로 카카오톡 메세지 내용을 메모장에 공유해서 저장시키는 것이 대표적인 예시라고 볼 수 있다. 그래서 안드로이드에서는 미리 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..