본문 바로가기
프로그래밍/python

[python] java 개발자가 배우는 python - List

by 사바라다 2020. 6. 8.

안녕하세요. 오늘은 java 개발자가 배우는 python의 2번째 시간입니다. Java의 배열 및 List와 비교하여 python의 list는 어떤지 확인해보도록 하겠습니다.

List

python의 기본형 타입으로 int, float, string을 배웠습니다. 이런 데이터가 여러개의 순차적인 묶음으로써 필요할 때가 많이 있습니다. 이때 사용할 수 있는 python의 타입이 List 타입입니다.

java에서 List

java에서는 기본적으로 배열을 사용할 수 있습니다. java의 배열은 일반적으로 아래와 같이 사용합니다.

// type[] name = new type[size]
int[] array = new int[10];

위와같이 선언하면 array는 int형의 10개의 사이즈의 크기를 가지는 메모리를 할당받게 됩니다. 그리고 우리는 array를 통해 최대 10개 까지의 int 형타입의 모음을 이용할 수 있게 됩니다.

array[0] = 1;
array[1] = 2;
array[2] = 3;
...

물론 위와같이 각각 초기화 하지 않고 for문을 통해 초기화 한다던지, 아니면 선언하며 초기화 할수도 있습니다. java의 list 강의가 아니므로 스킵하도록 하겠습니다. 그리고 출력은 아래와 같이 for 문을 돌아가면서 할 수 있습니다.

for (int index = 0; index < 10; index++) {
    System.out.println(array[index]);
}

사실 우리는 이렇게 배열로 array를 만들어서 잘 사용하지 않습니다. 이렇게 정적인 배열을 동적으로 사용할 수 있게 해주는 Collection의 ArrayList를 알고 있으니까요.

List<Integer> array = new Arrayist<>();

ArrayList는 일반적으로 위와같이 선언합니다. 일반 배열을 사용할 때보다는 알아야할 지식이 늘었습니다만 (랩퍼클래스, 업케스팅, 제네릭 등) java 개발자들은 일반적으로 Integer ArrayList를 위와같이 선언합니다.

array.add(1);
array.add(2);
array.add(3);

위는 ArrayList에 정수형 타입을 넣고 있는 것입니다. add 메서드는 마지막 index에 값을 추가해주는 메서드입니다. 출력은 아래와 같이 할 수 있습니다.

for (int index = 0; index < array.size(); index++) {
    System.out.println(array.get(index));
}

이렇게 java에서의 list 자료구조를 표현하는 방법을 확인해 보았습니다. 추가로 ArrayList의 매커니즘이 궁금하신 분은 저의 [자료구조] 코드로 알아보는 java의 ArrayList편을 참조해 주시기 조금 더 깊게 이해하실 수 있을 것입니다.

python에서의 List

그렇다면 이제 python에서의 List 타입에 대해서 알아보도록 하겠습니다. python에서 java의 collection과 같이 데이터집합을 container라고 합니다. 그리고 이 중에서도 순차적으로 데이터를 집합하여 가지는 자료구조를 list라고 표현합니다. list는 java의 배열보다는 ArrayList에 좀 더 닮아있습니다.

>>> array = []
>>> type(array)
<class 'list'>

python에서 list를 선언하는 방법은 위와 같습니다. []를 변수에 할당하거나 직접 사용하면 이는 list 타입이 됩니다. 초기화시 []에 미리 값을 [1, 2, 3, 4]와 같이 넣어둘 수도 있습니다.

>>> array.append(1)
>>> array.append(2)
>>> array
[1, 2]

python의 list에 값을넣을 때는 append 함수를 이용할 수 있습니다. 위의 코드를 보시면 1과 2를 array list에 넣습니다. 그리고 list를 print하면 바로 내부의 값이 나옵니다. 사실 이부분도 차이가 있습니다. java의 경우 할당된 변수를 출력하면 내부의 값이 아니라 해당 heap 메모리의 주소가 출력됩니다. java에서 python과 같이 출력되게 하고싶다면 Arrays.toString(array)를 이용할 수 있습니다.

>>> array.append("a")
>>> array.append("b")
>>> array
[1, 2, 'a', 'b']

python은 동적타입의 언어입니다. 따라서 위와 같이 하나의 list에 int 타입과 str 타입이 함께 존재할 수 있습니다. 위의 java 예제에서 처럼 add를 하면 compile 에러가 발생합니다. 하지만 python은 정상적으로 입력이됩니다. 사실 java에서도 generic을 Object로 준다던지 배열을 Object 타입으로 준다면 가능합니다만, Runtime에 예기치못한 에러가 발생할 수 있습니다. 이는 python도 마찬가지입니다.

>>> array[0] / 1
1.0
>>> array[3] / 1
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for /: 'str' and 'int'

위는 array를 1로 나누는 예제입니다. 1번과 2번 index에는 int 형이기 때문에 정상처리가 되지면 3번, 4번 index의 값은 string value이기 때문에 에러가 출력되는 것입니다.

개인적으론 list에서 정저타입을 사용하 수 있다면 사용하는게 python에서도 좋지 않을까 생각이 듭니다.

  • 추가적으로 알아본 결과 python 3.6 버전 이후부터는 List에서 정적타입을 사용할 수 있도록 되었다고 합니다. 이것에 관련해서는 다음에 추가적으로 알아보도록 하겠습니다.

마무리

오늘은 이렇게 python의 list 타입에 대해서 알아보는 시간을 가져봤습니다. 확실해 예제를 만들면서도 python이 java보다는 사용하기 편하구나.. 라는 생각이 많이 듭니다. 모두 화이팅 하시기바랍니다. :)

감사합니다.

참조

https://wikidocs.net/14

https://docs.python.org/ko/3/tutorial/introduction.html#lists

댓글