본문 바로가기

Language/Java

[Java]Collection 객체 응용(1)

Collection객체가 상당히 크기 때문에, 다 공부할 엄두가 나지 않는다.

하지만 방대한 크기만큼 다양한 문제를 해결할 가능성이 있지 않나 싶다. 

그래서 몇 번에 걸쳐 유용한 패턴들을 정리하고자 한다.

 

1. Collection의 자료구조에 다른 타입들을 넣어야 한다면 DTO객체를 만들자.

< 여러 타입의 객체들이 저장된 list >

 

다음과 같이 작성하려면 일단 모두 다른 타입이기 때문에 List 앞에 제네릭을 추가해 줄 수 없다. 

사실 아무 값도 입력하지 않아도 생성되는 이유는 <Object>가 자동으로 붙기 때문이라고 한다.

그 말은 즉슨 위의 값들은 모두 Object가 된다는 의미이다.

이는 원하지 않는 타입변경이 되는데 이는 다음과 같은 오류를 빈번히 발생시킨다.

< 정수를 의미하기 위해 넣은 1과 3은 Object가 되었기 때문에 더할 수 없을 뿐더라 기본 자료형인 int역시 아니다. >

그렇기 때문에 보통은 DTO객체를 사용한다고 한다.

< DTO객체 >

DTO란 계층간 데이터 교환을 위한 Java Beans이다. 라고 하는데 잘 모르겠고, 그냥 쉽게 getter와 setter만 존재하는 값을 가진 객체라고 한다.

이를 이용하면 다음과 같이 계산이 가능하다.

< 숫자를 모두 더했다. >

좀 더 다양한 패턴을 익히기 위해 Iterator을 사용하였다.

List는 iterator을 상속받기 때문에 Iterator객체로 바꾸었고 값을 하나씩 꺼내 더한 모습이다.

 

2. 특별한 값들의 갯수를 하나하나 확인하기 위해서 Map을 이용하자. 

< 과일의 갯수를 센다. >

이름은 String 자료형 갯수는 int 자료형이라서 1번과 유사하게 객체로 만들어 사용하여 과일의 갯수를 센다. 하지만 Map과 put, putIfAbsent를 이용하면 객체를 만들지 않고도 간단히 문제를 해결 할 수 있다.

< map을 이용하면 객체를 생성하지 않고도 과일의 갯수를 셀 수 있다. >

JSON객체를 그렇게나 질리게 사용했으면서도, 정작 언어가 바뀌자 말자 생각을 못해내다니....

map의 특성은 key와 value를 가지는 자료구조형이다. 또한 key는 중복 될 수 없다.

그렇기 때문에, 어떠한 객체에도 중복없이 특정 값을 부여할 수 있게 된다.

put 메소드는 값을 입력하고

putIfAbsent는 해당 값이 없으면 그 값을 입력하고 null을 반환한다. 있다면 그 키의 값을 반환한다.

< 다음 코드의 출력 결과 >

사과와 딸기 바나나는 putIfAbsent를 사용했기 때문에 단 한번만 0을 입력하고 그 이후에는 put메소드만 작동한다.

put메소드는 현재 객체에 기존의 값에 +n만큼 더한 값을 입력한다.

오렌지의 경우에는 put("오렌지",0)을 계속 실행하기 때문에 결과는 1이 출력된다.

만약 put("오렌지",0)를 생략하게 되면 put("오렌지",map.get("오렌지")+1); 에서 인덱스를 찾지 못하고 에러를 일으킨다.

사용하고 싶다면 반복문 밖에서 put("오렌지",0)를 입력해주면 된다

 

3. set과 map을 정렬할 때는 Stream객체를 이용하지 않고 Tree를 이용해보자.

< 두 가지 정렬방식 >

윗부분은 stream객체로 바꾼후에 정렬했고

오른쪽은 TreeSet에 값을 집어 넣었다.

 

그냥 훨씬 간단하다.