Compose: Unit 3.(1) Kotlin

Kim, Sujin·2023년 2월 27일
0

Jetpack Compose

목록 보기
4/4
post-thumbnail

Generics

  • 형태
	class className <generic data type> (properties...)
	val instanceName = class<generic data type>(parameters)
  • 예시

    class Question<T>(
    	val questionText: String,
     	val answer: T,
     	val difficulty: String
    )
    
    fun main() {
      	val question1 = Question<String>("Quoth the raven ___", "nevermore", "medium")
      	val question2 = Question<Boolean>("The sky is green. True or false", false, "easy")
      	val question3 = Question<Int>("How many days are there between full moons?", 28, "hard")
    }

Enum Classes

  • 가능한 값 집합이 제한되어 있는 유형

  • 언제 필요한가? -- 만약 위의 예시의 difficulty가 easy, medium, hard로 정의되어 있다면,

    • 실수로 값을 잘못 입력할 경우 버그가 발생
    • medium을 average로 이름을 바꿀 경우 모두 업데이트 필요함
    • 다른 문자열을 사용하는 실수를 방지할 방법이 없음
    • difficulty가 더 추가될 경우 코드 관리가 어려워짐
  • 형태

    enum class className(
    	CASE1,   
    	CASE2
    )

    ,로 구분하고, 상수 이름을 모두 대문자로 표기한다.

    className.caseName : . 연산자를 사용하여 참조한다.

  • 예시

    enum class Difficulty {
      EASY, MEDIUM, HARD
    }
    
    class Question<T>(
      val questionText: String,
      val answer: T,
      val difficulty: Difficulty
    )
    
    val question1 = Question<String>("Quoth the raven ___", "nevermore", Difficulty.MEDIUM)
    val question2 = Question<Boolean>("The sky is green. True or false", false, Difficulty.EASY)
    val question3 = Question<Int>("How many days are there between full moons?", 28, Difficulty.HARD) 
    

Data Classes

  • 위의 Question class 처럼, 데이터만 포함하고 메서드가 없는 경우 => data class로 정의 가능
  • data class로 정의하면 일부 메서드가 자동으로 구현됨
    • equals(), hashCode(), toString(), componentN(), copy() 등
  • 형태
    data class className()
  • 특징
    • 생성자에 매개변수 하나 이상 필요 (val or var 표시)
    • abstract, open, sealed, inner 불가능

Singleton, Companion objects

  • 클래스에 인스턴스가 하나만 포함되기를 바라는 경우
    => 해당 클래스의 인스턴스를 하나만 인스턴스화

싱글톤 객체

  • 형태
    object objectName {}
    objectName.propertyName : `.` 연산자를 사용하여 참조한다.
  • 특징
    • 생성자가 포함 X
    • 모든 속성이 { } 안에 정의되고 초기값이 부여된다.
  • 예시
    object StudentProgress {
      var total: Int = 10
      var answered: Int = 3
    }
    
    fun main() {
      ...
      println("${StudentProgress.answered} of ${StudentProgress.total} answered.")
    }

Companion 객체

  • 특징
    - 컴패니언 객체를 사용하여 다른 클래스 내에서 싱글톤 객체를 정의할 수 있다.
    - 클래스 내에서 속성과 메서드에 엑세스할 수 있어 문법이 간결해진다.

Extend properties and functions

  • 예시
    16.dp

  • 해당 데이터 유형의 일부인 것처럼 .으로 액세스할 수 있는 속성과 메서드를 추가한다.

  • 형태

    val typeName.propertyName: dataType
    	property getter
    
    fun typeName.functionName(parameters): returnType { }
  • 예시

    class Quiz {
      val question1 = Question<String>("Quoth the raven ___", "nevermore", Difficulty.MEDIUM)
      val question2 = Question<Boolean>("The sky is green. True or false", false, Difficulty.EASY)
      val question3 = Question<Int>("How many days are there between full moons?", 28, Difficulty.HARD)
    	
      companion object StudentProgress {
          var total: Int = 10
          var answered: Int = 3
      }
    }
    
    val Quiz.StudentProgress.progressText: String
      get() = "${answered} of ${total} answered"
    
    
    fun main() {
      println(Quiz.progressText)
    }

Scope functions

to access class properties and methods

let() => 긴 객체 이름 바꾸기

fun printQuiz() {
  question1.let {
      println(it.questionText)
      println(it.answer)
      println(it.difficulty)
  }
}

apply() => 변수 없이 객체의 메서드 호출

Quiz().apply {
  printQuiz()
}

0개의 댓글