부트캠프(33일)

성준혁·2022년 12월 14일
post-thumbnail

오늘은 부트캠프 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()의 코드가 깊이 이해하는데 도움이 될 것이다.

0개의 댓글