1. 자바의 Collection에 대해

Dev StoryTeller·2020년 12월 5일
0

들어가기에 앞서, 자바의 모든 자료형을 관리하는 Collection Framework에 대해 알아보고 넘어가자


1. 자바 Collection

자바의 자료구조를 알고 싶다하면, 이 Collection Framework에 대해 찾아보면 된다.

자바의 모든 자료구조에 대해 모아놓았으며, 들어봤다시피
크게 List, Hash, Queue, Map 4가지로 분류할 수 있다.
(출처: https://fresh2refresh.com/java-tutorial/java-collections-framework/)
그림으로 보다시피 Collection 한가지로 묶어 놓았으며,
Map을 제외한 자료구조는 모두 add()로 값을 넣을 수 있다.
(값을 꺼내는 것은 특성상 모두 다르다)
C를 생각하면 이게 얼마나 편리한 것인지 모른다..

자료구조를 설명하기 전에 우선 주의할 점을 알아보고 가자.


2. get()? add()?

Collection이 다루는 데이터는 우리가 알던 기본 데이터와는 다르다.
Collection은 값들을 다룰 때, 기본 데이터형이 아닌 Wrapper 클래스를 사용한다.
ArrayList를 예로 들어보자.

ArrayList<Integer> arrayList = new ArrayList<>();

// 값을 넣음
arrayList.add(3);

// 첫번째 요소를 꺼내옴
arrayList.get(0);

꺼내올 때 사실은 Integer 객체의 3을 꺼내온다는 것이다.
다만 사용이 편리하도록 autoboxing이 될 뿐이다.
"그게 그거 아닌가?"할 수 있겠지만, 이게 잘못되면 다음과 같은 실수를 범할 수 있다.


3. toArray란?

우선 toArray에 대해 간략히 알아보고 가자면,
toArray는 ArrayList들을 배열로 바꿔주는 역할을 한다.
하.지.만,
그 배열은 기본형이 아닌 Wrapper 클래스의 배열을 말한다.

// 기본 반환형은 Object[]
Object[] java.util.ArrayList.toArray()

기본 반환형은 Object[]이고, ()에다 원하는 클래스를 넣어주면 해당 타입으로 반환 가능하다.

// String으로 반환 가능
String[] java.util.ArrayList.toArray(String[] a)

물론 Integer 클래스도 반환 가능하다.

그럼 이 지식을 가지고 다음 사례를 보자.


4. toArray 문제

대부분 처음 코딩을 하면 다음과 같은 실수를 한다.
(필자도 포함ㅎㅎ;)

Integer[] test = testArrList.toArray(new Integer[0]);

이것은 올바른 구문으로, Integer 클래스로 반환하는 구문이다.
하지만 다음을 보자.

// 삐익! 에러!!
int[] test = (int[])testArrList.toArray(new Integer[0]);

아마 이런 생각을 했을 것이다.

"int로 Integer를 형변환 가능하니까, 이것도 되겠지"

삑--! 그건 기본형에서나 가능하다.
위의 것은 배열이다 배열. 다른 데이터형인 것이다!

따라서 변환해주고 싶다면,
각 배열의 요소를 새로운 int 배열에다 넣어주거나

// 리스트 크기만큼의 배열을 만들어줌
int[] change = new int[testArrList.size()];

// for문을 돌며 각각 넣어줌
for (int i = 0; i < testArrList.size(); i++) {
	change[i] = testArrList.get(i);
}

또는 JAVA 8에서 쓸 수 있다는 다음 구문을 사용하면 된다.

int[] change = testArrList.stream().mapToInt(i->i).toArray();
//또는
//int[] change = testArrList.stream().mapToInt(Integer::intValue).toArray();

(이 방법은 필자도 방금 알았다..좀더 공부한 뒤 따로 올리겠다.)


5. 결론

사실 자바의 자료구조는 깊게 파고들자면 한도 끝도 없다.
자료구조는 이보다 훨씬 많은데다, A는 B를 구현하는데 C를 상속받기도 하는 등 매우 복잡하다.

모두 알면 좋겠지만 그러기엔 너무 비효율적이므로, 특징적인 몇가지만 짚고 넘어가자.
다음 시간엔 각 자료 구조의 간단한 특징을 알아볼 것이다.

profile
개발을 이야기하는 개발자입니다.

0개의 댓글