Language/Dart

[Exercism] Raindrops #String #Stringbuffer #immutual

paran21 2022. 9. 11. 23:44

 

https://exercism.org/tracks/dart/exercises/raindrops

 

Raindrops in Dart on Exercism

Can you solve Raindrops in Dart? Improve your Dart skills with support from our world-class team of mentors.

exercism.org

 

주어진 수가 몇으로 나누어지는지에 따라서 다른 소리를 리턴해야하는 문제이다.

String에 +를 이용해서 조건에 맞는 경우 소리를 추가하였다.

class Raindrops {
  String convert(int number) {
    String sound = '';
    
    if (number % 3 == 0) sound += 'Pling';
    if (number % 5 == 0) sound += 'Plang';
    if (number % 7 == 0) sound += 'Plong';
    if (sound == '') sound = number.toString();
    return sound;
  }
}

 

dart의 String은 불변객체(immutual)이기 때문에, +를 사용하면 기존 String 객체(여기서는 sound)가 추가된 것 처럼보이지만 사실은 매번 새로운 객체를 만들고 있다.

이를 확인하기 위해서 hashCode를 확인해보면, 매번 다른 것을 알 수 있다.

class Raindrops {
  String convert(int number) {
  
    String sound = '';
    print(sound.hashCode);
    
    if (number % 3 == 0) sound += 'Pling';
    print(sound.hashCode);
    
    if (number % 5 == 0) sound += 'Plang';
    print(sound.hashCode);
    
    if (number % 7 == 0) sound += 'Plong';
    print(sound.hashCode);
    
    if (sound == '') sound = number.toString();
    print(sound.hashCode);
    
    return sound;
  }
}
Testing started at 11:31 오후 ...
1
294639720
1024999687
106133965
106133965

Process finished with exit code 0

 

 

불변객체를 사용한다면 String이 더 적절하겠지만, 매번 새로운 객체를 생성하는 것이 아니라 mutual 객체를 사용하고 싶다면 Stringbuffer 클래스를 사용하면 된다.

 

class Raindrops {
  String convert(int number) {
    StringBuffer sound = StringBuffer();

    if (number % 3 == 0) sound.write('Pling');
    if (number % 5 == 0) sound.write('Plang');
    if (number % 7 == 0) sound.write('Plong');
    if (sound.isEmpty) sound.write(number.toString());
    
    return sound.toString();
  }

}

 

String 클래스와 비교하기 위해 hashCode를 확인해보면 이번에는 동일한 객체를 수정하기 때문에 항상 같은 값이 출력되는 것을 확인할 수 있다.

class Raindrops {
  String convert(int number) {
    StringBuffer sound = StringBuffer();
    print(sound.hashCode);
    
    if (number % 3 == 0) sound.write('Pling');
    print(sound.hashCode);
    
    if (number % 5 == 0) sound.write('Plang');
    print(sound.hashCode);
    
    if (number % 7 == 0) sound.write('Plong');
    print(sound.hashCode);
    
    if (sound.isEmpty) sound.write(number.toString());
    print(sound.hashCode);

    return sound.toString();
  }

}
Testing started at 11:40 오후 ...
671159104
671159104
671159104
671159104

Process finished with exit code 0

 

'Language > Dart' 카테고리의 다른 글

[Exercism] Anagram #sort!!!!!  (0) 2022.09.21
[Exercism] Rna Transcription  (0) 2022.09.18
[Exercism] Gigasecond #Duration #Named parameter  (0) 2022.09.08
[Exercism] Hamming  (0) 2022.09.08
[Excercism] Space Age #enum  (0) 2022.09.08