2012년 11월 18일 일요일

자바의 열거맵(EnumMap)




EnumMap 클래스는 자바 5에서 추가된 내용이므로 새로울지 모르나 저번 강의시간에 열거셋에 대해서 이미 공부하였으므로 필자의 핵심예제를 통해 바로 습득하는 시간을 가져보겠다.^^


=== 강이의 JAVA강좌 ===
Map: {SUNDAY=S, MONDAY=M, TUESDAY=T, WEDNESDAY=W, THURSDAY=T, FRIDAY=F, SATURDAY=S}
Key: [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]
Value: [S, M, T, W, T, F, S]

예제를 간략하게 보면 오늘 출력하는 부분은 총 3가지로 이루어져 있다. 하나는 키와 밸류를 함께 출력하는 Map이고 다른 하나는 키만 출력하는 Key이고 나머지 하나는 밸류만 출력하는 Value이다. 예제는 거부감(?)을 없애기 위해 예전에 썼던 Day 열거형을 사용하였으니 금방 예제에 동화(?)되리라 본다.ㅎㅎ

열거맵이므로 열거형을 사용하며 예제에서는 그로 Day를 만들어서 사용하였다. 열거맵을 사용하려면 열거셋과 마찬가지로 열거형이름에 확장자로 class를 명명하면 열거형에 있는 요소들을 해당맵의 key로서 사용이 가능해진다. 우리는 열거맵을 공부하고 있으므로 이 열거요소들, 즉 키에 해당하는 각각의 밸류값들을 put( ) 메소드를 통해 넣어주었다.^^

다음 단락은 그렇게 고생고생(?)해서 만든 열거맵을 찍어주는 구문이다. 이제 이런 메소드들은 해보기도 하였지만 보기만봐도 다 이해가 될것이다. 그 이유중 하나는 필자가 이미 언급하였다시피 자바 컬렉션 프레임워크의 메소드들은 기능에 의미를 부여함은 물론 여러 컬렉션 클래스들에서 그 기능이 같거나 비슷할경우 해당 메소드 이름도 같거나 비슷하게 지었기 때문에 아주 생소한 이름이 아닌이상 의미파악이 어느정도 가능하기 때문에 그러하다.^^

끝으로 한마디 덧붙이자면 자바의 열거맵(EnumMap)은 비동기화(not synchronized) 되어있고 물론 Collections.synchronizedMap( ) 메소드를 이용하면 동기화 가능하고 반복자는 fail-fast 방식이고 열거맵의 순서는 열거형의 키를 기반으로 자연적인 순서(natural order)를 따른다. 여기서 자연적인 순서라함은 enum Day에서 열거한 순서대로 나열한다는 것을 말한다. 예를 들어, enum DAY에서 열거요소의 SUNDAY와 MONDAY를 바꿔놓으면 모든 결과들은 이 둘의 순서가 뒤바뀌어서 출력될 것이다. 여러분이 put( ) 메소드를 이용해서 밸류값을 넣은 순서와 상관없이 말이다.ㅎㅎ 그냥 그렇구나하고 넘어가지 말고 직접 해보면서 알아가는 여러분이 되기 바란다. 복습 잘하기 바라면서 열거맵 강좌는 여기서 마무리하겠다.^^

2012년 11월 13일 화요일

자바의 트리맵(TreeMap)


요소들을 차례대로 정렬하는 기능을 제외하면 해쉬맵(HashMap)과 거의 같은 트리맵(TreeMap)에 대해서 공부하는 시간을 갖기로 하겠다. 이미 트리셋을 공부하였으니 트리맵도 이름처럼 정렬을 가미한 클래스라는 것을 알수 있을 것이다.^^


자바 컬렉션 프레임워크의 멤버인 트리맵도 해쉬맵처럼 비동기화(not synchronized)되어 있고 Collections.synchronizedSortedMap 메소드를 이용해 wrapped해서
SortedMap m = Collections.synchronizedSortedMap(new TreeMap(...));
위의 구문을 이용해 동기화시키는 것이 가능하며 키(Key)값을 중심으로 밸류(value)값을 가지고 있고 NavigableMap 인터페이스와 SortedMap 인터페이스, 그리고 AbstractMap 클래스를 기본으로 계승하고 있다. 키값은 중복될수 없으며 밸류값은 여러개의 중복된 값을 가지는 것이 가능하다.^^


해쉬테이블과 해쉬맵까지 거쳐온 여러분들은 모두 알고있는 내용일테지만 워밍업(?) 차원에서 잠시 읊어보았다.ㅎㅎ 이제 필자의 예제를 보면서 트리맵에 대해서 살펴보기로 하겠다. 저번 강의를 들은 여러분은 아마 이런 생각을 하고 있을 것이다. 저번 예제 그냥 순서대로 정렬하는거 맞죠? 그래 맞당.ㅎㅎ 여러분이 다 이와같이 눈에 뻔한 예제에 식상할 것을 대비해 필자가 대규모 반전(?) 예제를 들고 나왔다. 간만에 대한민국 걸그룹들이 총출동하는 예제이니 눈에 쌍심지(?)를 켜고 들여다보면 얻는바가 클것이라 생각한다.^^


=== 강이의 JAVA강좌 ===
2ne1=YG
소녀시대=SM
시크릿=TS
원더걸스=JYP
카라=DSP
=== 강이의 자바강좌 ===
{카라=DSP, 원더걸스=JYP, 시크릿=TS, 소녀시대=SM, 2ne1=YG}
{소녀시대=SM, 시크릿=TS}

예제는 크게 두 파트로 나눴다. 기본적으로 트리맵을 이용해서 요소들을 돌리는 것이 첫번째 파트이고 두번째 파트는 응용편으로 한번 넣어보았다. 그럼 이제 예제로 들어가보자. 트리맵을 써야하니 처음에 불러들인 것이고 요소들을 트리맵에 넣어야하는데 요소갯수만큼의 put( ) 메소드들을 이용한 요소삽입은 해보았으니 이번엔 일반 배열을 통한 for 구문을 이용해 요소들을 트리맵에 위와같이 넣어보았다. 이렇게 하는거 궁금했었는데 필자가 보여준거라면 우린 통한거다.ㅎㅎ 여기까지가 첫번째 파트인데 잘 찍힌다. 그런데 여기서 중요한건 자알 찍히는 정도가 아니라 순서까지 맞춰서 찍혔다는 것이다. 트리맵이니깐......

다음은 descendingMap( ) 메소드를 이용해서 tm 트리맵을 역순으로 정렬하는 구문이다. 이런건 메소드의 이름만 봐도 바로 알수 있어야한다.ㅎㅎ 그리고 마지막은 subMap( ) 메소드인데 트리맵에서 이게 하이라이트(?)일지도 모르겠다. 조금 어려워보이는 걸로 따지면 말이다.ㅎㅎ 알고나면 별거없으니 모르는 이들은 잠시 귀를 기울이기 바란다.^^

subMap( ) 메소드가 하는 일은 sub에서 느끼다시피 뭔가 일을 부분적으로 하는 것이다. 여기서는 해당 맵 요소들의 범위를 정해주면 그 해당 범위내의 정렬된 요소들 중에서 일부분을 부분적으로 돌려준다. 예제에서는 '소녀시대'와 '원더걸스'를 입력해서 소녀시대부터 원더걸스까지, 즉 '소녀시대', '시크릿', '원더걸스'를 돌려준다. 그런데 결과는 원더걸스가 빠져있다. 왜일까? 힘쎈 원더걸스(?)라서 사라진건가? ㅎㅎ 범위를 정해줄때의 시작요소가 '소녀시대'이고 끝요소가 '원더걸스'인데 시작요소와 끝요소의 옆을 보면 true와 false가 적혀있을 것이다. true일때는 지정요소를 포함하는 것이고 false일때는 지정요소를 포함하지 않는다. 따라서 소녀시대 옆에는 true라서 시작요소를 포함한 것이고 끝요소인 원더걸스 옆에는 false라 결과에서 누락된 것이다. subMap( ) 메소드의 기능을 알아놓으면 프로그램을 짤때 도움이 될것이다.^^

이것으로 트리맵에 대해서 짧게나마 알아보는 시간을 가져보았다. 본 예제를 중심으로 응용하면서 다른 메소드들을 공부하면 전체적으로 무난할 것이라 생각한다. 다른 기능들은 대부분 여러분이 벌써 필자와 함께 훈련(?)한 부분들이거나 눈치코치(?)로도 다 이해가능한 수준일 것이기에 이 정도에서 오늘 트리맵 강의는 편안하게 접도록 하겠다.^^