[Flutter]fromMap, toMap, toString, override

wjdguseya_0880·2024년 1월 18일
0

fromMap

  • 클래스에 적용할 수 있는 데이터
Map<String, dynamic>word = {
	"word" : "Apple",
    "meaning" : "사과",
    "example" : "Can I get an apple?"
};

이름있는 생성자 fromMap()

Word.fromMap(Map<String, dynamic> map) : 
	word = map["word"], 
 	meaning = map["meaning"],
  	example = map["example"]

toMap

fromMap의 반대

  • 서버에 해당 객체내용을 보내줘야 할 때 사용
  • Map을 배출해주는 (toMap)멤버 함수 추가,
Map<String, dynamic>toMap() => {
	word = "word", 
 	meaning = "meaning",
  	example = "example",
};

toString

  • int데이터를 String으로 바꾸고 싶을때 사용.
  • 객체가 어떤 객체인지 확인하고 싶을때 toString()을 사용해서 print를 한다.
class Word {
  String word;
  String meaning;
  String example;

  Word({required this.word, required this.meaning, required this.example});
}

void main() {
  Word word = Word(word: "apple", meaning: "사과", example: "Give me an apple");
  print(word);
}

word라는 변수에다가 Word생성자를 통해서 새로운 객체(Instance)가 생성되었다.
이것을 출력하면 flutter: Instance of 'Word' Word의 인스턴스라는 결과가 나온다.

하지만 이건 우리가 원하는 결과 값이 아니다..

여기서 @override를 넣어주면 되는데
@override는 기존의 (부모)기능을 새로 재정의한다 라는 의미이다

class Word extends Object {
  String word;
  String meaning;
  String example;

  Word({required this.word, required this.meaning, required this.example});

  @override
  String toString() {
    return "안녕";
  }
}

void main() {
  Word word = Word(word: "apple", meaning: "사과", example: "Give me an apple");
  Word word1 = Word(word: "Pen", meaning: "펜", example: "Give me an apple");
  Word word2 = Word(word: "Paper", meaning: "종이", example: "Give me an apple");
  Word word3 =
      Word(word: "Dictionary", meaning: "사전", example: "Give me an apple");
  Word word4 = Word(word: "Phone", meaning: "휴대폰", example: "Give me an apple");
  print(word.toString());
  print(word1.toString());
  print(word2.toString());
  print(word3.toString());
  print(word4.toString());
}

@override String toString() { return "안녕"; } } 이것을 추가하면 toString의 값이 더 이상 flutter: Instance of 'Word'이 값이 아닌 우리가 원하는 값인 안녕으로 값이 출력된다

@override
  String toString() {
    return "$word";
  }

잘 나오는지 테스트를 했으니 "$word"를 써주고 값을 받아오면

이렇게 값이 잘 받아와진다. 하지만 이렇게 쓰면 String으로 출력한 느낌이라

  @override
  String toString() {
    return "Word($word)";
  }

Word라는 인스턴스다라는 느낌으로 Word안에다가 넣어주면


이렇게 Word안에서 출력이 된다.

@override
  String toString() {
    return "Word($word / $meaning / $example)";
  }

이렇게 해주면 모든 결과 값을 한번에 다 나오게 할 수 있다.


hascode

3과 3은 같다

print(3 == 3); //ture

"3"과 "3"은 같다

print("3" == "3"); //ture

위에 두개 결과는 우리가 예상한 결과이다.
하지만

class Word extends Object {
  String word;
  String meaning;
  String example;

  Word({required this.word, required this.meaning, required this.example});

  @override
  String toString() {
    return "Word($word / $meaning / $example)";
  }
}

void main() {
  Word wordA = Word(word: 'Apple', meaning: "사과", example: "Give me an apple");
  Word wordB = Word(word: 'Apple', meaning: "사과", example: "Give me an apple");
  print(wordA == wordB);
}

wordA와 wordB는 보기에는 값이 같아 보이지만 false값이 나온다.

이럴때

void main() {
  Word wordA = Word(word: 'Apple', meaning: "사과", example: "Give me an apple");
  Word wordB = Word(word: 'Apple', meaning: "사과", example: "Give me an apple");
  print(wordA.hashCode);
  print(wordB.hashCode); //false
}

hashCode코드를 통해서 보았을 때 각자의 개인 코드를 가지고 있기 때문에 같다라고 할수가 없다.

class Word extends Object {
  String word;
  String meaning;
  String example;

  Word({required this.word, required this.meaning, required this.example});

  @override
  operator ==(Object other) {
    
    print(other);
    return true;
  }
}

void main() {
  Word wordA = Word(word: 'Apple', meaning: "사과", example: "Give me an apple");
  Word wordB = Word(word: 'Apple', meaning: "사과", example: "Give me an apple");
  print(wordA == 3);
  // print(wordB.hashCode);
}

operator == //대입연산자의 대한 행동을 우리가 정의하겠다.

profile
플러터 공부 기록일지

0개의 댓글