Dart 기본 문법 (7) - Object 클래스

데구르르·2023년 12월 7일
0

Flutter

목록 보기
7/17

인스턴스 기본 조작

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

Object 클래스의 대표 메서드 및 프로퍼티에는 toString(), == operator, hashCode가 있다.

toString()

객체의 문자열 표현을 반환하게 해준다. 이 메소드를 구현하지 않으면 기본으로 객체는 Instance of 클래스이름 형태로 출력된다. 이는 보기 좋은 표현이 아니기 때문에 toString()을 재정의해서 원하는 방식으로 객체를 출력할 수 있게 해준다. 즉, 객체를 더 현실세계의 상황에 맞게 출력할 수 있게 해준다.

== 연산자

객체의 reference를 비교하는데 쓰인다. 자바의 equals 메소드와 기능이 같으며, 객체의 주소값뿐 아니라 프로퍼티까지 같은지 알려준다.

객체의 프로퍼티 하나하나가 다 같으면 두 객체가 같다라고 정의하고 싶으면 프로퍼티에 대한 동등성을 검사하는 코드를 써줘야 한다.


  bool operator == (Object other) =>
      identical(this, other) ||
          other is Book &&
              runtimeType == other.runtimeType
              && title == other.title
              && publishDate == other.publishDate;

sort()

List.sort() 메소드는 컬렉션 내부를 정렬해준다. 하지만, sort 메소드를 사용하려면 Comparator를 구현해야 한다.

final names = ['Seth', 'Kathy', 'Lars'];
names.sort((a,b) => a.compareTo(b));
print(names);

우선 클래스에서 comparable 인터페이스를 implement 받고, compareTo 메소드를 구현해야 한다. compareTo메소드는 a, b 두개의 인자를 받고 다음 규칙대로 리턴한다.

  • a 가 b 보다 작으면 음수 (-1)
  • 같으면 0
  • a 가 b 보다 크면 양수 (+1)

Deep copy

Book book1 = Book('Harry Potter');
Book book2 = book1;

shallow copy의 예시이다. 만약 book2.title = ‘Lord of Rings’ 로 한다면? person1.title도 ‘Lord of Rings’로 바뀐다… 이는 두 객체가 같은 주소를 사용하고 있기 때문이다.

이런 문제를 방지하려면 deep copy를 사용하여 새로운 주소를 갖는 객체에 값을 복사해와야 한다. 하지만, 다트에서는 deep copy를 따로 지원하지 않아 아래와 같은 메소드를 따로 구현해줘야 한다.

Book copyWith({
    String? title,
  }) {
    return Book(
      title: title ?? this.title,
    );
  }
profile
개발 기록

0개의 댓글