본문 바로가기

android

(47)
코틀린(Kotlin) - 데이터 클래스와 클래스 위임(by) 자바와 마찬가지로 코틀린 클래스도 toString, equals, hashCode 등을 오버라이드 할 수 있고, 코틀린은 이런 메소드 구현을 자동으로 생성해줄 수 있습니다. 데이터 클래스 어떤 클래스에 대해 toString, equals, hashCode를 수행하려면 반드시 오버라이드해야 합니다. 다행히도 인텔리J IDE는 자동으로 이런 메소드를 정의해주기도 합니다. 하지만, 코틀린은 더 편리합니다! 이제 이런 메소드를 IDE를 통해 생성할 필요도 없이 "data" 라는 키워드를 클래스 앞에 붙이면 위와 같이 필요한 메소드들을 컴파일러가 자동으로 만들어줍니다! 이렇게 "data" 가 붙은 클래스를 "데이터 클래스" 라고 부릅니다. /** Client를 데이터 클래스로 선언하기 */ data class C..
코틀린(Kotlin) - 생성자와 프로퍼티를 갖는 클래스 선언 자바에서는 생성자를 하나 이상 선언할 수 있고, 코틀린도 비슷하지만 한 가지 바뀐 부분이 있습니다. 코틀린은 주생성자(primary, 클래스 본문 밖에서 정의)와 부생성자(secondary, 클래스 본문 안에서 정의)로 구분됩니다. 또한, 코틀린에서는 초기화 블록(init block)을 통해 초기화 로직을 추가할 수 있습니다. 클래스 초기화 : 주 생성자와 초기화 블록 class User(val name: String) 보통 클래스의 모든 선언은 중괄호{} 사이에 들어가지만, 이 클래스의 선언에는 중괄호가 없고 괄호 사이에 val 선언만 존재합니다. 이렇게 클래스 이름 뒤에 오는 괄호에 들어가는 코드를 주생성자(primary constructor) 라고 부릅니다. 주생성자는 생성자 파라미터를 지정하고, ..
코틀린(Kotlin)의 Scope Function(let, with, run, apply, also) 정리 Scope Function 이라는 함수명에서 알 수 있듯이, 이 함수들을 람다식을 이용해서 호출하면 일시적인 Scope(범위)가 생기게 되고, 이 범위 안에서는 전달된 객체에 대해 "it" 또는 "this" 라는 Context Object를 통해서 접근하게 됩니다. 두 가지 차이점 Scope Function에는 서로 다른 두 가지 주요 차이점이 있습니다. - Context Object를 참조하는 방법 (this, it) - Return value Context Object: this or it Scope Function 람다식 내에서 Context Object는 실제 객체명 대신, "it" 또는 "this" 키워드로 접근하게 됩니다. class Person (var name: String, var age..
코틀린(Kotlin) - 클래스 계층 정의 코틀린 인터페이스 코틀린 인터페이스 안에는 추상 메소드뿐 아니라, 구현이 있는 메소드도 정의할 수 있습니다. /** 간단한 인터페이스 구현 */ interface Clickable { fun click() } class Button : Clickable { override fun click() = println("클릭") } >>> Button().click() 클릭 자바에서는 extends와 implements를 사용하지만, 코틀린에서는 클래스 이름 뒤에 콜론(:)을 붙이고 인터페이스와 클래스를 명시하는 것으로 상속과 인터페이스 구현을 처리합니다. 오버라이드 하는 경우, 자바의 @Override 어노테이션과 비슷하게 코틀린에서는 override라는 키워드를 사용합니다. /** 인터페이스 안에, 구현이 ..
Two-way binding cannot resolve a setter for ... 해결 방법 문제 발생 Databinding 라이브러리를 사용하여, View -> ViewModel 로 데이터를 갱신하기 위해 InverseBinding를 했을 때 다음과 같은 에러가 발생하였다. Two-way binding cannot resolve a setter for ... 문제 해결 혹시 코틀린으로 개발을 하는 경우라면, 데이터 바인딩하려는 데이터 클래스의 해당 변수가 var로 선언되어있는지 확인해야 합니다. 만약, 해당 변수가 val로 선언되어있다면, var로 수정해야 합니다. val은 값 변경이 불가능하기 때문에, Inverse시 setter()를 할 수 없어 발생하는 에러이므로, 해당 변수를 var로 수정하신 후 다시 실행해보시면 정상적으로 양방향(Two-way) 바인딩이 되는 것을 확인하실 수 있습니..
Android DataBinding vs Kotlin Extensions 의 XML 레이아웃 접근, 어떤 방식이 더 좋을까? MVVM 아키텍처와 코틀린을 같이 하다 보니, XML 레이아웃 뷰 접근을(findViewById) 대체할 수 있는 방식이 서로 달라서, 과연 어떤 방식으로 하는 게 좋을까? 라는 궁금증이 생겼습니다. MVVM 아키텍처를 위해 DataBinding 을 사용하고 있고, 코틀린을 위해 Kotlin Extensions를 사용하고 있다면, XML 뷰에 접근하기 위해 각자마다의 findViewById 대체 방법이 존재합니다. 우선, XML에 아래와 같은 TextView가 있다고 가정하고, 각자의 접근 방식에 대해 알아보겠습니다. [ DataBinding ] binding.textviewTitle.text = "안드로이드" [ Kotlin Extensions ] textview_title.text = "안드로이드" ..
코틀린(Kotlin) - 리팩토링 : 로컬 함수와 확장 함수로 코드 중복 없애기 우리가 생각하는 좋은 코드의 중요한 특징 중 하나가 "중복이 없는 것" 이라고 생각합니다. 흔히 "두번 이상 반복적으로 사용되는 로직은 따로 빼서 재활용할 수 있도록 해라."라는 말도 있죠 ㅎㅎ 그래서 리팩토링을 통해, 긴 메소드를 부분 부분 기능을 나눠서 따로 떼어내는 작업을 하게 되는데, 하지만 그렇게 코드를 리팩토링 하게 되면, 클래스 안에 작은 메소드들이 너무 많아지게 되고, 각 메소드 사이의 관계를 파악하기가 쉽지가 않아서, 오히려 코드를 이해하기 더 어려워지는 상황이 발생하게 됩니다... 그렇다고, 따로 떼어낸 메소드들을 모아서 내부 클래스(inner class) 안에 넣자니, 코드는 깔끔해지긴 하는데 그에 따른 불필요한 작업들이 늘어나게 됩니다. 하지만 우리에겐 코틀린이 있고, 코틀린에는 더..
코틀린(Kotlin) - 확장 함수 만들기 자바 컬렉션에는 디폴트 toString()이 구현되어 있습니다. 하지만, 그 디폴트 toString()의 출력 형식은 고정되어 있기 때문에, 우리에게 필요한 형식이 아닐 수도 있습니다. val list = listOf(1, 2, 3) >>> println(list) //디폴트 toString() 호출 [1, 2, 3] 위의 디폴트 구현과 달리, 우리 입맛대로 toString()을 커스텀 하고 싶다면 어떻게 해야 할까요? 코틀린에는 이런 요구 사항을 처리할 수 있는 함수가 표준 라이브러리에 이미 탑재 되어 있습니다! 확장함수(Extension Function) 라고 하며, 마치 기본 클래스에 정의된 함수인 것처럼 새로운 기능을 추가하는 기능입니다. 우선 먼저, 알고가야할 개념으로는 "코틀린에서는 함수를 클..