데이터 클래스는 특정 프로그래밍 언어에 묶여 있지 않은 개념이며,정보를 표현,캡슐화 및 이동하는 간단한 방법으로 대부분의 프로그래머에게 충분히 편리한 패턴입니다.

데이터 클래스는 필드 및 액세스를위한 크래드 메소드(게터 및 세터)만 포함하는 클래스를 나타냅니다. 이들은 단순히 다른 클래스에서 사용되는 데이터에 대한 컨테이너입니다. 이러한 클래스는 추가 기능을 포함하지 않으며 자신이 소유한 데이터에 대해 독립적으로 작동할 수 없습니다.

일반적으로 데이터 클래스는 실제 엔티티를 나타내며 프로젝트에 수십 또는 수백 개의 이러한 클래스가있는 것이 일반적입니다.

자바의 데이터 클래스

이 데이터 클래스는 일반적으로 자바에서 보이는 방법입니다:

toString(),equals()hashCode()메소드(Object.java클래스에서 선언 됨)를 재정의하고 있음을 알 수 있습니다. 이러한 메서드를 재정의하는 것이 데이터 클래스와 관련된 이유는 무엇입니까?

이 세 가지 방법을 구현할 때 우리는 가치 객체,적절하게 동일한 필드 값을 가진 두 인스턴스가 상호 교환 가능한 것으로 간주되는 클래스를 만듭니다. (참고:완전히 사실이기 위해서는 클래스를 불변으로 만들어야합니다. 최종 필드를 만들고 세터를 제거하는 데 도움이됩니다. 불변성은 종종 좋은 관행으로 간주되며 가능한 경우 권장됩니다)

  • equals() : 기본적으로 두 변수가 동일한 객체를 참조하는 경우,즉 메모리의 위치가 동일한 경우true을 반환합니다. 개체가 동일한 정보를 포함하는 경우,즉 개체가 동일한 엔터티를 나타내는 경우true을 반환하는 이 메서드를 재정의합니다. 이 속성은 동일 확인하고 그들은 같은 값을 포함.
  • hashCode() : 기본적으로 개체의 메모리 주소를 16 진수로 반환합니다. 그것은 즉,동일한 객체가 동일한 해시 코드를 가지고 평등 테스트 중에 개체를 식별하는 숫자 값입니다. 이 메서드는 속성 값에서 계산된 해시 코드를 반환하도록toString()를 재정의할 때 재정의해야 합니다.
  • toString(): 기본적으로 개체 유형과hashCode()(예:[email protected]+)을 반환합니다. 이 메서드는User(name=Steve, surname=Jobs)과 같이 사람이 읽을 수있는 객체 버전을 사용하는 데 재정의합니다.

그런 중요한 개념 임에도 불구하고 위의 자바 코드에서이 클래스를 다른 클래스와 다르게 만드는 것은 없습니다. 프로그래머 때문에 클래스 구조 및 패턴의 데이터 클래스로 인식 할 수 있지만보기의 컴파일러 관점에서,이 클래스는 또 다른 클래스입니다.

데이터 클래스를 만드는 것은 매우 일반적이어서 개발자들은 종종 이데와 다른 플러그인을 사용하여 이러한 반복적인 작업을 돕는다. 자바에서 데이터 클래스를 만드는 고통은 플러그인이나 아이디에 의해 완화 될 수 있지만,대부분의 버그는 그 클래스의 추가 수정에 도입된다. 필드가 제거되거나 추가 될 때마다 모든 컴패니언 메소드를 수정하는 것을 잊어 버리는 것은 매우 쉽습니다.

자바의 데이터 클래스는 언어 지원이 부족합니다. 현대 프로그래밍 언어에 대해 너무 많은 마찰을 나타내는 반복적이고 버그가 발생하기 쉬운 작업입니다.

코 틀린의 데이터 클래스

코 틀린의 동일한 데이터 클래스는 다음과 같습니다:

data class User(var name: String, var age: Int)

코 틀린은data키워드를 도입 일류 시민들에게 데이터 클래스를 올립니다. 의 그것을 분해 할 수 있습니다.

  • 게터와 세터

우리가 속성을 선언 할 때 게터와 세터는 코 틀린 자동으로 생성됩니다. 즉,var name: StringUser클래스가 공용(코 틀린의 기본 가시성),변경 가능(var)및String유형의 속성을 가지고 있음을 의미합니다. 공개 된 것을 감안할 때 게터를 생성하고 변경 가능한 것을 감안할 때 세터를 만듭니다.

클래스를 읽기 전용(설정자 없음)으로 만들려면 다음을 사용해야 합니다val :

data class User(val name: String, val age: Int)

같은 클래스 선언에서valvar을 혼합 할 수 있습니다. 자바에서valfinal변수로 생각할 수 있습니다.

모든 설명 지금까지,그것은 코 틀린 모든 클래스 선언에 공통이지만,data키워드는 여기에 차이를 만드는 것입니다.

  • data키워드

클래스를 데이터 클래스로 선언하면 위에서 설명한 자바 클래스와 동일한 방식으로toString(),hashCode()equals()가 자동으로 구현됩니다. 따라서User("Steve Jobs",56)와 같은 사용자 클래스를 만들고toString()메서드를 호출하면User(name=Steve Jobs, age=56)과 같은 것을 얻을 수 있습니다.

소멸 선언

data키워드는 소멸 선언을 허용하는 함수를 제공합니다. 즉,모든 속성에 대한 함수를 생성하므로 다음과 같은 작업을 수행 할 수 있습니다:

복사 기능

data키워드는 일부 속성의 값을 변경하는 클래스를 복사하는 편리한 방법을 제공합니다. 우리는 나이를 변경하는 사용자의 복사본을 만들려면,이것은 우리가 그것을 할 것입니다 방법입니다:

클래스 본문에 선언된 속성은 무시됩니다

컴파일러는 자동으로 생성된 함수에 대해 기본 생성자 내에 정의된 속성만 사용합니다.

속성addressdata키워드로 처리되지 않으므로 자동 생성 된 구현이 무시된다는 것을 의미합니다.

페어 및 트리플

PairTriple는 라이브러리의 표준 데이터 클래스이지만 코틴 문서 자체는보다 읽기 쉽고 맞춤화 된 데이터 클래스를 선호하여 사용을 방해합니다.

요구 사항 및 제한 사항

  • 데이터 클래스 생성자에 하나 이상의 매개 변수가 있어야 합니다.
  • 모든 매개 변수는val또는var로 시장해야합니다.
  • 데이터 클래스는abstract, open, sealed 또는inner.
  • equals , toString 그리고hashCode메소드는 명시 적으로 재정의 될 수 있습니다.
  • componentN()copy()함수에 대한 명시적 구현은 허용되지 않습니다.
  • copy()함수와 일치하는 서명이 있는 형식에서 데이터 클래스를 파생하는 것은 코 틀린 1.2 에서 더 이상 사용되지 않으며 코 틀린 1.3 에서 금지되었습니다.
  • data클래스는 다른data클래스에서 확장할 수 없습니다.
  • data클래스는 다른 클래스를 확장 할 수 있습니다(코 틀린 이후 1.1)

데이터 클래스는 코 틀린 일류 시민입니다. 매우 짧은 구문에서 그들은 모든 장점과 타협없이 마찰 솔루션을 제공합니다.

안드로이드에 대한 의미

내 안드로이드 프로젝트에서 코 틀린 데이터 클래스를 사용하여 발견 한 주요 이점이 무엇인지 설명하려고합니다. 이것들은 전부는 아니며 가장 중요한 것은 아니지만 지금까지 내 경험에서 가장 분명합니다.

  • 데이터 모델

안드로이드의 아키텍처는 뜨거운 주제였다(여전히). 여러 가지 옵션이 있지만 대부분은 공통적으로 우려 사항과 단일 책임 원칙을 분리합니다. 클린 아키텍처-안드로이드 커뮤니티에서 매우 유명한-아키텍처의 다른 계층에 대해 서로 다른 모델을 사용에 중점을두고 좋은 아키텍처를 목표로 할 때 따라야 할 모범 사례의 집합입니다. 즉,3 개 또는 4 개의 다른 데이터 모델을 가진 프로젝트가 표준이됩니다.

이것이 의미하는 바는 프로젝트의 데이터 클래스 수가 매우 많고 생성,읽기,수정,복사,비교,매핑 등의 작업이 데이터 모델 클래스 자동 생성 코드의 이점을 얻는 일상적인 작업입니다. 엄청난 시간을 절약하고 버그를 도입 할 수있는 기회를 줄일 수 있습니다.

  • 더 이상 자동 값

값 유형을 사용하는 것은 특히 데이터 클래스 중에서 안드로이드에서 매우 확장 된 좋은 방법입니다.

값 유형은 변경할 수 없는 값 클래스의 개체입니다.
값 클래스는 동일성이 내용에 따라 달라지는 클래스입니다.
불변 클래스는 생성 후 수정할 수 없는 클래스입니다.

자동 값은 가치 유형을 만드는 데 도움이 구글에서 인기있는 라이브러리입니다. 그것은 그 일을하지만 그렇게 복잡해서는 안되는 것에 대해 매우 장황합니다.

val액세스 한정자와 함께 코 틀린data클래스를 사용하면 값 유형에 충분히 근접 할 수 있습니다.

data class User(val name : String, val age : Int)

이전 사용자 클래스는 훨씬 짧은 구문으로 값 유형에 충분히 가까운 클래스입니다. 좋은 사람들을 위해 자동 값은 코 틀린으로 대체 될 수 있습니다. 적은 코드,주석 처리 없음 및 의존 할 라이브러리가 하나 적습니다.

참고:코 틀린val키워드와 읽기 전용 속성 및 클래스를 제공합니다. 읽기 전용 및 불변은 동일하지 않습니다(더 여기)하지만 일반적으로,실제적인 목적을 위해 충분히 좋은 것으로 간주됩니다.

  • 더 이상 롬복

개발자가 데이터 클래스를 처리 할 때 시간을 절약하려고 시도한 방법 중 하나는 라이브러리를 사용하여 게터와 세터 메서드를 생성하는 것입니다. 롬복은 안드로이드/자바에서(에)유명한 것들 중 하나입니다. 이 라이브러리는 특정 실행 프로세스에서 불러오거나 실행될 수 있습니다 긴 이야기는 짧은 대부분의 개발자를위한 롬복 두통만큼 많은 장점을 가지고,그래서 당신이 사랑 시작하지만 잠시 후,당신은 제거하는 것을 기다릴 수 없어 그 라이브러리가된다 그러나 어디에나 있기 때문에 당신은 결코하지 않습니다.

코 틀린 데이터 클래스가 수동으로 게터/세터 메소드를 작성할 필요가 없다는 점을 감안할 때 롬복의 주요 요구 사항은 사라졌습니다.이 위젯은이 위젯에서 사용할 수 있습니다. 그것은 여러 화면의 모든 응용 프로그램에 있습니다. 리사이클러뷰 어댑터를 구현할 때 한 가지 중요한 구성 요소는 디퓨틸 클래스입니다. 변경 사항(있는 경우)을 어댑터에 전달하기 위해 두 목록 간의 차이를 계산합니다. 전체 목록을 반복해서 새로 고치는 것보다 훨씬 효율적이며 변경 사항을 아름답게 애니메이션합니다.

디푸틸은 항목의 평등에 크게 의존하며,이는 내용이 동일할 때 두 항목이 동일하다는 것을 의미한다. 즉,두 객체에 동일한 정보가 포함되어 있는지 비교하는 방법이 필요합니다. 이것은 우리가 재정의 할 필요가있는 이유 중 하나입니다equals우리의 자바 데이터 클래스,하지만 코 틀린data클래스와 함께 무료로 제공됩니다.

참고:이 빠른 시작 가이드를 확인하십시오.

  • 테스트

테스트 클래스에서 예상 값이 실제 값과 일치하는지 지속적으로 확인하고 있습니다. 객체 평등 비교(앞에서 설명한 것처럼)는 매우 일반적인 작업입니다.

일반 앱 런타임을 위해equals,toStringtoHash트리플렛을 재정의 할 필요가 없더라도 테스트 목적으로 이러한 메소드를 재정의 할 가능성이 높으므로 코 틀린 데이터 클래스는 변명없이 테스트 경로를 지 웁니다.

부록

코 틀린 데이터 클래스로 작업 할 때 언급 할 가치가있는 다른 일반적인 시나리오에 대해 이야기 해 봅시다. 이것은 데이터 클래스와 엄격하게 관련이 없지만 특히 공통적입니다.

  • 여러 생성자
data class User(val name : String, val age : Int)

이전에 정의한User클래스에서User("Steve", 56)와 같은 인스턴스를 만들 때nameage을 명시 적으로 지정해야합니다.

코 틀린 우리는 경우에 우리는 그 인수에 대한 값을 전달하지 않는 방식으로 인수에 대한 기본값을 정의 할 수 있습니다,기본값이 할당됩니다.

data class User(val name : String, val age :Int = 0)

User("Steve", 56) 여전히 유효하지만 이제 두 번째 생성자User("Steve")가 허용됩니다. 이 경우age값은 0 이 됩니다.

두 매개 변수에 기본값을 할당하여name이 비어 있고age이 0 인 세 번째 생성자User()를 허용 할 수 있습니다.

data class User(val name : String = "", val age : Int = 0)

이제User(),User("Steve")User("Steve",56)모두 유효한 호출입니다.선택적 매개 변수는 생성자의 마지막 매개 변수여야 합니다. 다음은 컴파일되지 않습니다.

data class User(val name : String = "", val age : Int)
val user = User(56) // This doesn't compile

또 다른 제한은 선택적 매개 변수가 여러 개 있는 경우 오른쪽에서 왼쪽으로 건너뛰어야 한다는 것입니다.

data class User(
val name : String,
val surname : String = "",
val age : Int = 0
)User("Steve")
User("Steve", "Jobs")
User("Steve", "Jobs", 56)
User("Steve",56) // This wont compile

이 제한을 처리하기 위해 코 틀린 명명 된 인수를 제공합니다. 이를 통해 모든 값에 속한 인수를 지정할 수 있습니다. 이제 성이 기본값에 할당 될User(name = "Steve", age = 56)또는 더 짧은User("Steve", age = 56)와 같은 작업을 수행 할 수 있습니다.

기본 인수와 명명 된 인수는 매우 컴팩트 한 선언에서 여러 생성자와 오버로드를 제공하는 매우 편리한 방법입니다.

  • @모든 자바 측에서 고려 호출을 복용하지 않습니다. 코 틀린은 자바와 상호 운용 가능하므로 자바에서User클래스의 인스턴스를 만들 수 있어야합니다.

    자바에서 사용하지 않을 경우 완료되지만 그렇지 않으면 자바가 명명 된 인수를 제공하지 않는다는 점을 감안할 때@JvmOverloads주석이 필요합니다.

    data class User @JvmOverloads constructor(
    val name : String,
    val surname : String = "",
    val age : Int = 0
    )

    이 작업은 자바에서 호출 할 수 있도록 여러 생성자를 생성합니다.

    참고:가능한 모든 순열을 만드는 것이 아니라 선택적 인수를 오른쪽에서 왼쪽으로 제거하는 결과를 얻는 것을 알아 두는 것이 중요합니다. 자세한 내용은

    • 빌더

    코 틀린 주어진 명명 된 매개 변수 및 기본 인수를 제공합니다,그것은 빌더에 대한 필요성을 덜 수 있습니다. 그 꼭대기에,안드로이드 스튜디오와 같은 현대 십오 이미 쉽게 그냥 가독성을 위해 덜 흥미로운 만들기 읽고 만드는 호출 측에 매개 변수의 이름을 보여줍니다.

    빌더 패턴이 여전히 필요한 경우. 코 틀린은 우리를 도울 특별한 것을 제공하지 않습니다. 코 틀린 빌더 패턴은 다음과 같습니다:

    • 주석

    일부 데이터 모델 클래스에서 주석 처리를 사용하는 것은 매우 일반적입니다. 이 프로그램은 또한 통계 수집을 돕기 위한 모니터 변수를 제공합니다.. 지속성 모델(로컬 저장소/데이터베이스에 저장된 데이터를 나타내는 데이터 클래스)은 종종 룸 또는 영역 주석으로 주석이 지정됩니다.

    코 틀린에서 우리는 여전히 그 주석을 사용할 수 있습니다. 예를 들어 룸 데이터베이스에 저장할 사용자 모델입니다:

    요약

    코 틀린 데이터 클래스는 자바 데이터 클래스와 고통과 좌절에서 학습의 년의 결과입니다. 그들은 모든 장점 및 단점의 없음에 대 한 목표. 그(것)들을 사용하는 것은 아주 간단하고 즐겁 일단 당신이 그것에 익숙해지면,회고하는 것은 아주 어렵다.

    안드로이드에서,그들은 다른 방법으로 우리를 도와하지만 대부분 그들은 많은 시간을 절약하고 버그를 줄일 수 있습니다.

    코 틀린 데이터 클래스는 코 틀린 프로그래밍 언어로서의 좋은 예입니다:간결하고 실용적이며 개발자를위한 기쁨.

답글 남기기

이메일 주소는 공개되지 않습니다.

lg