[Dart] 인스턴스의 기본 조작 정리

Sin_B·2023년 5월 30일
1

Dart

목록 보기
7/14

Object Class에 대해 알아보자!

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


대표 메서드 toString/hashCode/operator ==

이번에는 Object 클래스의 대표 메서드 및 프로퍼티를 알아보겠습니다.
우선 메서드클래스 내부에 구현되어 있는 함수를 말하며, 프로퍼티는 클래스나 객체 내부에서 데이터를 저장하고 접근하는 데 사용되는 특정한 속성을 가지고 있는 변수입니다. 다른 용어로는 인스턴스 변수 또는 멤버 변수라고도 합니다.

Object 클래스의 대표 메서드는 다음과 같습니다.

  • toString() / 문자열 표현

    toString() 메서드는 객체를 문자열로 표현하여 반환합니다. 기본적으로, 이 메서드는 객체의 인스턴스를 식별하는 문자열을 반환합니다.

해당 메서드를 오버라이드하여 원하는 결과를 얻도록 있게 수정할 수 있으며, print() 메서드를 사용할 때는 생략해도 상관없습니다.

  • hashCode() / 해시값

    hashCode() 메서드는 객체의 해시 코드를 반환합니다. 해시 코드는 객체를 고유하게 식별하는 정수 값입니다. 객체의 내부 상태에 기반하여 계산되며, 동일한 내용을 가진 두 객체동일한 해시 코드를 가질 수 있습니다.

  • operator ==() / 비교

    operator ==() 메서드는 객체의 동등성을 비교하는 연산자입니다. 두 객체가 동일한지 여부를 판단하여 true 또는 false를 반환합니다. (== 자체가 메서드 명이다.)

해당 메서드를 오버라이드하여 객체의 내용을 비교하는 방식을 변경할 수도 있습니다.

Set과 Map Collection에서는 요소를 검색할 때, ==()보다 비용이 싼 hashCode 비교를 사용합니다.


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

Dart에서 sort() 함수는 Collection 내의 요소를 정렬하는데 사용되는 메서드입니다.
sort() 함수는 내부 요소들은 Comparator를 구현해 비교함수를 제공받아 요소의 순서를 결정하는데 사용합니다. Comparator 함수는 두 개의 요소를 비교하여 정렬 순서를 결정하는 규칙을 정의합니다.

Comparator 함수는 일반적으로 두 개의 인수를 받습니다.
예를 들어, List의 경우 List의 요소 중 두 개를 받아 비교합니다. 비교 함수는 다음과 같은 규칙을 따릅니다.

  1. 비교 결과가 음수인 경우: 첫 번째 요소는 두 번째 요소보다 작은 순서로 정렬된다.
  2. 비교 결과가 양수인 경우: 첫 번째 요소는 두 번째 요소보다 큰 순서로 정렬된다.
  3. 비교 결과가 0인 경우: 두 요소의 순서가 같으며, 상대적인 순서는 유지된다.

Comparator 함수는 일반적으로 익명 함수나 람다 함수로 작성됩니다.

다른 비교 규칙을 적용하고 싶다면 해당 비교 규칙에 따라 비교 로직을 구현하면 됩니다.
이번에는 문자열의 길이에 따라 오름차순으로 정렬해보겠습니다.


Comparator 함수를 구현하면서 다양한 비교 규칙을 적용할 수 있으며, 이를 통해 정렬된 순서를 제어할 수 있습니다.

인스턴스의 복사 shallow/deep copy

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

Dart에서 인스턴스의 복사를 수행하는 방법에는 다음과 같은 두 가지가 있습니다.

  • 얕은 복사(Shallow Copy)

    얕은 복사는 원본 객체의 주소를 복사새로운 객체를 생성합니다.
    즉, 생성한 객체 내부의 참조된 다른 객체는 동일한 메모리를 공유합니다. 따라서 원본 객체나 복사된 객체에서 참조된 객체를 변경하면 두 객체에서 동일한 변경이 반영됩니다.

  • 깊은 복사(Deep Copy)

    깊은 복사는 원본 객체의 내용을 완전히 복제하여 독립적인 객체를 생성합니다.
    모든 속성 값과 참조된 객체까지 모두 복사됩니다. 따라서 원본 객체나 복사된 객체에서 참조된 객체를 변경하더라도 서로에게 영향을 주지 않습니다.

Dart에서는 복사 생성자(Copy Constructor)를 구현하여 인스턴스를 복사할 수 있습니다.
복사 생성자는 이미 존재하는 객체를 기반으로 새로운 객체를 생성하는 역할을 합니다. 이 때, 원본 객체의 속성 값을 복사하여 새로운 객체를 초기화합니다.

다음은 Dart에서 복사 생성자를 사용하여 인스턴스를 복사하는 예시입니다.

book1 객체를 생성한 후 book2book1으로 복사하여 생성합니다. 그리고 book2title 속성을 변경하고 결과를 출력합니다.
결과적으로 book1book2는 각각 독립적인 객체이므로 서로에게 영향을 주지 않습니다.

복사 생성자를 사용하여 인스턴스를 복사하면 객체를 효과적으로 복제할 수 있으며, 객체 간의 독립성을 유지할 수 있습니다.

profile
| App Developer | 제가 한 개발을 읽는 사람이 이해하기 쉽게 쓰려고 노력합니다.

0개의 댓글