04.List — 웹툰PD 지망생 : 정민재
04.List
●/섹션 6. 자료구조 맛보기

04.List

728x90
using System;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            List<int> list;     //빨간줄
        }
    }
}

 

List에 마우스를 올려보니 class 라고 뜬다.

 

즉 List는 class이니 참조형태이다.

 

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();
        }
    }
}
using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();

            //배열 같은 경우에는, 이렇게 바로 접근을 했는데,
            arr[0] = 1;
            
            //List의 경우 다르다. List는 현재 빈 상태이다. 
            list[0] = 1;    //에러            
        }
    }
}

 

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            //int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();

            //배열 같은 경우에는, 이렇게 바로 접근을 했는데,
            //arr[0] = 1;

            //List의 경우 다르다. List는 현재 빈 상태이다. 
            //list[0] = 1;    //에러

            for (int i = 0; i < 5; i++)
            {
                list.Add(i);
            }           
        }
    }
}

제대로 들어간 것을 확인 함

 

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            //int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();

            //배열 같은 경우에는, 이렇게 바로 접근을 했는데,
            //arr[0] = 1;

            //List의 경우 다르다. List는 현재 빈 상태이다. 
            //list[0] = 1;    //에러

            // 동적배열(List) - 넣기
            // [ 0 1 2 3 4 ]
            for (int i = 0; i < 5; i++)
            {
                list.Add(i);
            }

            //c++ 출력방법
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(list[i]);
            }

            //c# 출력방법
            foreach (int num in list)
            {
                Console.WriteLine(num);
            }
                                    
        }
    }
}

 

 

 

배열(Array)에는 없지만, 동적배열(List)에는 있는 기능들

1. 삽입

2. 삭제

 

 

1. 삽입

 

list.Insert() 까지 써서 마우스를 Insert()위로 올려보면

 

어떻게 코드를 짜야 하는지 나온다.

 

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            //int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();

            //배열 같은 경우에는, 이렇게 바로 접근을 했는데,
            //arr[0] = 1;

            //List의 경우 다르다. List는 현재 빈 상태이다. 
            //list[0] = 1;    //에러

            // 동적배열(List) - 넣기
            // [ 0 1 2 3 4 ]
            for (int i = 0; i < 5; i++)
            {
                list.Add(i);
            }

            // 동적배열(List) - 삽입 
            // [ 0 1 2 3 4 ] -> [ 0 1 999 2 3 4 ] 로 만들고 싶다면?
            list.Insert(2, 999);

            //넣기와 삽입은 다른 개념이다. 넣기는 차례대로 그냥 넣는 것이고,
            //삽입은 중간에 데이터를 비집고 넣어 버리는 것이다. (뒤의 데이터들은 +1씩 뒤로 간다)
                        

            //c++ 출력방법
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine(list[i]);
            }

            Console.WriteLine();

            //c# 출력방법
            foreach (int num in list)
            {
                Console.WriteLine(num);
            }

        }
    }
}

근데 출력값이 이상하다?

 

C++ 출력방법과 C# 출력방법의 결과값이 다르다.

 

<C++ 출력방법의 경우>

0

1

999

2

3

5개 밖에 없고

 

<C# 출력방법의 경우>

0

1

999

2

3

4

6개가 정상적으로 나온다.

 

 

문제점 발견

 

 

그러므로 C++출력방법을 i<5에서 i<6으로 수정하였다

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            //int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();

            //배열 같은 경우에는, 이렇게 바로 접근을 했는데,
            //arr[0] = 1;

            //List의 경우 다르다. List는 현재 빈 상태이다. 
            //list[0] = 1;    //에러

            // 동적배열(List) - 넣기
            // [ 0 1 2 3 4 ]
            for (int i = 0; i < 5; i++)
            {
                list.Add(i);
            }

            // 동적배열(List) - 삽입 
            // [ 0 1 2 3 4 ] -> [ 0 1 999 2 3 4 ] 로 만들고 싶다면?
            list.Insert(2, 999);

            //넣기와 삽입은 다른 개념이다. 넣기는 차례대로 그냥 넣는 것이고,
            //삽입은 중간에 데이터를 비집고 넣어 버리는 것이다. (뒤의 데이터들은 +1씩 뒤로 간다)

            //c++ 출력방법
            for (int i = 0; i < 6; i++)
            {
                Console.WriteLine(list[i]);
            }

            //c# 출력방법
            foreach (int num in list)
            {
                Console.WriteLine(num);
            }
                                    
        }
    }
}

 

하지만 이런 하드코딩은 오류를 진짜 알아채기가 힘드므로,

 

최적화 해 줄 필요가 있다.

 

 

list.Count

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            //int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();

            //배열 같은 경우에는, 이렇게 바로 접근을 했는데,
            //arr[0] = 1;

            //List의 경우 다르다. List는 현재 빈 상태이다. 
            //list[0] = 1;    //에러

            // 동적배열(List) - 넣기
            // [ 0 1 2 3 4 ]
            for (int i = 0; i < 5; i++)
            {
                list.Add(i);
            }

            // 동적배열(List) - 삽입 
            // [ 0 1 2 3 4 ] -> [ 0 1 999 2 3 4 ] 로 만들고 싶다면?
            list.Insert(2, 999);

            //넣기와 삽입은 다른 개념이다. 넣기는 차례대로 그냥 넣는 것이고,
            //삽입은 중간에 데이터를 비집고 넣어 버리는 것이다. (뒤의 데이터들은 +1씩 뒤로 간다)
                        

            //c++ 출력방법
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

            Console.WriteLine();

            //c# 출력방법
            foreach (int num in list)
            {
                Console.WriteLine(num);
            }

        }
    }
}

하드코딩으로 오류날까 조마조마 하지말고

 

for ( int i=0 ; i < list.Count ; i++)을 쓰자...!

 

 

 

2. 삭제

 

list.Remove()의 경우, index번호는 없고, 값만 지울 수 있는데,

 

중요한 건 첫 번째로 만나는 값을 지운다는 코드이다.

 

 

List의 단점

using System;
using System.Collections.Generic;

namespace Csharp
{
    class Program
    {
        static void Main(string[] args)
        {
            //한 줄 요약 : 배열 한계점 -> List 출현

            //맵 크기가 정해져있을 때에는 배열이 정말 유용한데, 
            //정말 아쉬운 점은 처음 사용할 때부터 크기가 고정되어 있다는게 큰 단점

            //여유있게 배열 크기 최댓값 1000개로 해볼까?  -> 메모리 낭비
            //int[] arr = new int[1000];

            //작은 사이즈의 배열로 시작했다가, 데이터가 커지면 커질수록 사이즈를 유동적으로 늘릴 수 있는
            //새로운 형태의 배열을 'List'라 한다.

            //List <- 동적 배열

            //참조형태이므로 new를 이용해서 만들자
            List<int> list = new List<int>();

            //배열 같은 경우에는, 이렇게 바로 접근을 했는데,
            //arr[0] = 1;

            //List의 경우 다르다. List는 현재 빈 상태이다. 
            //list[0] = 1;    //에러

            // 1. 동적배열(List) - 넣기
            // [ 0 1 2 3 4 ]
            for (int i = 0; i < 5; i++)
            {
                list.Add(i);
            }

            // 2. 동적배열(List) - 삽입 
            // [ 0 1 2 3 4 ] -> [ 0 1 999 2 3 4 ] 로 만들고 싶다면?
            list.Insert(2, 999);

            //넣기와 삽입은 다른 개념이다. 넣기는 차례대로 그냥 넣는 것이고,
            //삽입은 중간에 데이터를 비집고 넣어 버리는 것이다. (뒤의 데이터들은 +1씩 뒤로 간다)

            // 3. 동적배열(List) - 삭제1 (value)
            // [ 0 1 2 3 3 2 ] -> [ 0 1 3 3 2 ]
            bool success = list.Remove(2);

            // 3. 동적배열(List) - 삭제2 (index)
            // [ index0 index1 index2 index3 ... ]
            // index0번 삭제 
            list.RemoveAt(0);

            // 4. 동적배열(List) - 초기화(= 전체삭제)
            list.Clear();

            //c++ 출력방법
            for (int i = 0; i < list.Count; i++)
            {
                Console.WriteLine(list[i]);
            }

            Console.WriteLine();

            //c# 출력방법
            foreach (int num in list)
            {
                Console.WriteLine(num);
            }

            //List의 단점 - 비효율적(=복사의 필연성)
            // [ 0 1 999 2 3 4 ] -> [ 0 1 2 3 4 4 ] -> [ 0 1 2 3 4 ] 로 만들 때,
            // 뒤에 있던 데이터들이 다 같이 왼쪽으로 한 칸씩 이동 시켜 입력시키고,
            // 맨 마지막 값은 삭제 시키는 이 과정 자체가 비효율적임 
        }
    }
}

 

728x90

' > 섹션 6. 자료구조 맛보기' 카테고리의 다른 글

05.Dictionary  (0) 2021.07.13
02.연습문제  (0) 2021.07.13
01.배열  (0) 2021.07.13