2012년 11월 6일 화요일

자바의 열거셋(EnumSet)

자바의 EnumSet은 이름에서 풍기듯이 Set 인터페이스를 기반으로 하면서 enum 열거요소들을 이용해서 보다 빠르고 강력하게 결과를 도출해낼수 있도록 자바 5에서 등장한 새로운 무기(?)중 하나라고 볼수 있다. JDK 1.5 이전 버젼에서 자바를 처음 접한 이들은 아직까지 생소할수 있겠지만 오늘 강이의 자바강좌와 함께 한다면 필자가 단언하건데 EnumSet을 어느정도 수준까지는 자유자재로 구사할수 있는 능력자(?)가 될 것이니 더도말고 30분만 본 강의에 집중해주기 바란다. 강이의 자바강좌와 함께 새로운 것을 계속해서 알아가고 있는 이들은 이런 신병기(?)가 출현했을 경우 눈을 더 크게 뜨고 강의를 집중해야 기존의 자바인들보다 뛰어난 능력을 한가지라도 보유할수 있는 기회의 장으로 만들수 있음을 명심해야 할것이다.ㅎㅎ

enum에 대해서 아예 모르거나 처음 들어본 이들은 예전에 올린 enum 열거형 타입에 대한 강좌를 다시 듣고 이 자리로 돌아오기 바란다. 여러분의 빠른 이해를 위해 예제도 저번 열거형 강좌의 예제를 그대로 도입해 EnumSet 버젼으로 승화시켰음을 알리는 바이다.ㅎㅎ

그럼 오늘 배울 EnumSet은 어떤 상황에 쓰는건지 궁금할텐데 말그대로 열거형 타입으로 지정해놓은 요소들을 가장 쉽고 빠르게 배열처럼 요소들을 다룰수 있는 기능을 제공한다. EnumSet은 기술상으로 원소갯수가 2^6 그러니까 64개를 넘지 않을 경우에 겉은 Set 기반이지만 내부적으로 long 데이터형의 비트필드를 사용하게 된다. 비트필드는 2의 제곱수들로 이루어져 메모리 공간도 적게 차지하고 속도도 빠른데 이런 원리를 기반으로 돌아가는 세트가 바로 EnumSet이다. HashSet의 경우에는 배열과 해쉬코드를 이용하는데 상황에 따라 다를수 있겠지만 통상 비트연산을 이용하는 EnumSet보다는 속도면에서 훨씬 뒤떨어질수 밖에 없다. 거기다 EnumSet은 Set을 기반으로 하지만 enum과 static 타입의 메소드들로 구성되어있어 안정성을 최대한 추구하면서도 편리한 사용이 가능하다.

서론은 이 정도로 하고 이제 예제로 살펴보는 시간을 갖도록 하겠다.^^


=== 강이의 JAVA강좌 ===
EnumSet Day: [SUNDAY, MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY]
EnumSet Day: []
es: [WEDNESDAY, FRIDAY]
es2: [SUNDAY, MONDAY, TUESDAY, THURSDAY, SATURDAY]
es2: [TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]

위의 예제 하나로 EnumSet을 끝낼 것이다. 더도말고 메인메소드안에 있는 딱 12줄만 여러분이 이해하면 끝나는 것이다. 그냥 보기만 해도 알것이나 간략하게 부연설명을 해보도록 하겠다. 일단 첫 단락은 예전에 enum 타입으로 Day라는 열거형을 만들어본 적이 있는데 기억하는지 모르겠다. 일요일부터 토요일까지 요일을 기입하였는데 오늘 예제는 이를 토대로 플레이(?) 할것이니 잘 따라오기 바란다.ㅎㅎ

메인메소드의 첫 EnumSet을 보면 인자로 es를 만드는데 allOf( )라는 메소드를 이용해서 열거형 Day에 있는 요소들을 다 가져오라는 것이다. 쓰는 방식은 예제처럼 괄호안에 열거형 이름에다가 .class를 붙인 형태를 사용하면 된다. 이게 가능해지는 이유(?)는 컴파일한 지금 여러분의 자바파일이 있는 디렉토리에 가보면 해답을 찾을수 있을 것이다. 클래스명$Day.class라는 새로운 파일로부터 말이다. 열거형을 만들면 그와 관련된 .class가 이처럼 새로 생성된다. 둘째줄에 인자 es2는 es와 똑같은 세트를 만드는 것이다. 예제처럼 copyOf( )나 clone( ) 메소드를 이용해서 복사가 가능하다. 그래서 복사가 제대로 되었는지 es2를 찍어보니 열거세트 Day와 똑같이 출력되는 것을 보니 잘 되었다는 것을 알수 있다. 물론 카피했으니 es는 찍어보지 않아도 같은 세트임을 동시에 알수있고 말이다.^^ 그 다음에 noneOf( ) 메소드는 세트를 비우라는 것이다. 그래서 명령주고 찍어보니 세트가 제대로 텅 비게 되었다.ㅎㅎ

그럼 이제 다음 단락으로 넘어가 보겠다. of( ) 메소드는 해당 요소를 찾아서 넣으라는 것이다. 수요일과 금요일만 넣으라고 했으니 그것만 찍힌 것인데 당연하지만 여러분이 지정하는만큼 자유자재로 넣을수 있다. 그리고 열거형의 이름인 Day는 대문자나 소문자를 다르게 인식하므로 쓸때 주의하기 바란다. 다음은 complementOf( ) 라는 메소드인데 이건 괄호안의 요소들만 빼고 세트를 구성하라는 것이다. 예제에서는 es 즉 수요일과 금요일을 빼라고 하였으니 결과처럼 나머지 요일들만 출력된다. 그리고 마지막으로 range( ) 메소드를 이용하면 세트의 구간을 정해서 출력할수 있다. 어디부터 어디까지... 예제에서는 화요일부터 금요일까지 찍으라고 하였으니 화요일, 수요일, 목요일, 금요일 이렇게 구간에 해당하는 세트 요소들을 전부 출력하는 것이다. 만약 range( ) 메소드안에 반대로 금요일과 화요일 이렇게 순서를 달리해서 집어넣으면 어떻게 될까? ㅎㅎ 과연 이것도 받아들이고 정상적으로 작동할까? 이에 대한 해답은 여러분이 직접 알아내기 바란다.

EnumSet의 명령들을 접하면서 한가지 의문이 드는 이들이 있었을 것이다. 왜 객체생성을 안하징? ㅎㅎ EnumSet의 메소드들이 static으로 구성되어 있어 이렇게 빠르고 손쉽게 접근이 가능한 것이다.^^ 본 예제를 통해서 EnumSet의 진수(?)를 맛보았길 바라면서 오늘로서 Set에 관련된 클래스들은 이 정도로 마무리하고 이제부터는 Map 인터페이스에 관련된 클래스들을 다루면서 컬렉션에 대해 공부해보는 시간을 계속적으로 갖도록 하겠다.^^

댓글 5개:

  1. Fоr giгls who're pregnant, this product can also help prevent the formation of these ugly stretch marks.

    Stop by my website :: http://netcontacts.mobi/members/chat-and-advertise/index.php?p=blogs/viewstory/5878

    답글삭제
  2. Not јust that, you cаn іndulge in more works although ωearing this.


    Also visit mу web page: relevant internet site

    답글삭제
  3. 감사합니다 잘봤어영

    답글삭제
  4. Have you ever considered about including a little bit more than just your articles?
    I mean, what you say is fundamental and all. However imagine if you
    added some great pictures or video clips to give your posts
    more, "pop"! Your content is excellent but with pics and video clips, this website could definitely be one of the most
    beneficial in its niche. Terrific blog!

    Feel free to surf to my web-site - garcinia cambogia gnc pro nutra

    답글삭제
  5. 감사합니다.~ 많은 도움 되었습니다

    답글삭제