본문 바로가기

분류 전체보기

(57)
코틀린(Kotlin) - object 키워드 : 싱글톤, static 멤버, 객체 식 선언 코틀린에서는 "object" 키워드를 다양한 상황에서 사용하지만 그 상황마다의 공통점이, 클래스를 정의하면서 동시에 인스턴스(객체)를 생성한다는 점입니다. 이러한 object 키워드를 사용하는 여러 상황을 살펴보도록 하겠습니다. 객체 선언 : 싱글톤 쉽게 만들기 (object) 객체지향 프로그래밍을 설계하다 보면, 인스턴스가 하나만 필요한 클래스의 유용한 경우가 많습니다. 자바에서는 다음과 같이, 보통 클래스의 생성자를 private으로 선언하고, static 변수에 클래스 객체를 저장하는 패턴으로 구현합니다. /** 자바에서의 일반적인 싱글톤 패턴 */ public class DataRepository { private static DataRepository INSTANCE; private DataRe..
Databinding 사용 시, 경우에 따라 View 바인딩 하는 방법 Databinding 라이브러리 사용 시, 사용되는 경우(Activity, Fragment, Adapter, CustomView...)에 따라 xml 레이아웃을 바인딩하는 방법에 차이가 있어서 간단히 정리해보았습니다. 모든 내용은, Android developers 래퍼런스의 Generated binding classes 가이드를 참고하였습니다. Activity override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) val binding = DataBindingUtil.setContentView(this, layoutId) } Fragment, Adapter val binding = ListItemBin..
코틀린(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 = "안드로이드" ..