Moshi - API 통신 시, JSON과 객체 사이의 직렬화 및 역직렬화를 간단하고 신속하게 해주는 라이브러리 - 내부 동작에서 Reflection 사용 Reflection : 자바의 기능 중 하나로, 클래스나 인터페이스의 정보에 직접 접근 가능케 하는 API을 일컫는다. 직렬화 : 특정 데이터를 다른 CPU로 보내기 전 통신이 가능하면서도 나중에 재구성이 가능한 포맷으로 환해주는 행위 역직렬화 : 직렬화된 데이터를 다시 객체 형태로 변환하는 행위 JSON 처리 @JsonClass Annotation : JSON Object에 대응되는 역할을 한다. 해당 Annotation은 JSON Object에 대응되는 클래스 생성 시 상단에 붙인다. 파라미터로 들어가는 generateAdapter를 true로 S..
Sealed Class?- 봉인 클래스는 추상 클래스와 비슷하게 상속 과정을 통해 완성 가능한 클래스를 정의함과 동시에 해당 클래스를 상속받는 클래스의 개수를 제한하고 싶을 때 사용한다.- 미리 만들어놓은 자료형들을 묶어서 제공하는 방식이다. Sealed Class 정의- sealed 키워드 활용sealed class Parent { abstract fun abstractMethod()}sealed class Result { open class Success(val message: String): Result() class Error(val code: Int, val message: String): Result()}- Parent 클래스를 상속받는 클래스를 정의한다.- Se..
Enum Class - 특정 상태를 지정하는 상수들을 클래스 내부에 고유 값으로 만들어 사용 - 소스코드의 가독성을 높이는데 기여한다. - 상수 값의 타입 안전성을 보장한다. enum class EnumTest { Naver, Google, Yahoo, Daum } fun getPortalType(s : String) { when (s) { "naver" -> EnumTest.Naver "google" -> EnumTest.Google "yahoo" -> EnumTest.Yahoo else -> EnumTest.Daum } } - 각 열거 자료형은 enum 클래스의 인스턴스이기 때문에 다음과 같이 초기화가 가능하다. enum class Color(val rgb: Int, val colorName: Str..
Singleton Pattern - 어떤 클래스의 인스턴스는 오직 하나임을 보장하며, 해당 인스턴스를 전역적으로 접근 가능케하는 패턴 - 고정된 메모리 영역을 가지기 때문에 메모리 사용의 효율성 증가 - object 키워드를 통해 간단하게 패턴 생성 가능 Java의 Static 활용 시에는 호출 시점에 인스턴스가 생성되지만, Kotlin의 Object는 프로세스가 메모리 상에 올라가는 순간 바로 생성된다. 이는 즉, 굳이 사용되지 않을 때에도 메모리에 인스턴스가 존재하기 때문에 어떤 경우에는 주의할 필요가 있다. Object - 클래스 외부에서 선언되며 별도의 객체 생성 없이 즉시 호출이 가능하다. - 하나의 객체만 접근 시점에 생성되므로 생성자가 없는 클래스만 사용 가능 - 특정 초기화를 위해서는 in..
안드로이드에서 외부 URL을 열 때, 보통 WebView를 많이 사용하지만 그보다 속도가 빠르고, 탭에 대한 커스터마이징이 가능한 Chrome Custom Tab이라는 기능이 있다. 먼저 해당 디바이스에서 pakageManager를 통해 크롬 사용 가능 여부를 확인하여, 가능한 경우 Service 사용 단계로 넘어가도록 처리해주었다. fun isChromeEnabled(context: Context): Boolean = context.packageManager.getPackageInfo("com.android.chrome", 0).applicationInfo.enabled openChromeWebService() 라는 함수를 새로 만들어, 해당 함수 내에서 실질적인 Chrome Tab View 작업을 진..
원래 안드로이드에서는 Activity로부터 결과 값을 수신 받을 때, startActivityForResult(), onActivityResult()를 사용했지만 deprecated 되었습니다. 이에 따라 공식문서에서 제안한 새로운 방식인 registerForActivityResult()를 사용해보겠습니다. private lateinit var resultLauncher: ActivityResultLauncher 먼저, MainActivity에서 값을 제네릭으로 처리해줄 Launcher 인스턴스 변수를 생성합니다. Intent 객체를 전달받기 위해 Intent를 제네릭에 명시해주었습니다. nextBtn.setOnClickListener { val intent = Intent(this, SecondActi..
안드로이드에서 앱 구현 중, 다음과 같이 툴팁 메시지 창이 필요한 경우가 있습니다. 라이브러리를 통해 해당 기능을 구현해보도록 하겠습니다. 자세한 내용은 아래 링크를 통해 확인 부탁드립니다. https://github.com/skydoves/Balloon GitHub - skydoves/Balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android. :balloon: Modernized and sophisticated tooltips, fully customizable with an arrow and animations for Android. - GitHub - skydove..
디바이스 내의 연락처 앱을 사용하다보면, 여러가지 정보들을 포함시킬 수 있는 것을 확인할 수 있습니다. 프로필 사진, 전화번호, 생일, 메모, 연락처 이름 등 다양한 데이터가 존재하는데, 이 중에서 대표적으로 화면에 보여지고 있는 프로필 사진, 생일, 연락처 이름, 연락처 고유 ID 데이터를 우리가 직접 만든 앱으로 가져올 수 있도록 구현해보겠습니다. 먼저 디바이스 연락처 접근 권한을 얻기 위한 permission tag를 AndroidManifest.xml 파일에 추가해줍니다. private fun getContacts() { if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) != PackageManager.PE..
로그인 또는 비밀번호 찾기 기능 등을 구현 중, 이메일 검사를 진행하는데, 이때 유효한 이메일 타입 String이 아닐 경우에 대한 처리가 필요하곤 합니다. Argument로 넘어온 String이 이메일 형식인지를 확인하기 위해서 정규표현식을 사용합니다. 정규표현식이란? - 정규 표현식(regex, rational expression)은 특정한 규칙을 가진 문자열의 집합을 표현하는 데 사용하는 형식언어입니다. 정규 표현식은 많은 프로그래밍 언어 또는 텍스트 편집기에서 문자열의 검색과 치환을 위해 지원하고 있으며, 이메일 형식이나 그 외 특정 문자 형식을 추출하거나 검사할 때 유용하게 쓰이고 있습니다. val emailExpression = "^[\\w.-]+@([\\w\\-]+\\.)+[A-Z]{2,4}..