SturdyCobble's Study Note

[프로그래밍] 2.7 자료형[4] - 배열과 리스트(2) 본문

휴지통/['19.06-'20.07]프로그래밍101

[프로그래밍] 2.7 자료형[4] - 배열과 리스트(2)

StudyingCobble 2019. 7. 29. 22:22

NOTICE : 독학인 만큼, 잘못된 내용이 있을 수 있습니다. 내용 지적은 언제나 환영합니다.

더 이상 이 블로그에는 글을 올리지는 않을 예정입니다. 그렇지만 댓글을 달아주시면 최대한 답변드리고자 노력하겠습니다.


※이 글은 프로그래밍 언어에 대한 기초적인 이해를 가정하고 있습니다. 최소 프로그래밍 언어 하나 정도를 약간이라도 접해보시는 것을 추천합니다. 또한, 이 글은 심화 내용은 되도록 피하여 서술했습니다.

 

아래 표는 이번 글의 범위입니다. (저번 글까지 포함)

  C/C++ Java Python
배열(저번 글) O O  
리스트   O O

 

이번 글에서는 본격적으로 Java와 Python의 List에 대해 알아보겠습니다. 아래는 리스트를 선언하는 코드입니다.

 

ArrayList list01 = new Arraylist();
LinkedList list02 = new LinkedList();

list_py = [0,1,2,3,4,5]

Java에서는 여러가지 종류의 List를 지원하며, 대표적인 두 개만 나타내보았습니다. 또한, 배열과 같이 초기화하는 것이 불가능합니다. Python의 경우 대괄호 [ ]를 사용하며, 다른 언어의 배열과 사용 방법이 매우 유사합니다.

 

 만약 Java에서 리스트를 초기화하고 싶다면, 배열을 리스트로 변환시키거나 선언과 함께 원소들을 추가해주는 방법을 생각해볼 수 있습니다. 이 부분에 대해서는 생략하겠습니다.

 

리스트의 장점은 자유롭게 원소들을 추가하고 제거할 수 있다는 점입니다. 간단하게 생각해 볼 수 있는 동작은 '추가하기', '지우기', '특정 인덱스의 값 알아내기', '길이 구하기' 등이 있습니다. 이러한 동작들은 Java와 Python에서 다음과 같이 수행됩니다.

 

ArrayList list101 = new ArrayList();

list101.add("Add to the end"); //마지막에 추가
list101.add(0,"Add to 0th index"); //특정 인덱스 자리에 추가

element01 = list101.get(1); //인덱스 1인 원소의 값 얻어옴

System.out.println(list101.contains("Hello"));  //contains로 "Hello"의 포함 여부 확인

System.out.println(list101.size()); //리스트의 크기(길이)

list101.remove(1); //인덱스 1인 원소 삭제
list101.remove("Add to 0th index"));  // "Add to 0th index" 삭제(첫번째로 나오는 것을 삭제)

 

list101 = []

list101.append("Add to the end")  //마지막에 추가
list101.insert(0,"Add to 0th index") //특정 인덱스 자리에 추가

element01 = list101[1] //인덱스 1인 원소의 값 얻어옴

print(list101.count("Hello"))  //count로 "Hello"의 포함 갯수 출력

print(len(list101)) //리스트의 크기(길이)

print(list101.pop(1)) //인덱스 1인 원소 삭제(인덱스 생략 맨 마지막) 후 삭제한 값 출력
list101.remove("Add to 0th index"));  // "Add to 0th index" 삭제(첫번째로 나오는 것을 삭제)

만약, 리스트 두개를 이어 붙인다면, Java와 Python에서는 다음과 같은 코드를 이용할 수 있습니다. (아래 제시된 list01과 list02가 리스트로서 사전에 정의되었다고 가정해봅시다)

list01.addAll(list02);

--------------------------방법1---------
list01.extend(list02)
--------------------------방법2---------
list01 = list01 + list02

 

 

참고로 Java의 경우에는 리스트에 담는 데이터의 자료형을 명시해주는 것이 좋습니다. 만약 이렇게 지정한다면, 잘못된 값을 넣었을 때 오류를 출력하므로 프로그램의 오류를 빨리 캐치해내는데 도움이 되겠죠?

Arraylist<String> strList01 = new ArrayList();

이렇게 < >안에 타입을 지정하는 것을 제너릭스(Generics)라고 하지만, 관련 사항은 여기서 깊이 다루지는 않겠습니다.

이때 <>안에 오는 자료형은 Primitive(기본형)이 아닌 객체 형태여야 합니다. 즉 int는 불가능합니다.(대신 Integer를 쓰면 됩니다. 이 경우 Integer는 int와는 다르게 객체 형태입니다. 이러한 자료형을 Wrapper Class라고 부릅니다. 이에 관해서는 나중에 다시 다루겠습니다. 이 형태의 경우 바로 연산하는 것은 불가능합니다.)

 

Python의 경우 List에 관한 여러가지 도구들을 사용할 수 있지만, (정렬 등) 여기서는 생략하도록 하겠습니다.

 

Python에는 다음과 같이 리스트나 문자열을 슬라이싱하는 독특한 문법이 존재합니다.

list01 = [0,1,2,3,4,5,6,7,8,9,10]
print(list01[2:4])
print(list01[1:10:2])
print(list01[::-1])

위 코드의 실행 결과는 다음과 같습니다.

[2, 3]
[1, 3, 5, 7, 9]
[10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]

(Python의 print는 리스트도 위와 같은 형식으로 자동으로 출력할 수 있습니다.)

 

좀더 구체적으로 알아보자면, 콜론(:)으로 구분된 첫번째 숫자는 시작 위치(인덱스), 두번째 숫자는 끝나는 위치로 시작 위치부터 끝나는 위치 바로 전까지의 리스트를 나타냅니다. 세번째 숫자는 간격으로서 몇 칸씩 건너뛰어가며 읽을지를 나타냅니다.

 

Python 슬라이싱

 

 인덱스에서 음수는 뒤에서 부터 셈을 나타내며, 결국 아래와 같은 예시도 가능합니다.

 

list01 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
print(list01[-1:2:-2])
----------------출력 결과---------------
[10, 8, 6, 4]

(간격이 음수이므로 시작 위치가 끝나는 위치보다 앞에 위치해있습니다.)

 

 

한편, C언어에서 리스트를 구현하려면 지금까지 배운 내용으로는 부족합니다. C++로 리스트를 사용하기 위해서는 list 헤더 파일을 포함하여 다음과 같이 코드를 작성할 수 있습니다.

 

다만, C와 C++을 같이 쓰는 경우가 많고, 위에 소개된 다른 언어만큼 간단하게 활용할 수 있는 것이 아니라 제외하였습니다. 아래는 C++에서 list를 생성하고 몇 개의 원소를 집어넣고 제거하는 예시입니다.

#include<iostream>
#include<list>

using namespace std;

int main(){
	list<int> list01;
	list01.push_back(0);
	list01.push_back(1);
    
	list01.pop_back();
	return 0;
}
Comments