배열(Array)
많은 수의 데이터를 다룰 때 사용하는 자료구조다.
각 데이터를 인덱스와 1:1 대응하도록 구성한다.
데이터가 메모리 상에서 연속적으로 저장된다.(연결리스트는 아니다.)
배열의 장점 -
인덱스를 이용하여 데이터에 빠르게 접근이 가능하다.
배열의 단점 -
미리 최대길이를 정해서 생성해야한다. 가변길이배열은 배열 크기를 변형할 때마다 새로운 배열을 만들어줘야한다.
배열 시간복잡도 ( Big O )
- 삽입(Insertion) - O(1)(인덱스를 알 때 or 단순 add) / O(n) (인덱스를 모를 때 or 특정 데이터 삽입 시)
- 제거(remove) - O(1)(인덱스를 알 때 or 단순 remove) / O(n) (인덱스를 모를 때 or 특정 데이터 제거 시)
- 접근(access) - O(1)
- 검색(search) - O(n)
자바(배열)
배열을 효과적으로 다루라고 자바에서는 Arrays라는 클래스를 제공해준다고 한다.
만드는 방법은 여러가지가 있다.
- int[] arr1 = {1, 5, 4, 3, 2}; String arr2 = {"Hi", "123", "Developer"};
- char[] arr3 = new char[3]; -> 배열 size는 있으나 무얼 넣을지 정하지 않았을 경우 사용.
- char[] arr4 = new char[]{'a', 'c', 't'}; 같이 사용도 가능.
다차원배열
다차원 배열도 배열과 마찬가지로 만들 수 있다.
2차원인데 행, 열 각각 다른 타입을 지정하는건 불가능하다. 마찬가지로 new를 통한 방법과 초기화하는 방법이 있다.
** 2차원 배열의 경우 for each 문을 사용할 때 1차원 배열을 하나 떼오는 것이기 때문에 for(int[] arr : arr2)같이 써줘야한다.(대충 int[] 타입의 1차원 배열을 떼온다고 생각하면 된다) **
2차원 배열의 경우, 각 행마다 길이가 다른 가변 배열을 만들수도 있다.
주로 사용하는 메소드
예시로 사용하는 변수 => int[] arr1 = {1, 5, 4, 3, 2};
메소드 이름 | 사용 예시 | 설명 |
length | arr1.length | 배열길이 출력함수 다차원배열에서는 맨 앞의 수를 출력한다.(arr[2][3]이면 2) |
clone | arr2=arr1.clone(); | 배열 복사 함 |
배열을 그냥 출력하면 주소값이 출력된다. System.out.println(Arrays.toString(arr));로 해주면 된다.
정렬
Arrays.sort(배열명); 하면 배열이 정렬된다. 역순정렬시, Wrapper 타입으로 바꿔주고 해야한다.
Integer[] tmp = Arrays.stream(intArray).boxed().toArray(Integer[]::new); // Wrapper 타입으로 바꾸는 과정
Arrays.sort(배열명, Collections.reverseOrder());로 한다.
N차원 배열의 정렬은
Arrays.sort(arr, (o1, o2) -> o1[0] - o2[0]); // 문자열 이외의 배열, 예시는 0번째 인덱스 기준 정렬을 보여주는 것이다.
Arrays.sort(exArray, (o1, o2) -> o1[0].compareTo(o2[0])); // 문자열 배열 정렬시 compareTo 사용
ArrayList
배열과 비슷하게 여러 데이터를 담을 수 있는 자료형이다. (동적배열이라고 생각하면 된다.) ArrayList는 내부에서 처음 설정한 저장 용량(capacity)가 있다. 설정한 저장 용량 크기를 넘어서 더 많은 객체가 들어오게 되면, 배열 크기를 1.5배로 증가시킨다.
ArrayList의 장점 -
1) 배열을 기반으로 하기 때문에 접근성이 좋다.
2) 마지막 index에 추가 및 삭제 시 빠르다.
3) 배열에 없는 추가 및 삭제 기능이 있다.
4) 사이즈가 동적이다.
ArrayList의 단점 -
1) 데이터 추가 삭제 시 메모리를 재할당 하므로, 배열 보다는 느리다.
ArrayList의 특징
Primitive type을 사용할 수 없다. (Generic은 가능)
ArrayList l1 = new ArrayList();
ArrayList l2 = new ArrayList(4); // 4=initialCapacity, 초기용량(이것보다 많이 들어가는건 상관없음)
ArrayList l2 = new ArrayList(Arrays.asList(1, 2, 3)); // 데이터를 바로 만들어주기
ArrayList<String> l3 = new ArrayList<>(); // <>는 앞의 String과 동일하게 암묵적으로 인정된다.
같이 만들 수 있다.
ArrayList안에 ArrayList를 add하여 2차원배열처럼 사용할 수도 있다.
주로 사용하는 메소드
예시로 사용하는 변수 => ArrayList l1 = new ArrayList()
메소드 이름 | 사용 예시 | 설명 |
add | l1.add(2); l1.add("test"); l1.add(0, 56); [56, 2, "test"]가 나온다. |
리스트 마지막에 해당 데이터 추가 add(추가할 데이터값), add(추가할 위치(인덱스), 값) 같이 사용가능 |
get | l1.get(0); 2가 나온다. |
get(인덱스번호)로 해당 인덱스의 값을 가져온다. 리스트 자체에 영향은 없다. 리스트 바깥의 인덱스번호 입력시 에러. |
size | l1.size() | 리스트 크기를 반환 |
remove | l1.remove(1); l1.remove(Integer.valueOf(2); l1.remove("test"); |
remove(인덱스번호)로 해당 인덱스의 값을 지우거나, Integer.valueOf()로 리스트 내의 지우고자 하는 숫자값을 지울수도 있다.(문자열은 그냥 쓰면 지워짐) |
clear | l1.clear() []이 나온다. |
빈 리스트로 만듦 |
sort | l1.sort(Comparator.naturalOrder()); // 오름차순 l1.sort(Comparator.reverseOrder()); // 내림차순 |
순서를 정렬하는 함수 |
contains | l1.contains(2); l1.contains("study"); |
리스트가 해당 값을 갖고있는지 boolean값으로 반환 |
indexOf | l1.indexOf("test"); | 해당 값의 인덱스번호를 반환 |
파이썬(배열)
파이썬의 배열은 여러 원소를 하나의 묶음으로 관리하고 각 원소간에는 순서(order)가 존재하여 인덱스(Index)를 통해 접근하는 리스트로 파이썬에서는 리스트(list)와 튜플(tuple)이라는 두가지 타입이 있다.
파이썬에서는 각 원소의 데이터 타입이 동일하지 않아도 되고 심지어 다른 배열을 원소로 갖는 것도 허용 된다.
배열간의 비교는 동일 인덱스 끼리 각각 비교해 가는 방식으로 적용된다.
보통은 리스트를 배열로 사용한다.
또는 파이썬에서 배열을 사용하기 위한 표준 패키지인 넘파이(NumPy)가 있다. 넘파이의 배열 연산은 C로 구현된 내부 반복문을 사용하기 때문에 파이썬 반복문에 비해 속도가 빠르며 벡터화 연산을 이용하여 간단한 코드로도 복잡한 선형 대수 연산을 수행할 수 있다. 또한 배열 인덱싱(array indexing)을 사용한 질의(Query) 기능을 이용하여 간단한 코드로도 복잡한 수식을 계산할 수 있다.
import numpy as np
ar = np.array([2,5,4,3]) 같이 사용한다.
자세한건 파이썬 리스트, 튜플 항목에서 알아보도록 하자.