코틀린 7

인터페이스와 클래스의 독립 파일 여부

일반적으로, 관련된 클래스와 인터페이스는 같은 파일에 위치하는 것이 좋습니다. 그러나, 이들이 매우 크거나 복잡한 경우에는 각각 별도의 파일로 분리하는 것이 좋을 수 있습니다.  UiData, GroupsUiData, TagsUiData와 같은 클래스는 UI 상태를 나타내는 데이터 모델이므로, 이들은 일반적으로 UI 로직을 담당하는 파일에 위치합니다. 그러나 이들이 여러 곳에서 공유되는 경우에는 별도의 파일로 분리하여 재사용성을 높일 수 있습니다.  ClassificationUiState, GroupsUiState, TagsUiState와 같은 sealed 인터페이스는 각각의 UI 상태를 나타내므로, 이들은 각각의 UI 로직을 담당하는 파일에 위치하는 것이 일반적입니다.   따라서, 이러한 클래스와 인터..

listOf()와 emptyList() 차이

listOf()와 emptyList() 모두 코틀린에서 빈 리스트를 생성하는 함수. listOf()는 가변 인자를 받아서 리스트를 생성하는 함수다. 인자 없이 호출하면 빈 리스트를 반환한다.  emptyList()는 항상 빈 리스트를 생성하는 함수로 listOf()와 emptyList()는 인자 없이 호출할 경우 동일한 결과, 즉 빈 리스트를 반환함. 그러나 이 두 함수 사이에는 성능 차이가 있다. emptyList()는 항상 같은 인스턴스를 반환하기 때문에 새로운 객체를 생성하지 않음. 반면에 listOf()는 호출할 때마다 새로운 리스트를 생성함.  따라서 빈 리스트를 생성할 때는 emptyList()를 사용하는 것이 더 효율적.

[Sunflower 디비보기] Detail View 에서 Garden 으로 아이템 담기 MVVM

2개의 탭이 있으며, 좌측에는 나의 정원, 우측에는 식물 리스트가 있다. 여러 종류의 식물들이 있는 식물 리스트에서 식물을 하나 선택하면 그 식물의 Detail View로 간다. DetailView에서 나의 정원으로 담기를 누를 경우 선택된 식물이 나의 정원에 담기는데, 이 일련의 과정(MVVM)들의 흐름을 알아본다. View layout 은 데이터 바인딩을 사용하고 viewModel을 통해 View를 업데이트하고, callback을 등록해서 add 버튼에 바로 동작하게 한다 frament_plant_detail.xml callback 은 아래 Fab버튼을 눌렀을 때 반응하도록 onClick 리스너에 등록해준다 View -담기 버튼의 동작을 위한 작업 ViewModel 생성(참고: ViewMode 주입)..

[Sunflower 디비보기] Activity, Fragment, Navigation 시작

Activity 최초 액티비티에서 activity_garden 을 layout으로 설정하게 되면 GardenActivity.kt class GardenActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(this, R.layout.activity_garden) } } NagGraph R.layout.activity_garden 에서는 이후 연결되는 view들을 아래와 같이 관리할 navigaion을 지정한다. app:navGraph="@navigation/nav_garden" R.layout.activity_garde..

코틀린 생성자와 위임

주 생성자와 부 생성자 2가지로 나뉘며, 주 생성자는 클래스 선언 시 가시성 접근자(없으면 클래스 명) 뒤에 선언한다. class Car private constructor(_name: String) 자바는 부 생성자 처럼 클래스 내부에 선언 한다 private class Car { class(String name) } 부 생성자는 클래스 내부에서 파라미터를 달리하여 만든다. class Car private constructor(_name: String) { constructor(value: Int)} 클래스 생성 시 생성자를 정의하지 않으면 컴파일러는 인자가 없는 디폴트 생성자를 만든다 주 생성자 class Car constructor(_name: String){ val name : String ini..

추상클래스(abstract)와 인터페이스(interface)

차이점 추상 클래스는 상속과 필수구현을 위해 인터페이스는 필수구현을 위해 추상 클래스 클래스 내에 추상 메서드가 하나 이상 포함 되거나, abstract 로 정의 된 경우 추상 메서드가 하나라도 있으면 class 앞에 abstract 를 붙여야 함 추상 메서드는 구현 되지 않으며 상속받은 클래스에서만 구현되어야 한다. abstract 에는 final 을 붙일 수 없다. 이미 open 이다 생성자, 전역 변수도 선언 할 수 있고, 메서드 내용이 있을 수도 있다. 다중 상속 안됨 추상 클래스는 직접 생성될 수 없으며, 다른 클래스를 통해 생성되어야 한다. 직접 Car() 로 생성하면 아래와 같은 에러가 나타난다. Cannot create an instance of an abstract class abstra..

코틀린 Scope; apply, also, run, with, let

Scope 함수는 인스턴스의 속성, 함수를 영역내에서 분리해서 사용 할 수 있다. 깔끔하고, 가독성을 높여 준다. apply / also 인스턴스 반환 run(with) /let 최종값 반환 apply 인스턴스(클래스)를 생성한 후 변수에 담기 전 초기화 과정을 수행 할 때 인스턴스 생성 후 .apply{ } 스코프 내에서 인스턴스의 .이름 없이 바로 사용 가능 즉, 인스턴스 생성 하고, 변수에 변경되거나 초기화 값을 넣은 다음 할당 하게 된다. class Book(var title: String, var number:Int){} var a = Book("a", 5).apply{ title = "abcde" + name} 인스턴스가 그대로 반환 된다 run apply 와 같으나, 마지막 구문이 반환 된다..

반응형