인스턴스의 기본조작

ssh·2023년 12월 7일
0

dart

목록 보기
11/22

Object class

  • Dart의 Object 클래스는 모든 클래스의 기본 클래스이다.
  • 즉, 모든 클래스의 부모 클래스라고도 볼 수 있는 Object 클래스는 객체의 기본 동작을 정의하고, 객체 간의 관계를 확인할 수 있는 기능을 제공한다.
  • 또한, 모든 클래스가 Object의 메서드와 프로퍼티를 가지고 있기 때문에, Object 타입 변수에 모든 인스턴스를 대입할 수 있다.

기본 기능

  1. 모든 클래스는 Object 클래스의 메서드와 프로퍼티를 가지고 있다
  2. Object 타입 변수에는 모든 인스턴스를 대입할 수 있다.

<Object 클래스의 대표 메서드 및 프로퍼티>

toString() / 문자열 표현

  • toString() 메서드는 객체를 문자열로 표현하여 반환한다.
  • 기본적으로, 이 메서드는 객체의 인스턴스를 식별하는 문자열을 반환한다.
  • 해당 메서드를 오버라이드하여 원하는 결과를 얻도록 있게 수정할 수 있으며, print() 메서드를 사용할 때는 생략해도 상관없다.

hashCode() / 해시값

  • 다트는 메모리상의 주소를 확인할 수 없다.
  • hashCode가 메모리 주소번지 같은 느낌으로 보면 크게 무리가 없다.
  • 해시값 같게 하려면 ==연산자를 재정의해 사용한다.
  • hashCode() 메서드는 객체의 해시 코드를 반환한다.
  • 해시 코드는 객체를 고유하게 식별하는 정수 값이다.
  • 객체의 내부 상태에 기반하여 계산되며, 동일한 내용을 가진 두 객체는 동일한 해시 코드를 가질 수 있다.
  • Set, Map의 동작 원리
    • Set, Map 계열은 요소를 검색할 때 hashCode를 사용하여 빠르다.
      • List는 순차검색이라 느리다.
        1. 모든 객체는 해시값을 가진다.
        2. 동일한 객체는 항상 같은 해시값을 가진다.

==() 연산자 / 비교

  • operator ==() 메서드는 객체의 동등성을 비교하는 연산자다.
  • 두 객체가 동일한지 여부를 판단하여 true 또는 false를 반환한다. (== 자체가 메서드 명이다.)
  • 해당 메서드를 오버라이드하여 객체의 내용을 비교하는 방식을 변경할 수도 있다.
  • Set과 Map Collection에서는 요소를 검색할 때, ==()보다 비용이 싼 hashCode 비교를 사용한다.
  • 참조의 비교
    • == 연산자를 재정의 하여 나만의 동일성 규칙을 정의할 수 있다.
  • 예제
    • 코드
      
        bool operator ==(Object other) =>
            identical(this, other) ||
                other is Book &&
                    runtimeType == other.runtimeType &&
                    _title == other._title;
      
        
        int get hashCode => _title.hashCode ^ _publishDate.hashCode;

인스턴스(Instance)의 순서 결정 Sort

  • Dart에서 sort() 함수는 Collection 내의 요소를 정렬하는데 사용되는 메서드다.

  • sort() 함수는 내부 요소들은 Comparator를 구현해 비교함수를 제공받아 요소의 순서를 결정하는데 사용한다.

    💡 names.sort(a , b) ⇒ a.compareTo(b);

    • object가 같으면 0을 리턴
    • a가 b보다 작으면 음수(-1)
    • a가 b보다 크면 양수(+1)
  • Comparator 함수는 두 개의 요소를 비교하여 정렬 순서를 결정하는 규칙을 정의한다.

  • Comparator 함수는 익명 함수나 람다 함수로 작성된다.

  • Comparator 함수는 두 개의 인수를 받는다.

    • List의 경우 List의 요소 중 두 개를 받아 비교한다.
      비교 함수는 다음과 같은 규칙을 따른다.
      • 비교 결과가 음수인 경우: 첫 번째 요소는 두 번째 요소보다 작은 순서로 정렬된다.
      • 비교 결과가 양수인 경우: 첫 번째 요소는 두 번째 요소보다 큰 순서로 정렬된다.
      • 비교 결과가 0인 경우: 두 요소의 순서가 같으며, 상대적인 순서는 유지된다.

인스턴스의 복사 shallow/deep copy

개요

  • 인스턴스의 복사란, 이미 생성된 객체의 내용을 복제하여 새로운 객체를 생성하는 것을 말한다.
  • 복사된 객체는 원본 객체와는 독립적인 상태이며, 동일한 속성 값을 가지지만 메모리 주소가 다르다.

방법

얕은 복사(Shallow Copy)

  • 얕은 복사는 원본 객체의 주소를 복사해 새로운 객체를 생성한다.
  • 생성한 객체 내부의 참조된 다른 객체는 동일한 메모리를 공유한다.
  • 즉, 얕은 복사는 객체(리스트 등)가 다른 변수에 할당될 때,
    그 객체의 참조(메모리 주소)가 복사되는 것을 의미한다.
  • 따라서 원본 객체나 복사된 객체에서 참조된 객체를 변경하면 두 객체에서 동일한 변경이 반영된다.

깊은 복사(Deep Copy)

  • 깊은 복사는 원본 객체의 내용을 완전히 복제하여 독립적인 객체를 생성한다.
  • 모든 속성 값과 참조된 객체까지 모두 복사된다.
    따라서 원본 객체나 복사된 객체에서 참조된 객체를 변경하더라도 서로에게 영향을 주지 않는다.
  • 직접 작성하거나 플러그인이나 라이브러리를 활용한다
  • 예제
    • 코드
      /// 깊은 복사
        Book copyWith({
          String? title,
          DateTime? publishDate,
          String? comment,
        }) {
          return Book(
            title: title ?? _title,
            publishDate: publishDate ?? _publishDate,
            comment: comment ?? _comment,
          );
        }
      // copyWith를 사용하여 깊은복사
        final Book copyBook = originalBook.copyWith(
            title: '복사본',
            publishDate: DateTime(2023, 12, 11),
            comment: '이 책은 ${originalBook.title}의 복사본이다.');

0개의 댓글

관련 채용 정보