인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

(알 수 없음)님의 프로필 이미지

작성한 질문수

[코드팩토리] [입문] Dart 언어 4시간만에 완전정복

Set 인덱스 접근 질문입니다

작성

·

80

0

코드팩토리 디스코드에 질문하면 더욱 빠르게 질문을 받아 볼 수 있습니다!

[코드팩토리 디스코드]
https://bit.ly/3HzRzUM

 

- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요!
- 먼저 유사한 질문이 있었는지 검색해보세요.
- 서로 예의를 지키며 존중하는 문화를 만들어가요.
- 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.

 

 

 

안녕하세요! 강의 잘 듣고 있습니다 ㅎㅎ

다름이 아니라 Set에 대해서 추가적으로 공부하고 있는데 Set은 순서가 없는 타입이라 인덱스로 접근이 불가능하다고 알고 있습니다

 

근데 아래 코드를 보면

출처 https://aidenarea.tistory.com/entry/Dart-Set-%EC%B4%9D%EC%A0%95%EB%A6%AC

Set set1 = {'value1', 'value2', 'value3', 'value4'};
print(set1.elementAt(0)); // value1

인덱스를 통해 값을 가져오는 방법을 소개하고 있습니다

이건 어떻게 가능한 건지 알려주시면 감사하겠습니다!

답변 2

0

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

Dart의 Set는 Iterable을 implement하기 때문에 순서 보전이 되는걸로 보입니다.

감사합니다!

(알 수 없음)님의 프로필 이미지

답변 주셔서 감사합니다! 순서 보전이 되는데

Set set1 = {'value1', 'value2', 'value3', 'value4'};
print(set1[0]);

위와 같이 인덱스를 통한 접근이 불가능한 이유가 있을까요?

 

그리고 분명 다트 언어의 공식 문서에는 순서가 없다고 되어 있는데 이 부분이 조금 헷갈립니다 ㅠㅠ

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

Screenshot 2024-12-29 at 9.57.40 AM.png.webp

공식 문서에서 가져온 정의입니다.

볼 수 있다싶이 inherited 즉 iterable의 기능입니다.

Set는 Iterable을 implement 하기 때문에 사용이 가능해지는 것이고 말씀하신 인덱스 접근은 iterable 고유의 기능이 아니라 List의 기능일걸로 생각됩니다.

Dart 공식 문서에서는 순서가 없다고 정의돼있지 않습니다. 아래 첨부 해드리겠습니다.

Screenshot 2024-12-29 at 9.58.54 AM.png.webp

감사합니다!

(알 수 없음)님의 프로필 이미지

답변 주셔서 감사합니다 ㅎㅎ

올려주신 이미지를 보면

A HashSet is unordered, which means that its iteration order is unspecified

해시셋은 순서가 정해지지 않았다고 하는데 이 부분이 순서가 없다는 내용이 아닌지 질문드립니다(헷갈려서 재질문드립니다..! ㅠㅠ)

 

그리고 저 문구 외에도

또한

4.PNG.webp

 공식 문서에 이렇게 쓰여 있는데 확인 부탁드립니다!

 

 

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

말씀하신 부분 모두 맞게 읽으신 것 같습니다.

어떤 부분을 확인해드리면 될까요?

감사합니다!

(알 수 없음)님의 프로필 이미지

답변 주셔서 감사합니다 ㅎㅎ

제 질문의 요지는 지식 공유자님께서 "Dart 공식 문서에서는 순서가 없다고 정의돼있지 않습니다."라고 말씀 주셨는데 공식 문서에 "해시셋은 순서가 정해지지 않았다" 이 부분과 제가 밑줄 친 내용에 "Dart의 세트는 고유한 항목의 순서 없는 컬렉션입니다." 이 부분에 순서가 없다고 되어 있어서 Set에 순서가 있는 건지 없는 건지 혼란스러워서 재질문 드립니다..!

 

추가)

또한 공식 문서를 좀 더 찾아봤는데

4.PNG.webp

순서가 없어서 인덱스로 Set의 항목을 가져올 수 없다는 문장도 발견했습니다. 제가 이해를 잘못한 건지 어렵네요 ㅠㅠ

번거로우실텐데 항상 답변 주셔서 감사합니다! 미리 새해 복 많이 받으세요~

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

Set는 말씀하신대로 전통적으로 순서를 보장해주지 않는게 맞습니다.

하지만 Set는 다양한 implementation이 있습니다. (Dart에서 말씀드리는게 아니라 자료구조 개념에서 다양한 Set의 subset이 존재합니다.)

제가 처음 보내드린 스크린샷에서처럼 HashSet은 Unordered입니다.

LinkedHashSet은 이름에서도 알 수 있다싶이 Ordered입니다. LinkedList를 생각해보시면 됩니다.

Set의 기본 implementation은 LinkedHashSet입니다. 공학적으로 그렇다는게 아니라 Dart에서 그렇습니다.

그렇기 때문에 순서 유지가 가능합니다.

이외에 말씀하신 부분중에 틀리게 말씀하신 부분이 전혀 없습니다.

감사합니다!

(알 수 없음)님의 프로필 이미지

아아 이해가 됐습니다 번거로우실텐데 상세한 답변 너무 감사합니다

정리하자면 원래 Set은 순서가 없는 게 맞는데 다트 언어는 기본적으로 Set이

LinkedHashSet이고 LinkedHashSet은 순서가 있다는 말씀이시군요 ㅎㅎ

0

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다.

Set은 일반적으로 순서가 없는 집합을 의미하지만, Dart에서는 elementAt 메서드를 사용하여 특정 위치의 요소를 가져올 수 있습니다. 이는 Set 내부에서 데이터가 저장된 순서로 인덱스를 매겨 접근할 수 있는 방법을 제공하죠.

Dart의 Set은 내부적으로 리스트를 사용하여 데이터를 저장하기 때문에 가능한 기능입니다. 하지만 Set이 제공하는 유일성과 무순서성을 유지하면서, 내부 구현에서 순서를 약간 허용하는 방법이라고 이해하면 됩니다. 즉, elementAt 메서드는 특정 인덱스에 위치한 요소를 가져오는 데 유용하다고 할 수 있습니다.

추가적으로 참고하실 수 있는 관련 설명이 있는 블로그 포스트를 소개드립니다.
- Dart Set 총정리 - Aiden의 방식: 이 블로그에서는 Dart Set의 다양한 기능과 사용법을 설명하고 있으며, elementAt 메서드를 어떻게 사용하는지에 대한 예시도 포함되어 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.