리스트

순서를 가지는 객체의 모음이다.

list_1 = []	# 빈 리스트 	
list_2 = [0, 1] # 정수타입
list_3 = ['a', 'b', 'c'] # 문자타입
list_4 = [0, 1, 'a', 'b'] # 정수와 문자타입
list_5 = [0, ['a', 'b']] # 리스트는 리스트를 요소로 가질 수 있다.

 

0개 이상의 요소를 콤마로 구분하며 전체 요소는 대괄호로 감싼다.

 

값을 참조할 때는 대부분의 프로그래밍 언어에서 사용되는 배열과 마찬가지로 인덱스로 접근할 수 있다.

 

역시 첫 번째 인덱스는 0으로 시작한다.

 

>>> list_1 = []
>>> list[0]
Traceback (most recent call last):
  File "<pyshell#1>", line 1, in <module>
    list[0]
TypeError: 'type' object is not subscriptable
# 비어있기 때문에 값을 참조할 수 없다.

>>> list_2[1]
1

>>> list_3 = ['a','b']
>>> list_3[0]
'a'

>>> list_5[1][1]
'b'

 

리스트 내부에 리스트 요소는 다차원 배열의 접근과 유사하다.

 

함수

리스트는 다양한 함수를 사용해서 다룰 수 있다.

 

 

append

리스트 맨 끝에 요소를 추가한다.

>>> list_functions = []
>>> list_functions.append('a')
>>> list_functions.append('b')
>>> list_functions
['a', 'b']

 

insert

지정한 위치에 요소를 추가할 수 있다.

>>> list_functions.insert(0, 'aa')
>>> list_functions
['aa', 'a', 'b']
# 지정한 인덱스에 요소가 추가되고 그 뒤로 기존 요소들이 한칸씩 밀린.

 

pop

리스트의 마지막 요소를 반환 후 삭제한다.

>>> list_functions.pop()
'b'
>>> list_functions
['aa', 'a']

# 요소를 반환 후 해당 리스트에는 제거됨

 

remove

지정한 값과 동일한 요소를 삭제한다.

>>> list_functions = ['a', 'a', 'b']
>>> list_functions.remove('a')
>>> list_functions
['a', 'b']
# 동일한 요소가 있을 경우 먼저 나오는 요소가 제거된다.

 

index

요소의 인덱스를 반환한다.

>>> list_functions.index('a')
0
>>> list_functions.append('a')
>>> list_functions.index('a')
0
# 동일한 요소가 있을 경우 먼저 나오는 요소의 인덱스를 반환

 

count

리스트 내에서 지정한 값과 동일한 요소의 개수를 반환한다.

>>> list_functions.count('a')
2

 

sort

요소들을 정렬한다. 

>>> list_char = ['d', 'a', 'e', 'c', 'b']
>>> list_int = [3, 2, 5, 4, 1]
>>> list_char.sort()
>>> list_int.sort()
>>> list_char
['a', 'b', 'c', 'd', 'e']
>>> list_int
[1, 2, 3, 4, 5]

오름차순으로 정렬되는 것으로 보이지만 정확하게는 기본값이 오름차순이고 이는 함수의 매개변수를 통해 설정가능하다.

>>> list_char_inc = ['d', 'a', 'e', 'c', 'b']
>>> list_char_dec = ['d', 'a', 'e', 'c', 'b']
>>> list_char_inc.sort(reverse=False) # defualt가 False이기 때문에 매개변수가 없으면 오름차순
>>> list_char_dec.sort(reverse=True)
>>> list_char_inc
['a', 'b', 'c', 'd', 'e']
>>> list_char_dec
['e', 'd', 'c', 'b', 'a']

 

reverse

요소들을 역순으로 정렬한다.

>>> list_char = ['d', 'a', 'e', 'c', 'b']
>>> list_char.reverse()
>>> list_char
['b', 'c', 'e', 'a', 'd']

 

clear

리스트의 요소를 모두 제거한다.

>>> list_clear = [1, 2, 3, 4, 5, 6]
>>> list_clear
[1, 2, 3, 4, 5, 6]
>>> list_clear.clear()
>>> list_clear
[]

 

728x90
반응형

Collections

. Net Framework에서 사용되던 라이브러리이다. Generic 기능이 도입되기 이전에 사용되었으며 Collections의 클래스들은 모든 요소를 object 타입으로 처리하여  요소를 다룰 때에 형변환을 필요로 한다.

 

대표적의로 ArrayList, Hashtable, sortedList, Stack, Queue 등이 있다.

 

Generic

Collections의 클래스들은 형변환이 필요하기 때문에 잘못된 타입을 사용할 경우 에러가 발생하게 된다. 

이 문제를 해결하기 위해서 안정성을 제공하는 새로운 클래스들이 Generic 네임스페이스로 추가되었다.

 

대표적으로 List, Dictionary, Queue <T>, Stack <T> 등이 있다.

 

 

Collections Generic
ArrayList List<T>
Hashtable Dictionary<TKey, TValue>
Queue Queue<T>
Stack Stack<T>

 

Compare

옛날부터 작성된 코드인 경우에는 Collections 라이브러리를 사용하기 위해서 해당 네임스페이스를 선언해 주는 경우가 많다. 거기다 새로 추가된 Generic도 사용하기 위해서 두 라이브러리를 모두 선언하는 경우가 많은데 공식 문서에 따르면 Collections에서 사용하는 클래스들은 Generic에 안정성이 추가된 대체할 수 있는 클래스들이 있기 때문에 되도록이면 Generic만 사용하기를 권장한다.

 

대표적으로 ArrayList와 List<T>를 비교해 본다. 

using System;
using System.Collections;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        // ArrayList
        ArrayList arrayList = new ArrayList();

        // 요소 추가
        arrayList.Add("Hello");
        arrayList.Add(30);
        arrayList.Add(true);

        // 요소 접근
        string str = (string)arrayList[0];
        int num = (int)arrayList[1];
        bool flag = (bool)arrayList[2];

        Console.WriteLine(str);  // 출력: Hello
        Console.WriteLine(num);  // 출력: 30
        Console.WriteLine(flag); // 출력: True
        
        // List<T>
        List<object> list = new List<object>();

        // 요소 추가
        list.Add("Hello");
        list.Add(30);
        list.Add(true);

        // 요소 접근
        string str = list[0];
        int num = list[1];
        bool flag = list[2];

        Console.WriteLine(str);  // 출력: Hello
        Console.WriteLine(num);  // 출력: 30
        Console.WriteLine(flag); // 출력: True
    }
}

arrayList와 list 변수 모두 가변 배열로 요소를 추가하고 인덱스로 접근하여 값을 사용하고 있다.

하지만 사용법에서 차이가 발생한다.

 

ArrayList는 Add 메서드를 사용하여 요소를 추가하고 접근할 때에는 형변환을 수행해야 한다. 모든 요소를 object 타입으로 처리하므로 요소를 사용하기 전에 타입을 캐스팅해야 한다.

 

하지만 List 요소의 타입은 컴파일 시점에 검사 되기 때문에 추가한 요소에 접근할 때 형변환이 따로 필요하지 않다. 

즉 Generic을 사용하게 되면 타입의 안정성이 보장되고 컴파일러가 타입을 검사를 수행하기 때문에 타입으로 인해 발생하는 문제를 사전에 발견할 수 있으며 형변환 코드를 작성할 필요가 없기 때문에 코드가 간결해진다.

728x90
반응형

+ Recent posts