[Kotlin] DMC2와 함께하는 코틀린 강의

6720·2023년 5월 29일
0

이거 모르겠어요

목록 보기
21/38
post-custom-banner

0) 코틀린은 프로젝트 아니면 만질 일이 없지만.. 스터디원께서 해주신 강의가 너무 유용했어서 적어보는 강의 필기내용
거기에 굳이 코틀린이 아니더라도 자바와 연관된 내용이 많아서 어쩌다보니 집중해서 듣게 됐다..

그리고 DMC2는 지금 스터디에서 같이 만들고 있는 프로젝트 이름이닷

1) Activity(Fragment), ViewAdapter, ViewHolder 역할

이 셋을 통해 리사이클러뷰에 아이템을 넣어 동작하도록 함.

  • ViewAdapter: 뷰와 그 뷰에 올릴 데이터를 연결하는 역할
  • ViewHolder: 각 뷰의 객체를 보관하는 역할

만약 데이터에 필터링 등을 통해 원하는 데이터로만 작업하고 싶다면, ViewHolder와 ViewAdapter가 본인의 역할만을 할 수 있도록 Activity(Fragment)에서 선 작업을 거쳐주는 편이 좋음.

2) inner class

1)과 동일한 맥락에서 inner class나 interface 같이 독립할 수 있는 부분은 따로 파일을 생성해서 표현해주는 편이 좋음.

EX) OnItemClickListener, MyViewHolder

함수를 구현할 때 안에 따로 코드를 집어넣을 게 아니라면 {} 생략 가능

3) val과 var의 차이점

val은 불변, var은 가변이라고 하기엔 애매해짐.

val은 초기에 값을 할당하면 나중에 값을 변경할 수 없으며, 값을 변경하게 되면 컴파일 에러가 발생함 - 불변
자바에서의 final도 비슷한 역할을 함.
다만 변수의 참조가 가리키는 객체의 내부 값은 변경이 가능함.

val arr = arrayListOf("d")
arr.add("b") // 가능함.

4) Serializable: 직렬화

저장한 객체를 읽을 일이 생길 수 있을 때 사용함.
클래스가 파일에 읽거나 쓸 수 있도록 하며, 다른 서버로 보내거나 받을 때도 이 인터페이스를 사용함.

DMC2에서는 intent를 사용하는데 객체에 다음을 붙이면 객체 통째로 전송이 가능함.
이때 받을 때는 intent.getSerializableCompat<StoreInformation>("id") ?: StoreInformation(~~)형식을 이용함.

5) ?: - 엘비스 연산자

코틀린에서는 null이 담길 수 있는 변수의 설명을 보면 타입에 ?가 붙는데, 이 ?를 없애기 위해 null이 올때 대체할 값을 미리 지정함.

물음표가 엘비스라는 사람의 머리처럼 생겼다고 해서 엘비스 연산자라고 부름. 머리 귀엽게 생기셨네

6) companion object

자바에서 static과 유사함. - 완전 똑같지는 않음.
DMC2에서는 인텐트 경로 설정을 위해 사용되었음.

class RecommendDetailActivity : AppCompatActivity() {
    ...

    companion object {
        fun getIntent(context: Context): Intent {
            return Intent(context, RecommendDetailActivity::class.java)
        }
    }
}
class CategoryFragment : Fragment(), OnItemClickListener {
    ...

    override fun onItemClick(id: Int) {
        val intent = RecommendDetailActivity.getIntent(requireContext())
        intent.putExtra("id", id)
        startActivity(intent)
    }
}

사용은 다음처럼 클래스 이름에 경로를 붙여 사용함.

7) binding과 findViewById

binding을 사용할 땐 굳이 findViewById를 사용하지 않아도 됨.
binding에서 경로 타고 원하는 id를 바로 집어올 수 있음.

8) 여러 클래스 종류

  1. data class: 데이터 보관 목적으로 만든 클래스
  • 데이터 클래스의 생성자는 1개 이상의 프로퍼티를 선언해야 함.
  • 데이터 클래스의 생성자 프로퍼티는 val 또는 var로 선언해야 함.
  • 데이터 클래스에 abstract, open, sealed, inner를 붙일 수 없음.
  • 클래스에서 toString() 등의 기본적인 메소드가 구현됨.
  • 데이터 클래스는 상속받을 수 없음.
  1. value class: 객체를 생성하는 비용을 줄여주는 클래스
    [data class와의 차이점]
  • 기본적으로 구현되는 메소드가 적음.
    (equals(), toString(), hashCode())
  • === 금지
  • val 프로퍼티만 허용
  • 하나의 프로퍼티만 가능
profile
뭐라도 하자
post-custom-banner

0개의 댓글