
오늘은 부트캠프 33일차이다. 갑자기 처음에 어떻게 시작했을까 생각이 난다. 처음 젭에 접속해서 다른 사람들과 캠을 키고 서로 대화하면서 프로젝트를 한다는 것이 굉장히 어색했고, 새벽에 일어나서 운동하는 것도 정말 힘들었는데 이제 1~2달 정도 지나니까 익숙해지면서 이제 안하면 안될 것 같은 생각까지 든다. 요즘에는 하나하나 배우는 것도 벨로그에 작성하면서 복습하는게 재밌고 내일이 불안한 것보다 내일 해야 것을 체크리스트처럼 지워나가는 것이 재밌게 느껴진다. 아직 초반이라 언제까지 이 자세가 유지될까 걱정되기도 하지만 할땐 하고 휴식할때는 휴식을 하다보면 밸런스를 맞춰갈 수 있지 않을까 싶다.
오늘 배운 것
1. Java Collections Framework(JCF)
-Java에서 컬렉션(Collection)이란 데이터의 집합, 그룹을 의미하며 JCF는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다.
위 사진은 Java 컬렉션 프레임워크의 상속구조를 나타낸다.2. 일반 배열을 ArrayList로 변환하기
List<String> list = Arrays.asList(arr);-Arrays.asList는 Arrays의 private 정적 클래스인 ArrayList를 리턴한다.
-java.util.ArrayList 클래스와는 다른 클래스이다. java.util.Arrays.ArrayList 클래스는 set(), get(), contain() 메서드를 가지고 있지만 원소를 추가하는 메서드는 가지고 있지 않기 때문에 사이즈를 바꿀 수 없다.
-진짜 ArrayList를 받기 위해서는 다음과 변환하면 된다.ArrayList<String> arrayList = new ArrayList<String>(Arrays.asList(arr));-ArrayList의 생성자는 java.util.Arrays.ArrayList의 상위(super)클래스인 Collection type도 받아들일 수 있다.
3. 일반 배열에 특정 값이 들어있는지 확인하기
Set<String> set = new HashSet<String>(Arrays.asList(arr)); return set.contains(targetValue);-이 코드는 동작하지만 list를 set으로 변환하는 것은 시간도 더 걸릴뿐더러 사실 할 필요가 없다.
Arrays.asList(arr).contains(targetValue); //OR for(String s: arr) { if(s.equals(targetValue)) return true; } return false;4. Loop에서 list의 원소를 제거하기
ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (int i=0; i < list.size(); i++) { list.remove(i); } System.out.println(list); //output //[b, d]-위의 코드에는 문제가 있다. 원소가 삭제될 떄, list의 사이즈가 줄어들면서 다른 원소들의 index도 바뀌어 버린다. 그래서 만약 loop 내에서 다수의 원소를 index를 사용해 삭제한다면 생각한대로 동작하지 않을 것이다.
-아마 반복자(iterator)를 사용하는 것이 바른 방법이고, foreach loop가 내부적으로 반복자를 사용한다는 것을 알고 있다. 하지만 사실 다음의 foreach loop에서도 올바르게 동작하지 않는다.ArrayList<String> list = new ArrayList<String>(Arrays.asList("a", "b", "c", "d")); for (String s: list) { if(s.equals("a")) list.remove(s); }-위의 코드는 ConcurrentModificationException을 발생시킬 것이다.
-다음의 코드는 제대로 동작한다.ArrayList<String> list = new ArrayList<String>(Array.asList("a", "b", "c", "d")); lterator<String> iter = list.iterator(); while(iter.hasNext()) { String s = iter.next(); if(s.equals("a")) { iter.remove(); } }반드시 .remove() 전에 .next()가 호출되어야 한다. 만약 foreach loop 안에서 원소 삭제된 뒤에 .next()가 호출된다면 컴파일러는 ConcurrentModificationException을 발생시킬 것이다. ArrayList.iterator()의 코드가 깊이 이해하는데 도움이 될 것이다.