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

chobo님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

List<ArraySegment<int>> 출력 문제에 대해 질문드립니다!

작성

·

104

0

[ Session #3] 강의를 보면 List<ArraySegment<byte>>가 등장하길래 

아래와 같은 예제를 작성해보았습니다.

[예제 1] ★

public class Hello1
{
    public static void Main()
    {
        int[] array = { 10, 20, 30, 40, 50, 60, 70, 80, 90 };
        
        List<ArraySegment<int>> list = new List<ArraySegment<int>>();
        
        ArraySegment<int> segment1 = new ArraySegment<int>(array, 0, 2); // 10, 20
        ArraySegment<int> segment2 = new ArraySegment<int>(array, 4, 3); // 50, 60, 70
        
        list.Add(segment1);
        list.Add(segment2);

        for(int i = 0; i < list.Count; i++)
            Console.WriteLine(list[i]);
     }
}

[출력]

System.ArraySegment`1[System.Int32]

System.ArraySegment`1[System.Int32]

[질문 1]

제가 원하는 출력값은 

10

20

50

60

70 인데

ToString을 어디에 어떻게 정의해야 될 지 잘 모르겠습니다... 예제 코드를 알려주시면 정말 감사드립니다ㅜ

[질문 2] 

ArraySegment<int> elems = new ArraySegment<int>(new[] { 1, 2, 3 });
foreach (var item in elems)
{
   Console.WriteLine(item);
}
[출력]
1
2
3

위에 언급한 [예제 1]을 foreach로 돌리면 아래와 같은 출력이 됩니다. 

[출력]

System.ArraySegment`1[System.Int32]

System.ArraySegment`1[System.Int32]

분명히 list에는 [10][20][50][60][70]이 들어갔는데 foreach로 출력되지 않은 이유를 모르겠습니다...

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

ArraySegment은 대단한 기능을 하는 것이 아니고
내부적으로 Array(원본 배열), Offset(시작 위치), Count(데이터 개수) 삼총사로
[배열의 일부]를 표현하고 있습니다.

예제2에서 하신 것처럼 foreach를 자연스럽게 사용할 수는 있기는 하지만,
이는 어디까지  ArraySegment가 IEnumerable 인터페이스를 구현하고 있기 때문입니다. (즉 편의성을 위함)

예제1에서 list에 [10][20][50][60][70]이 들어갔다고 했는데,
정확히 말하면 list에는 ArraySegment 2개가 들어간 것입니다.
ArraySegment는 배열의 일부 영역을 "찝어주는" 개념이지
딱히 어떤 데이터가 들어간 것은 아닙니다.

그러니 list를 순회하면서 안에 있는 데이터를 출력하면,
list 안에는 ArraySegment이 있고, 이에 대한 ToString()을 해준 것이니
System.ArraySegment`1[System.Int32]
이 출력되는 것입니다.

결과적으로 원하시는 것처럼 데이터를 쏙쏙 뽑아내려면
다음과 같이 할 수 있습니다.

0

chobo님의 프로필 이미지
chobo
질문자

출력에 대해 정말 고민 많이 했는데 친절한 답변 정말 감사드립니다!! 

chobo님의 프로필 이미지

작성한 질문수

질문하기