Java 7.0 의 놀라운(?)특징 들에 대해서 간단하게 설명하려 합니다.

아래글의 내용의 링크된 출처에서 참고하여 작성한 것이며, 원문을 한글로 번역 및
나의 개인적인 의견을 첨부한 것입니다.
- 출처 
http://metoojava.wordpress.com/2010/11/15/java-7-awesome-features/

먼저 현재 Java 6을 사용하고 있고 또한 Java 7을 위한 프로젝트가 열심히 진행중인것 같습니다. 새로운 버젼에 대한 관심이 크게 없기에 이에대한 자세한 내용은 더 구글링을 해보아야 할듯 합니다.

Java 7 에서 가장 크고 흥미로운 특징들에 대해서 이제 설명하려 합니다.
간략하게 요약하자면,

- null 체크 방법 개선
- Switch 문 개선
- 멀티예외처리
- 컬렉션 생성자 수정
크게 위 4가지 인것 같습니다. 그럼 위의 내용에 대해 자세하게 설명하도록 하겠습니다.

1. Null-safe Method invocaton :

  자바로 프로그래밍을 하다 보면 NullPointer Exception을 아주 자주 만나게 될것입니다. 심심치않게 만날수 잇는 에러이며, 출처 블로그의 주인장은 구글링을 했을때 약 5,570,000건의 결과가 검색된다고 합니다. 이만큼 자바프로그래머를 괴롭히는 예외가 아닌가 하는 생각이듭니다.
  이 예외처리를 위해 노가다가 장난 아니였는데, 이게 된다면 이제 좀 코딩이 편리해 지지 않을까 하는 생각이 듭니다.

 현재는 null 체크를 위해 아래와 같은 코드를 사용합니다.

01 public String getPostcode( Person person ) {
02     if( person != null )
03         Address address = person.getAddress();
04     if( address != null )
05         return address.getPostcode();
06     return null;
07 }

하지만, Java 7 에서는 아래와 같이 사용이 가능합니다!
01 public String getPostcode( Person person ) {
02     return person?.getAddress()?.getPostcode();
03 }

위와 같이 4라인의 코드가 단 한라인으로 표현이 가능합니다. "?."연산자는 해당 객체변수가 null 이라면 null을 리턴하고 있습니다. 굳이 null 체크를 해줘야하는 수고가 더는 것입니다. (왜 이제야 이게 나왔을까요..... ㅜㅜ)

2. String in Switch Statements

  
Java 6 까지의 버전에서는 Switch-case 문에서 case 조건으로 판단할수 잇는 데이터 형은 원시형 데이터로 제한되어 있었습니다. (예를 들어, int, char, long etc ) 
하지만, Java 7버젼에서는 String 타입을 지원하면서 좀더 가독성이 높은 코드를 만들수 있겠군요. 예전에는 가독성을 높이기 위해 정수형 상수를 지정해서 사용했다면, Java 7에서는 String으로 바로 사용하는게 훨씬 편해질것 같습니다.
( 음.. 근데 성능면에서는 어떤게 빠를지... 이전 정수형 타입으로 하는게 빠르겟죠? )

3. Multi-Exception catch

  여러분들은 종종 자바의 예외처리때문에 코딩하는데 어려움이 많을때가 있었을 겁니다. 예외처리를 알아서 해주면 좋겠지만.. 그건 희망사항일 뿐이고, 그나마 좀던 간편하게 작성할수 있어서 좋은것 같습니다.

  예를들어 소켓통신 프로그래밍을 한다고 할때 예외처리는 다음과 같이 다중으로 catch 문을 사용해야 했습니다.

01  try {
02      ...... // IO 작업
03  } catch( IOException e ) {
04      e.printStacktrace();
05  } catch( Exception e2 ) [
06      System.out.println(" Exception : " + e2);
07  }
이제 Java 7 부터는 이것을 아래와 같이 좀더 간단하게 코딩이 가능합니다.

01 try {
02     block of statement
03 } catch( IOException e | Exception e2 ) {
04     block of statement
05 }

4. Bracket Notation for Collection

  가장많이 사용하는 ArrayList와 같은 컬렉션을 이용할때, 선언과 동시이 초기화를 하는 방법이 존재하지 않아 상당히 불편했을 겁니다. 저또한 그랬구요. 배열과 같이 한방에 초기화가 된다면 좋았을텐데....
이제 Java 7 부터는 이를 지원한다고 합니다. 별다른 부연설명 없이 아래 코드를 보시는게 빠를것 같습니다.

01 Collection<String> c = new ArrayList();
02 c.add("one");
03 c.add("two");
04 c.add("three");
05 Use :
06 Collection<String> c = new ArrayList {"one", "two", "three"};

마치며..


우연찬게 Java 7 에 대한 내용을 발견에 이렇게 포스팅을 하지만, 위 내용에는 정확하지 않은 정보가 포함되어 있을수도 있습니다. 의심가는 부분이나, 이해가 가지 않는 부분은 거침없이 태클이나 질문해 주시면 최대한으로 수용하며 답변드리도록 하겠습니다.

제 블로그에 방문해 주신 모든 분들께 감사의 말씀을 드립니다. - 상기 글은 제 블로그에 동시에 게재되었습니다. (http://anyjava.tistory.com)


출처 - http://www.anycoding.com/bbs/board.php?bo_table=acProgram_java&wr_id=5986


===================================================================================


자바7 출시가 점점 앞으로 다가오는데, 마음에 드는 자바7의 몇 가지 특징들은 다음과 같다.
  • try-with-resources
  • 멀티캐치(multicatch)
  • switch-case에 문자열 지원
  • Fork/Join
  • ECC 암호화 기능 제공
try-with-resources 이용 자원 해제 자동 처리

사실 이거 진작에 필요했던거다. 뭔가 자원을 생성하고 사용하고 해제하는 코드는 항상 다음과 같이 구조가 중복되는 코드를 작성해야 했다. finally 블록의 자원 해제 코드 정말 하는 거 없이 여러 줄 차지한다.

SomeResource resource = null;
try {
    resource = getResource();
    use(resource);
} catch(...) {
    ...
} finally {
    if (resource != null) {
        try { resource.close(); } catch(...) { /* 아무것도 안 함 */ }
    }
}

이게 코딩할 때 참 귀찮게 만드는 건지 알았는지 자바7에서 try-with-resources라는 특징이 추가되었다. 이건 문법 차원에서 추가된 건데, try에 자원 객체를 전달하면 finally 블록으로 종료 처리를 하지 않아도 try 코드 블록이 끝나면 자동으로 자원을 종료해주는 기능이다. 모습은 아래와 같다.

try (SomeResource resource = getResource()) {
    use(resource);
} catch(...) {
    ...
}

뭔가 코드 줄 수가 많이 줄어드는 것을 알 수 있다. finally 블록에 출현했던 자원 해제 코드를 작성하지 않아도 되기 때문에 코딩도 편하다. try 블록에서 사용하는 자원의 개수가 늘어나면 try-with-resources의 위력은 배가 된다. 아래는 예이다.

try (InputStream in = new FileInputStream(inFile);
     OutputStream out = new FileOutputStream(outFile)) {
    ...
} catch(IOException ex) {
    ...
}
// in과 out 모두 자동으로 종료됨


멀티캐치(multicatch)

예외 처리 블록도 참 코드를 길게 만들어주는 것 중의 하나였다. 어떤 메서드를 실행하면 예외가 AException, BException, CException이 발생하는데, 이 세 예외에 대해 AException과 BException은 동일한 코드를 실행하고 CException은 다른 코드를 실행한다고 하자. 만약 AException과 BException이 공통의 부모 예외 클래스가 없다면 다음과 같이 중복되는 코드를 작성해 주어야 했다.

try {
    throwABCmethod();
} catch(AException ex) {
    any(ex); // 코드 중복
} catch(BException ex) {
   any(ex); // 코드 중복
} catch(CException ex) {
    some(ex);
}

항상 개발 서적에서 나오는 말 중의 하나는 코드 중복을 없애라는 것이다. 그런데, 애초에 언어가 저 따구로 밖에 코드를 만들 수 없도록 했기 때문에 부득이 예외 처리 부분에서 중복된 코드가 발생했었다. 그런데, 자바7 버전에서 다음과 같이 하나의 catch 블록에서 동시에 여러 예외를 묶어서 처리할 수 있도록 했다.

try {
    throwABCmethod();
} catch(final AException | BException ex) {
    any(ex);
} catch(CException ex) {
    some(ex);
}

catch 블록에서 한번에 여러 개의 예외를 잡을 수 있다는 의미로 위 방식을 멀티캐치(multicatch)라고 하는데, 멀티캐치 덕에 주저리 주저리 길게 나열되면서 중복되는 catch 블록을 작성하지 않아도 된다.

switch-case의 문자열 지원

이것도 좀 진작에 지원해 주었으면 좋으련만, 어쨋든 switch-case에 이제 문자열을 사용할 수 있게 되었다.

String value = ...;
switch(value) {
case "city":
    ...
case "country":
    ...
}


fork/join을 이용한 작업 분할 실행

자바에서 분할-정복(divide-and-conquer) 방식으로 작업을 분해하고 실행하려면 직접 관련 코드를 만들어주어야 했다. 그런데, 필자 같은 경우는 멀티코어가 정착되면서 뭔가 작업을 분할해서 다중 쓰레드를 이용해서 병렬로 정복하고 싶은 싶은 욕구가 생긴다. 필자 외에도 많은 개발자들이 멀티코어를 활용하고 싶은 욕구가 있을텐데, 자바7에 분할-정복 방식을 위한 ForkJoinPool 클래스가 추가되었다. 이 클래스는 큰 작업을 작은 작업으로 나누고 각각의 분할된 작업을 병렬로 처리해주는 기능을 제공하기 때문에 멀티코어 환경에서 처리 시간을 단축할 수 있도록 하고 있다.

중요한 건 프레임워크이기 때문에 내가 밑바닥부터 만들 필요가 없다는 점이다. 그냥 제공하는 API에 맞게 코드를 만들어주면 땡이다.

ECC 암호화 기본 내장

이것도 진작 넣었더라면 더 좋았을 것을. 암호화 처리를 위해 ECC를 제공하지 않아 외부 라이브러리를 사용하는 곳이 많았는데, 이제 그럴 필요가 없어졌다. 드디어 자바가 ECC를 지원하기 시작했다.

기타

이 외에 NIO 강화, 네트워크 관련 기능 강화 등이 있다.


출처 - http://javacan.tistory.com/177


===================================================================================


Java 7의 새로운 특징 : Java7에서의 중요한 변화들과 업데이트된 항목에 대한 조사.

등록일 : 2011년 11월 11일


제공 : 한빛 네트워크
저자 : Madhusudhan Konda
역자 : 김상현
원문 : A look at Java 7's new features 

Madhusudhan KondaJava 7에는 개발자들이 좋아할만한 많은 특징들이 있다. switch구문에서 사용하는 String, 다중 exception처리multi-catch exception), try-with-resource 구문, 새로운 파일시스템 API, JVM의 확장, 동적 타입의 언어에 대한 지원, 유사한 작업을 위한 fork와 join 프레임워크 등 분명히 많은 곳에서 수용되어질 것이다. 

아래에 Java 7의 특징을 설명하고 예제를 제공하였다.. 이 글에서 사용한 코드가 담긴 zip파일은 이곳에서 다운로드 받을 수 있다.

개선된 점들

Java 7은 Project Coin을 통한 새로운 특징을 포함하고 있다. 이 특징들은 개발자들에게 상당히 유용하다. 

다이아몬드(<>) 지시자 

당신은 사용하고 있는 IDE에 대한 불평으로 Generics를 사용한 경우를 많이 언급해왔을 것이다. 예를 들면 우리가 Map을 이용한 Generics를 선언할 때에 아래와 같이 코드를 작성할 것이다.
Map<String, List<Trade>> trades = new TreeMap<String, List<Trade>> ();
이런 선언에 대한 안 좋은 점은 오른쪽에 있는 선언이 불필요하게 보일지라도 우리는 양쪽에 타입을 선언해야만 한다는 것이다. 왼쪽에만 선언한 것으로 컴파일러가 타입을 추측할수 있을까? Java 7을 사용하지 않으면 불가능하다. Java 7에서는 아래와 같이 작성한다.
Map<String, List<Trade>> trades = new TreeMap <> ();
얼마나 멋진가? 당신은 인스턴스를 생성하기 위해서 전체 타입을 입력할 필요가 없다. 대신 다이아몬드 지시자라고 불리는 <> 기호를 사용한다. trades = new TreeMap() 과 같이 다이아몬드 지시자를 선언하지 않는 것은 허용되지만 컴파일러가 Type safety warning을 발생시킨다. 

switch 구문에서 String 사용 

Switch 구문은 기본형과 열거형만 사용이 가능했다. Java 7은 switch 문에서 사용할수 있는 다른 타입을 추가하였다. 바로 String 타입이다. 

Trade의 상태로 진행되는 요구사항이 있다고 해보자. 지금까지는 이러한 상황에서 if-else구문을 사용해왔다.
private void processTrade(Trade t) {
  String status = t.getStatus();
  if (status.equalsIgnoreCase(NEW)) {
    newTrade(t);
  } else if (status.equalsIgnoreCase(EXECUTE)) {
    executeTrade(t);
  } else if (status.equalsIgnoreCase(PENDING)) {
    pendingTrade(t);
  }
}
String으로 동작하는 이 메서드는 대충 만들었다. Java서에서 우리는 String 타입을 변수로 받는 향상된 Switch문을 활용하여 이 메서드를 향상시킬수 있다.
public void processTrade(Trade t) {
  String status = t.getStatus();
  switch (status) {
    case NEW:
  newTrade(t);
  break;
    case EXECUTE:
  executeTrade(t);
  break;
    case PENDING:
  pendingTrade(t);
  break;
    default:
  break;
  }
}
위에 프로그램에서는, 상태 필드를 계속 String.equals() 메서드를 사용한 case label과 비교하였다. 

자동 자원 관리 

Connection, Files, Input/OutStream 등과 같은 자원은 코드를 작성한 개발자가 수동으로 회수해야만 했다. 보통 우리는 각각의 자원을 회수하기 위해 try-finally 블록을 사용한다. 아래 예제를 보면 리소스를 만들고, 그것을 사용하고 마지막에는 그것을 회수한다.
public void oldTry() {
  try {
    fos = new FileOutputStream("movies.txt");
    dos = new DataOutputStream(fos);
    dos.writeUTF("Java 7 Block Buster");
  } catch (IOException e) {
    e.printStackTrace();
  } finally {
    try {
  fos.close();
  dos.close();
    } catch (IOException e) {
  // log the exception
    }
  }
}
그러나, Java 7은 자동으로 리소스를 관리하는 훌륭한 기능을 소개하고 있다. 동작 또한 간단하다. 우리가 해줄 것은 try문 안에 아래와 같이 자원을 선언하는것 뿐이다.
try(resources_to_be_cleant){
  // your code
}
예전 try문을 사용한 위의 메소드는 아래 보여지는 것처럼 이 새로은 기능을 사용하여 다시 작성될 수 있다.
public void newTry() {
  try (FileOutputStream fos = new FileOutputStream("movies.txt");
  DataOutputStream dos = new DataOutputStream(fos)) {
    dos.writeUTF("Java 7 Block Buster");
  } catch (IOException e) {
    // log the exception
  }
}
위의 코드는 또한 이 특징의 다른 측면도 보여주고 있다 : 여러개 자원들에 대해서도 동작을 한다. FileOutputStream과 DataOutputStream 은 각각 세미콜론(;)으로 나눠서 차례로 try 문 안에 쌓여있다. 

try블록에 존재하는 기능이 한번에 자동으로 스트림을 회수해주기 때문에 우리는 수동으로 스트림을 null 처리하거나 close해줄 필요가 없다. 자동으로 회수되어져야 하는 자원들은 내부적으로 java.lang.AutoCloseable 인터페이스를 구현 해야만 한다. 

AutoCloseble 인터페이스를 구현한 리소스들은 자동 자원 관리를 위한 지원자가 될 수 있다. AtutoCloseable은 java.io.Closeable 인터페이스의 부모이고 오직 close() 메서드 하나만을 가지고 있다. 이 close() 메서드는 try 블록이 나왔을 때에 JVM에 의해서 호출된다. 

숫자와 관련된 문자에 밑줄 표시 

숫자와 관련된 문자들은 분명히 눈 여과기이다. 만약 10개의 0이 있는 숫자가 있다면 당신은 나와 마찬가지로 0을 세어보기 시작할 것이다. 만약 100만 또는 10억의 숫자가 있는데 당신이 오른쪽에서 왼쪽으로 자릿수를 세어보지 않는다면 문자를 인식하는데 실수를 범하기 쉽고 어려울 것이다. 더이상 그럴 필요가 없다. Java 7에는 자릿수를 표시하기 위한 underscores(밑줄)이 포함되어있다. 예를들어, 아래와 같이 1000을 선언 할 수 있다.
int thousand =  1_000;
1000000은 아래와 같다.
int million  =  1_000_000
이번 릴리즈에는 2진수에 대한 것도 소개 되었다. 예를 들어 "0b1"과 같이 2진수도 표현할 수 있어서 개발자들이 더 이상 16진수로 이것을 변환하지 않아도 된다. 

향상된 예외처리 

예외처리 영역에서 2가지 향상된 점이 있다. Java7에서는 하나의 catch블록을 사용해서 여러개의 예외를 처리하기 위한 multi-catch 기능을 소개하고 있다. 

3개의 예외를 처리 해야하는 메서드가 있다고 가정해보자. 현재 상태에서는 아래처럼 각각의 예외를 처리해야 한다.
public void oldMultiCatch() {
  try {
    methodThatThrowsThreeExceptions();
  } catch (ExceptionOne e) {
    // log and deal with ExceptionOne
  } catch (ExceptionTwo e) {
    // log and deal with ExceptionTwo
  } catch (ExceptionThree e) {
    // log and deal with ExceptionThree
  }
}
catch 블록 안에 여러개의 예외를 차례로 처리하는 모습은 어수선해 보인다. 나는 12개의 예외를 잡는 코드를 본적도 있다. 이것은 믿을 수 없을 정도로 비효율적이고 오류를 범하기 쉽다. Java 7은 이 미운 오리새끼를 다루기 위해 언어에 새로운 변화를 가져왔다. 아래에 oldMultiCatch 메서드의 향상된 버전을 보자.
public void newMultiCatch() {
  try {
    methodThatThrowsThreeExceptions();
  } catch (ExceptionOne | ExceptionTwo | ExceptionThree e) {
    // log and deal with all Exceptions
  }
}
여러개의 예외들은 '|' 연산자를 사용해서 1개의 catch블록 안에서 처리된다. 이 방법으로 더이상 12개의 catch문을 작성할 필요가 없다. 그러나 다른 타입에 속하는 여러 개의 예외가 있다면 "multi multi-catch" 블록을 이용하면 된다. 아래 예제에는 이 내용을 보여주고 있다.
public void newMultiMultiCatch() {
  try {
    methodThatThrowsThreeExceptions();
  } catch (ExceptionOne e) {
    // log and deal with ExceptionOn
  } catch (ExceptionTwo | ExceptionThree e) {
    // log and deal with ExceptionTwo and ExceptionThree
  }
}
다른 분류에 속하는 ExceptionTwo와 ExceptionThree는 다르게 분리되었지만, 하나의 catch블록에서 처리되어있다.

새로운 파일 시스템 API (NIO 2.0)

Java IO를 사용한 많은 사람들은 여전히 프레임워크에 의해서 발생되는 골치 거리들을 기억할 것이다. 운영체제나 다중파일 시스템에서 동일하게 적용하기 정말 어렵다. 대부분 예기치 않게 발생된 delete나 rename 메서드가 그런 경우이다. 특정 기호로 연결되어 작동하는 것은 다른 문제이다. 본질적으로 API는 정비가 필요하다. 

Java IO에서 나타난 위의 문제점들을 풀기 위해서 Java 7은 정비된 많은 종류의 새로운 API를 도입하였다. 

NIO2.0은 많이 향상된 점을 가지고 나왔다. 또한 다중파일시스템으로 작업하는 개발자의 삶의 불편을 덜어주기 위해 새로운 클래스들을 도입하였다. 

Path를 이용한 처리 

새로운 java.nio.file 패키지는 Path, Paths, fileSystem, FileSystems 등과 같은 클래스와 인터페이스로 구성되어있다. 

Path는 단순이 file 경로의 참조이다. java.io.File과 비슷하다(더 많은 특징을 가지고 있다). 아래에서는 temp 폴더의 참조 경로를 어떻게 획득하는지를 보여주고 있다.
public void pathInfo() {
  Path path = Paths.get("c:\Temp\temp");
  System.out.println("Number of Nodes:" + path.getNameCount());
  System.out.println("File Name:" + path.getFileName());
  System.out.println("File Root:" + path.getRoot());
  System.out.println("File Parent:" + path.getParent());
}
실행 결과는 다음과 같다.
Number of Nodes:2
File Name:temp.txt
File Root:c:
File Parent:c:Temp
파일이나 디렉토리를 삭제하는 것은 Files 클래스에 있는 delete 메서드를 호출하는 것만큼 간단하다. Files 클래스는 NoSuchFileException을 처리하는 것과 처리하지 않는 2개의 delete 메서드를 가지고 있다. 

아래에 delete 메서드 호출은 NoSuchFileException을 던진다. 따라서 해당 exception을 처리해야만 한다.
Files.delete(path);
만약 file 또는 디렉토리가 존재하지 않는다면 예외를 던지길 기대하더라도 Files.deleteIfExists(path)은 예외를 던지지 않는다. 

파일 시스템에서 효과적으로 동작하는 Files.copy(..)나 Files.move(..)와 같은 유용한 메서드를 사용할수 있다. 당신의 코드에서 링크를 만들때에 단순히 createSymbolicLink(..) 메서드를 사용하면 된다. 

알림을 변경한 File 

JDK7에서 가장 마음에 드는 점은 File Change Notifications의 추가이다. 아주 오랫동안 기다려왔던 이 기능은 마침내 NIO 2.0에 추가되었다. 

API를 구현하는데 관련된 단계는 아래와 같다.
  • WatchService를 생성한다. 이 서비스는 WatchKeys를 가지고 있는 큐로 구성되어있다.
  • 이 WatchService로 모니터링하고 싶은 디렉토리나 파일을 등록한다.
  • 등록하는 동안 받고 싶은 이벤트의 타입을 정의한다. (추가, 수정, 삭제등)
  • 이벤트를 받기위해 무한대 루프를 실행시켜야만 한다.
  • 이벤트가 발생하면 WatchKey 가 큐안으로 저장된다.
  • WatchKey를 사용하기 위해 쿼리를 호출한다.
다음 예제를 통해서 따라해보자. 우리는 특정 디렉토리를 감시하는 DirPolice 자바 프로그램을 만들것이다. 방법은 아래에 제공되어있다. 

1. WatchService 객체를 생성한다.
WatchService  watchService = FileSystems.getDefault().newWatchService();
2. 볼수있는 디렉토리의 참조경로를 가져온다. 나는 파일명을 하드코딩하지말고 파라메터로 전달하기를 추천한다.
path = Paths.get("C:\Temp\temp\");
3. 다음 단계는 모든 종류의 이벤트를 WatchService 에 등록한다.
dirToWatch.register(watchService, ENTRY_CREATE, ENTRY_MODIFY, ENTRY_DELETE);
이 타입들은 java.nio.file.StandardWatchEventKinds 에 정의된 이벤트 타입들이다. 

4. 무한 루프를 초기화하고 이벤트를 잡기위해 시작시킨다.
while(true)
{
  WatchKey key = watchService.take(); // this would return you keys
}
5. 키 이벤트들을 통해 실행된다.
for (WatchEvent<?> event : key.pollEvents()) {
  Kind<?> kind = event.kind();
  System.out.println("Event on " + event.context().toString() + " is " + kind);
}
예를들어, temp 디렉토리를 수정하거나 삭제하면 콘솔창에 각각 아래와 같은 문장을 보게 될것이다.
Event on temp is ENTRY_MODIFY 

Event on temp is ENTRY_DELETE
DirPolice 소스와 과련된 메서드는 아래에 게시되어있다. (전체 소스코드 다운로드)
/**
 * This initiates the police
 */
private void init() {
  path = Paths.get("C:\Temp\temp\");
  try {
    watchService = FileSystems.getDefault().newWatchService();
    path.register(watchService, ENTRY_CREATE, ENTRY_DELETE,
        ENTRY_MODIFY);
  } catch (IOException e) {
    System.out.println("IOException"+ e.getMessage());
  }
}

/**
 * The police will start making rounds
 */
private void doRounds() {
  WatchKey key = null;
  while(true) {
    try {
      key = watchService.take();
      for (WatchEvent<?> event : key.pollEvents()) {
        Kind<?> kind = event.kind();
        System.out.println("Event on " + event.context().toString() + " is " + kind);
      }
    } catch (InterruptedException e) {
      System.out.println("InterruptedException: "+e.getMessage());
    }
    boolean reset = key.reset();
    if(!reset)
      break;
  }
}

Fork와 Join

Java 프로그램에서 병렬코어들을 효과적으로 사용하는것은 항상 도전이었다. 여러개의 코어에 작업을 나눠주고 결과를 리턴받기위해 그것들을 조인하는 소수의 프레임워크들이 있다. Java7은 Fork와 Join 프레임워크로 이 기능들을 포함했다. 

기본적으로 소규모 작업이 더 이상의 분할이 없이 해결될 수 있을 때까지 Fork-Join은 작업들을 소규모로 나눈다. divide-and-conquer 알고리즘과 비슷하다. 이 프레임워크에서 주목할만한 중요한 개념은 원칙적으로 worker thread는 더이상 유휴상태일리가 없다는 것이다. 바쁜 worker들로부터 작업을 "훔친다" 는 것은 이 프레임워크가 work-stealing algorithm를 구현했다는 것이다. 

Fork-Join 메카니즘을 지원하는 코어 클래스들은 ForkJoinPool과 ForkJoinTask이다. 

ForkJoinPool 은 기본적으로 위에서 말했던 work-stealingalgorithm을 구현한 ExecutorService를 특화시켜서 구현한것이다. 

우리는 수많은 프로세서들을 동일한 레벨의 대상으로 제공함으로써 ForkJoinPool 객체를 생성한다.
ForkJoinPool pool = new ForkJoinPool(numberOfProcessors)
여기서 numberOfProcessors = Runtime.getRunTime().availableProcessors(); 

그러나 ForkJoinPool의 기본 인스턴스는 위에서 얻은 동일한 개수로 동일한 단계로 설정 해야 한다. 

해결해야 할 문제는 ForkJoinTask 안에 만들어져 있다. 그러나 RecursiveAction 과 RecursiveTask 클래스는 특별하게 구현되어 있다. 이 2개 클래스의 차이점은 앞에것은 리턴값이 없는 반면에 뒤에것은 특정 타입의 오브젝트를 리턴한다는 것이다. 

여기 당신의 요구사항을 나타낸 RecursiveAction 와 RecursiveTask 클래스를 어떻게 생성하는지 보여주고 있다.(나는 RecursiveAction 클래스를 사용했다.)
public class MyBigProblemTask extends RecursiveAction {
  @Override
  protected void compute() {
    . . . // your problem invocation goes here
  }
}
당신은 computing 기능을 필요하는 곳에 compute 메서드를 오버라이드 해야한다. 그리고 ForkJoinPool 안에 있는 호출 메서드 부름으로써 ForkJoinTask를 Executor에 전달한다.
pool.invoke(task);

동적 언어 지원

Java는 변수, 메서드와 반환값들의 타입을 컴파일 시간에 체크하는 정적인 유형의 언어이다. JVM은 타입정보를 찾는것에 대한 우려 없이 런타임시간에 강력히 정의된 바이트 코드를 실행시킨다. 

동적으로 타입이 정해지는 다른 유형의 언어들이 있다. Ruby, Python, Clojure 는 이 분류에 속한다. 이 언어들은 타입이 실행시간때까지 정해지지 않는다. 어떤 필요한 타입의 정보를 가지고 있지 않다는것은 Java에서는 불가능하다. 

동적 언어를 효과적으로 실행하는 것을 임시적으로 처리한것에 대한 자바진형에 압력이 증가하였다. 이들 언어들을 JVM에서 실행하는 것이 가능할지라도, 제약과 제한이 없는 것 은 아니었다. 

Java7에 있는 동적호출이라는 새로운 기능을 소개하였다. 이것은 자바 이외의 언어의 요구사항을 포함하기 위해 가상머신을 변경하여 만든것이다. java.lang.invoke 라는 새로운 패키지는 MethodHandle, CallSite등과 같은 클래스로 구성되어있고 동적 언어에 대한 지원을 확장하기 위해 만들어졌다.

마무리

우리가 알아본 Java7은 개발자의 얼굴을 웃음짓게 할 몇 가지 부가 기능들을 가지고 있다. 그리고 오픈소스 지원과 JVM 확장을 통한 동적언어 지원은 자바 진형 이외의 개발자들에게도 좋은 평가를 받을것임에 틀림없다.


출처 - http://www.hanb.co.kr/network/view.html?bi_id=1780


===================================================================================


자바 7에서 관심 있는 부분과 아쉬운 점

오늘, 7월 7일, 드디어 자바 7이 발표된다. (프로그래머들에게 별 관심도 받지 못한) 자바 6가 발표된 지 5년 만이다. 일반 개발자들에게는 "뭐야! 또 새로 나온거야?"라는 소리를 듣기는 하지만 내겐 자바가 그리 빠르게 성장한다는 느낌이 들지는 않는다. 물론 꼭 자바 언어가 변해야 하느냐는 얘기도 있다. 그런데 그렇게 주장하는 사람들은 이제 자바의 역할을 끝났으니 그루비나 스칼라 같은 다른 언어로 갈아 타라고 결론을 내리는 편이라서 일단 배제하겠다. (아! 지금 아는 걸로 천년 만년 먹고 살고 싶다는 사람도 있다. 나도 그러고 싶지만 이 업계가 이런 나태함을 허락하지 않으니 아쉽다. 사실 그런 업계라면 내겐 별 매력이 없다).

그런데 나는 이번 7이 그다지 성에 차지 않는다. 사실 자바 6.5라고 해야하지 않나 싶은데, 내가 투덜 거린다고 바뀔 것도 아니고, 곧 8을 내 놓겠다고 하니 지구 폭파 버튼은 조금 더 두고 보고 누를 생각이다.

암튼 이번 발표에서 관심이 가는 부분과 아쉬운 부분을 발표 전에 정리해 보겠다.

관심 가는 개선 사항

직업이 프로그래머다 보니 우선 언어의 변화에 관심이 가장 크다. 그동안 코인이란 이름으로 진행되던 소규모 언어 개선(JSR 334) 프로젝트 결과물 중 몇 개가 이번 자바 7에 포함된다.
  • switch문에 문자열 사용 - 뭐 좋아하는 사람도 많겠지만, 난 워낙 switch문을 잘 안 쓰니 그냥 그런가보다 싶다. (혹시 toString()으로 스칼라의 패턴 매칭 흉내 내려는 사람 없겠지?)
  • 이진 정수 리터럴과 숫자 리터럴에 밑줄 기호 사용 - 난 이거보다 short나 byte 형 리터럴 표기 방법을 원한다! 상수에 타입 변환을 해야 하다니!
  • 다중 예외 포획(-_-)과 정밀 재투척(-_-) - 아주 반갑다. 평소에 많이 아쉬웠다.
  • 지네릭 객체 생성시 타입 추론 - 아~ 쪼잔해... 자바는 힌들리-밀러 타입 추론을 도입하라!
  • 자동 자원 반환 - 좋은 기능이고 편하긴 하겠지만 자원을 반환해야 한다는 사실을 모르는 개발자는 이 구문도 모를 게 분명하다. 그리고 비대해진 try(...) 문이 가분수처럼 느껴진다.
  • 다중 인자 메서드 호출 단순화 - 잘못한(?) 놈은 놔두고 엄한 사람 보고 뭐라 그러는 문제 해결.
그 다음은 동시성 패키지 개선! (더그 리 교수님! 사랑합니다! OpenJDK에서 잘 부탁해요).
  • ForkJoinPool - 단연 기대 된다. ForkJoinPool은 비동기 실행을 해주는 ExecutorService의 새로운 구현체인데 비동기로 작업을 실행하되, 작업이 클 경우 여러 하위 작업으로 나눠서 여러 쓰레드에서 동시에 실행하도록 하는 프레임워크를 제공한다. 큰 작업을 나눠서 정복하기 방식으로 처리하면서 멀티 코어 CPU를 충분히 활용할 수 있다.
  • Phaser - CyclicBarrier와 CountDownLatch의 역할을 더 유연하고 범용적으로 사용할 수 있는 다중 쓰레드 동기화 관리 장치다. 부정 출발하는 쓰레드는 실격! 먼저 들어가기 없기! 중간에서 우리 만나! 등등
  • TransferQueue - 소비자와 생산자를 직접 만나게 해주는 직거래 장터... 같은 메시지 큐... 랄까...
  • ThreadLocalRandom - 다중 쓰레드 환경에서 더 효율적으로 돌아가는 Random 클래스. ThreadLocal에 각기 다른 Random을 넣어도 비슷하지만 ThreadLocalRandom은 초기화를 공유한다.
스크립팅 지원! 
자바 6에서는 아파치 BSF와 비슷한 기능이 JVM에 추가되는 수준의 스크립팅 지원이었을 뿐인데 자바 7에서는 JVM 기반 스크립트 언어(정확히는 동적 타이핑 언어)를 만드는 데 필요한 *엄청난* 기능이 VM에 반영된다.
지금의 자바에서는 절대 필요 없는 Continuation, Tail recursion 같은 기능이 JVM에 추가되고 동적 메서드 호출도 빨라진다. 이제 JVM은 (언어로서의) 자바만을 위한 VM이 아니라고 할만하다. (그동안 JVM에서 다른 언어 구현하느라 삽질한 분들에게 박수를...)

하지만!

이렇게 좋아진 자바 7이지만 내가 쌍수들어 반가워하지 않는 이유가 있다. 원래 자바 7에 포함되기로 했던 몇가지가 자바 8로 미뤄졌는데 그것들이 정작 내가 기대했던 부분이기 때문이다. 물론, 이 개선 사항들이 다음 버전으로 연기됐기 때문에 7이 지금 나올 수 있었던 것이고, 나머지를 빨리 마무리 해서 원래 계획에 없던 8로 내놓겠다고 하기는 했다. 그래도 그게 약속처럼 빨리 나올지도 모를 일이고... 아쉬움을 어쩔 수 없고... 그래서 이번 출시 판 번호는 7이 아니라 6.5라고 혼자 얘기해본다. (투덜투덜)

그럼 내가 기대했던 특징이 뭔지 나열해 보겠다.  
  • 자바 모듈화 지원 : 드디어 자바에 모듈 기능이 들어간다. 모듈화 지원 스펙인 JSR 294 때문에 언어, VM, API에 변화가 생기고 JDK 자체를 모듈화하는 Jigsaw 프로젝트의 결과가 반영된다. 자바 애플리케이션의 복잡도를 제어할 수 있는 모듈화 기능이 들어갈 뿐 아니라 컴포넌트 배포 환경에 변화가 생길 수도 있다.
  • 컬렉션 리터럴 : List, Set, Map을 리터럴로 표현할 수 있다. 빌더를 사용해서 회피하려고 해 보지만 컬렉션 초기화는 정말 귀찮다.
  • 람다(클로저) 지원 : 무슨 말이 필요할까. 다른 언어가 "우리는 클로저 된다!" 그러면 자바에서는 "엄마~ 우리는?" 했었는데 자바에 드디어 클로저가 들어온다. 스프링의 탬플릿-콜백 패턴은 이제 더 강력해진다.
-------
 
점심 시간에 잠깐 정리해서 올리려고 했는데 이런 저런 일로 마무리 못하다가 대충 정리해 올린다. 젠장!


출처 - http://gyumee.egloos.com/3196932






'Development > Java' 카테고리의 다른 글

java - File 클래스  (0) 2012.10.23
java - xml 읽고 쓰기  (1) 2012.10.22
java - 메서드 체인닝(Method chaining)  (0) 2012.10.08
java - Timer 및 TimerTask Class  (0) 2012.10.06
java - 가비지 컬렉션(Garbage Collection)  (0) 2012.10.05
Posted by linuxism
,

mysql - join

DB/MySQL 2012. 10. 19. 11:10


SQL joins are used to query data from two or more tables, based on a relationship between certain columns in these tables. This means everything you have learned so far can be applied after you’ve created this new, joined table.

How Does a Join Work?

 A join works through the use of keys. Continuing our example, our supplier table contains a column designated as the supplier_id. This column is configured as the primary key (for details on primary keys see Database Basics). The product table contains all of the products sold by our company, including product id, product description and product name. In addition it also contains the supplier id of the supplier from which we buy the individual products. Because this is a key from a different table (thesuppliers table) it is referred to as a foreign key. When using a SELECT statement to retrieve data from the product table we can use this foreign key to extract the relevant supplier information from the supplier table for each product.
 

Let’s begin by looking at our two tables, the supplier table and the product. First, the supplier table contains the following rows:

mysql> SELECT * FROM suppliers;
+-------------+---------------+-------------------+------------------+
| supplier_id | supplier_name | supplier_address  | supplier_contact |
+-------------+---------------+-------------------+------------------+
|           1 | Microsoft     | 1 Microsoft Way   | Bill Gates       |
|           2 | Apple, Inc.   | 1 Infinite Loop   | Steve Jobs       |
|           3 | EasyTech      | 100 Beltway Drive | John Williams    |
|           4 | WildTech      | 100 Hard Drive    | Alan Wilkes      |
+-------------+---------------+-------------------+------------------+
4 rows in set (0.00 sec)

And our product table contains the following rows:

SELECT * FROM product;
+-----------+----------------------------+-----------------------------+-------------+
| prod_code | prod_name                  | prod_desc                   | supplier_id |
+-----------+----------------------------+-----------------------------+-------------+
|         1 | CD-RW Model 4543           | CD Writer                   |           3 |
|         2 | EasyTech Mouse 7632        | Cordless Mouse              |           3 |
|         3 | WildTech 250Gb 1700        | SATA Disk Drive             |           4 |
|         4 | Microsoft 10-20 Keyboard   | Ergonomic Keyboard          |           1 |
|         5 | Apple iPhone 8Gb           | Smart Phone                 |           2 |
+-----------+----------------------------+-----------------------------+-------------+

As you can see from the above output, the product rows contain a column which holds the supplier_id of the supplier from which the product is obtained. Now that we have the tables created, we can begin to perform some joins.

Performing a Cross-Join

Joining tables involves combining rows from two tables. The most basic of join types is the cross-join. The cross-join simply assigns a row from one table to every row of the second table. This is of little or no use in real terms, but for the purposes of completeness, the syntax for a cross-join is as follows:

SELECT column_names FROM table1table2;

For example, if we were to perform the following command on our sample table we would get the following output:

+----------------------------+---------------+
| prod_name                  | supplier_name |
+----------------------------+---------------+
| CD-RW Model 4543           | Microsoft     |
| CD-RW Model 4543           | Apple, Inc.   |
| CD-RW Model 4543           | EasyTech      |
| CD-RW Model 4543           | WildTech      |
| EasyTech Mouse 7632        | Microsoft     |
| EasyTech Mouse 7632        | Apple, Inc.   |
| EasyTech Mouse 7632        | EasyTech      |
| EasyTech Mouse 7632        | WildTech      |
| WildTech 250Gb 1700        | Microsoft     |
| WildTech 250Gb 1700        | Apple, Inc.   |
| WildTech 250Gb 1700        | EasyTech      |
| WildTech 250Gb 1700        | WildTech      |
| Microsoft 10-20 Keyboard   | Microsoft     |
| Microsoft 10-20 Keyboard   | Apple, Inc.   |
| Microsoft 10-20 Keyboard   | EasyTech      |
| Microsoft 10-20 Keyboard   | WildTech      |
| Apple iPhone 8Gb           | Microsoft     |
| Apple iPhone 8Gb           | Apple, Inc.   |
| Apple iPhone 8Gb           | EasyTech      |
| Apple iPhone 8Gb           | WildTech      |
+----------------------------+---------------+

As you can see, it is hard to imagine how this could of use in many situations. A much more useful type of join is the Equi-Join or Inner Join.

Equi-Join (aka the Inner Join)

The Equi-Join joins rows from two or more tables based on comparisons between a specific column in each table. The syntax for this approach is as follows:

SELECT column_names FROM table1table2 WHERE (table1.column = table2.column);

For example, to extract the product name and supplier name for each row in our product table we would use the following command:

SELECT prod_name, supplier_name, supplier_address FROM product, suppliers WHERE (product.supplier_id = suppliers.supplier_id);

Note that we have to use what is known as the fully qualified name for the supplier_id column in each table since both tables contain a supplier_id. A fully qualified column name is defined by specifying the table name followed by a dot (.) and then the column name.

The result of the above command is to produces a list of products and the name and address of the supplier for each product:

+--------------------------+---------------+-------------------+
| prod_name                | supplier_name | supplier_address  |
+--------------------------+---------------+-------------------+
| Microsoft 10-20 Keyboard | Microsoft     | 1 Microsoft Way   |
| Apple iPhone 8Gb         | Apple, Inc.   | 1 Infinite Loop   |
| CD-RW Model 4543         | EasyTech      | 100 Beltway Drive |
| EasyTech Mouse 7632      | EasyTech      | 100 Beltway Drive |
| WildTech 250Gb 1700      | WildTech      | 100 Hard Drive    |
+--------------------------+---------------+-------------------+
5 rows in set (0.00 sec)

Performing a Left Join or a Right Join

Another way to join tables is use a LEFT JOIN in the select statement.The LEFT JOIN causes the tables to be joined before any WHERE clause is used. The syntax for this type of join is:

SELECT column names FROM table1 LEFT JOIN table2 ON (table1.column = table2.column);

Therefore, we can perform a LEFT JOIN that gives us the same result as our Equi-Join:

SELECT prod_name, supplier_name, supplier_address FROM product LEFT JOIN suppliers 
ON (product.supplier_id = suppliers.supplier_id);
+----------------------------+---------------+-------------------+
| prod_name                  | supplier_name | supplier_address  |
+----------------------------+---------------+-------------------+
| CD-RW Model 4543           | EasyTech      | 100 Beltway Drive |
| EasyTech Mouse 7632        | EasyTech      | 100 Beltway Drive |
| WildTech 250Gb 1700        | WildTech      | 100 Hard Drive    |
| Microsoft 10-20 Keyboard   | Microsoft     | 1 Microsoft Way   |
| Apple iPhone 8Gb           | Apple, Inc.   | 1 Infinite Loop   |
+----------------------------+---------------+-------------------+

One key different with the LEFT JOIN is that it will also list rows from the first table for which there is no match in the second table. For example, suppose we have product in our product table for which there is no matching supplier in the supplier table. When we run our SELECT statement the row will still be displayed, but with NULL values for the supplier columns since no such supplier exists:

+----------------------------+---------------+-------------------+
| prod_name                  | supplier_name | supplier_address  |
+----------------------------+---------------+-------------------+
| CD-RW Model 4543           | EasyTech      | 100 Beltway Drive |
| EasyTech Mouse 7632        | EasyTech      | 100 Beltway Drive |
| WildTech 250Gb 1700        | WildTech      | 100 Hard Drive    |
| Microsoft 10-20 Keyboard   | Microsoft     | 1 Microsoft Way   |
| Apple iPhone 8Gb           | Apple, Inc.   | 1 Infinite Loop   |
| Moto Razr                  | NULL          | NULL              |
+----------------------------+---------------+-------------------+

The opposite effect can be achieved using a RIGHT JOIN, whereby all the rows in a the second table (i.e. our supplier table) will be displayed regardless of whether that supplier has any products in ourproduct table:

SELECT prod_name, supplier_name, supplier_address FROM product RIGHT JOIN suppliers 
ON (product.supplier_id = suppliers.supplier_id); 
+--------------------------+-----------------+------------------------+
| prod_name                | supplier_name   | supplier_address       |
+--------------------------+-----------------+------------------------+
| Microsoft 10-20 Keyboard | Microsoft       | 1 Microsoft Way        |
| Apple iPhone 8Gb         | Apple, Inc.     | 1 Infinite Loop        |
| CD-RW Model 4543         | EasyTech        | 100 Beltway Drive      |
| EasyTech Mouse 7632      | EasyTech        | 100 Beltway Drive      |
| WildTech 250Gb 1700      | WildTech        | 100 Hard Drive         |
| NULL                     | Hewlett Packard | 100 Printer Expressway |
+--------------------------+-----------------+------------------------+

Creating Joins with WHERE and USING

The next step is to incorporate some WHERE clauses into our LEFT and RIGHT joins. Say, for example, that we wish to list only products supplied by Microsoft:

SELECT prod_name, supplier_name, supplier_address FROM product RIGHT JOIN suppliers 
ON (product.supplier_id = suppliers.supplier_id) WHERE supplier_name='Microsoft';
+--------------------------+---------------+------------------+
| prod_name                | supplier_name | supplier_address |
+--------------------------+---------------+------------------+
| Microsoft 10-20 Keyboard | Microsoft     | 1 Microsoft Way  |
+--------------------------+---------------+------------------+
1 row in set (0.00 sec)

The USING clause further simplifies the tasks of creating joins. The purpose of USING is to avoid the use of fully qualified names (such as product.supplier_id and supplier.supplier_id) when reference columns that reside in different tables but have the names. For example, to perform the same join above based on the values of product.supplier_id and supplier.supplier_id we can simply use the following syntax:

SELECT prod_name, supplier_name, supplier_address FROM product 
LEFT JOIN suppliers USING (supplier_id) WHERE supplier_name='Microsoft';

Resulting in the following output:

+--------------------------+---------------+------------------+
| prod_name                | supplier_name | supplier_address |
+--------------------------+---------------+------------------+
| Microsoft 10-20 Keyboard | Microsoft     | 1 Microsoft Way  |
+--------------------------+---------------+------------------+
1 row in set (0.00 sec)


출처 - http://webduos.com/mysql-join-syntax/#.UIC1-W8xqAg


===================================================================================


2009/05/13 00:54 Database/MySQL
MySQL에서 나름대로 많은 작업을 해왔지만 MS SQL에서 사용하던 FULL OUTER JOIN이 안된다는 것을 오늘에서야 알았다. 당황스러웠지만 침착하게(?) FULL OUTER JOIN 기능을 사용할 수 있는 방법에 관해서 트릭을 찾아보면서 고민을 좀 하였다.

그러는 중 내가 선택한 방법은 {LEFT | LIGHT} OUTER JOIN과 UNION의 조합이다. UNION을 이용할 때 두 질의의 결과값들이 중복되어 있을 경우, 이는 하나로 표시된다. 다음의 예제를 통해서 살펴보도록 하자.

test1과 test2 테이블을 만들고 다음과 같이 데이터를 넣어보자.

[test1] 테이블
name   age
-------------------
lin        22
sean    111

[test2] 테이블
name   age
-------------------
sean     28
ted        1

다음 질의를 실행하면 [test_result] 테이블이 자동으로 생성되고 그 결과가 들어가 있는 것을 확인할 수 있다.
SELECT t1.name as name, IFNULL(t1.age, 0) AS age1, IFNULL(t2.age, 0) AS age2
INTO test_result
FROM test1 t1
          LEFT OUTER JOIN test2 t2 ON t1.name = t2.name
UNION
SELECT t2.name, IFNULL(t1.age, 0), IFNULL(t2.age, 0)
FROM test1 t1
          RIGHT OUTER JOIN test2 t2 ON t1.name = t2.name

[test_result] 테이블
name   age1   age2
------------------------------
lin        22       0
sean    111      28
ted       0        1


출처 - http://creaplz.tistory.com/97






'DB > MySQL' 카테고리의 다른 글

mysql root password 초기화  (0) 2013.01.03
linux 에서 mysql rpm version install  (0) 2013.01.03
mysql - 사용자 정의 변수  (0) 2012.10.15
mysql - boolean 데이터 타입  (0) 2012.09.26
mysql - insert 시 있으면 update 없으면 insert  (0) 2012.09.22
Posted by linuxism
,


javascript Map HashMap

요즘 javascript의 대세는 역시 jQuery일것이다.
jQuery를 사용해 보니 가볍고 편리한게 장점인듯하다.

그래도 노가다 코딩을 워낙 싫어라 하는 탓에 jQuery를 한꺼플씩 포장해서 사용하고 있다.

제목과는 전혀 맞지 않는 서두라 죄송...^^

아무튼 구글링을 하면 관련 자료들이 많이 나오지만 사용중인 코드는 이거다.

Map = function(){
 this.map = new Object();
};   
Map.prototype = {   
    put : function(key, value){   
        this.map[key] = value;
    },   
    get : function(key){   
        return this.map[key];
    },
    containsKey : function(key){    
     return key in this.map;
    },
    containsValue : function(value){    
     for(var prop in this.map){
      if(this.map[prop] == value) return true;
     }
     return false;
    },
    isEmpty : function(key){    
     return (this.size() == 0);
    },
    clear : function(){   
     for(var prop in this.map){
      delete this.map[prop];
     }
    },
    remove : function(key){    
     delete this.map[key];
    },
    keys : function(){   
        var keys = new Array();   
        for(var prop in this.map){   
            keys.push(prop);
        }   
        return keys;
    },
    values : function(){   
     var values = new Array();   
        for(var prop in this.map){   
         values.push(this.map[prop]);
        }   
        return values;
    },
    size : function(){
      var count = 0;
      for (var prop in this.map) {
        count++;
      }
      return count;
    }
};

사용법은 간단하다.
var map = new Map();
 map.put("user_id", "atspeed");
 -----------------------
map.get("user_id");

그냥 java Map과 동일하게 사용하면 되는거다.


출처 - http://atspeed.blogspot.kr/2011/01/javascript-hashmap.html



Posted by linuxism
,