안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
List 컬렉션=>
2017/03/21 - [자바] - 자바 컬렉션 프레임워크란? /
자바 List 컬렉션 자바 리스트 컬렉션 -> ArrayList, Vector, LinkedList
Set 컬렉션 =>
2017/03/23 - [자바] - 자바 Set 컬렉션 자바 셋 컬렉션 -> HashSet
지난 포스팅에 이어 이번엔 Map 컬렉션에 대해 공부하겠씁니다.
Map 컬렉션 :
Key 와 Value 로 구성된 Entry 객체를 저장하는 구조를 가지는 컬렉션이며
Key 와 Value는 모두 객체이고, Key는 중복 저장될 수 없고 Value는 중복 저장될 수 있습니다.
만약 이미 저장된 Key와 동일한 Key로 값을 저장하게 되면 기존 Value는 사라지고
새로운 Value 로 대치됩니다.
Map 컬렉션에는 HashMap, Hashtable, LinkedHashMap, Properties, TreeMap 등이 있는데요.
아래 표는 Map 컬렉션에서 제공하는 공통으로 사용가능한 Map 인터페이스 메소드들입니다.
메소드들의 매개 변수 타입과 리턴타입에 타입 파라미터가 있는데 ,
Map 인터페이스가 제네릭 타입이기 때문입니다. Map도 마찬가지로
구체적인 타입은 구현 객체 생성 시 결정됩니다.
put() 은 객체 추가 시, get() 은 객체를 가져올 때, remove() 는 객체를 제거할 때 사용됩니다.
기본적인 사용방법 예제
그럼 이제 구현 객체들에 대해 보겠씁니다.
1. HashMap<K,V>
=> Map 인터페이스를 구현한 대표적인 Map 컬렉션입니다.
HashMap의 Key로 사용될 객체는 hashCode() 와 equals()를 재정의하여
동등 객체가 될 조건을 정해야 합니다.
hashCode()의 리턴값이 같고, equals() 가 true를 리턴하면 동일한 키로 간주합니다.
Key 타입은 주로 String을 많이 사용합니다.
String의 경우 문자열이 같으면 동등 객체가 될 수 있도록 hashCode()와 equals()가
이미 재정의 되어 있습니다.
HashMap 을 생성하려면 Key 타입과 Value 타입을 파라미터로 주고
기본 생성자를 호출하면 됩니다.
ex) Map<K, V> hashMap = new HashMap<K, V>();
그럼 바로 HashMap 사용 예제와
hashCode(), equals() 재정의 예제를 보겠습니다.
1)hashMap 사용 예제
2) 재정의 예제
2. Hashtable
HashMap과 동일한 구조이지만 ArrayList와 Vector의 차이처럼 Hashtable도 동기화된
메소드들로 구성되어 있어서 멀티 스레드 환경에서 동시에 여러 쓰레드가
이 메소드들을 실행할 수 없습니다.
그래서 멀티 쓰레드 환경에서 안전하게 객체를 추가, 삭제할 수 있습니다.
사용방법은 HashMap과 다르지 않아서 따로 예제를 올리진 않겠습니다.
3. Properties
Properties는 Hashtable의 하위 클래스입니다.
그렇기 때문에 Hashtable의 특징을 모두 그대로 가지고 있습니다.
차이점은 Properties의 경우 Key 와 Value 를 String 타입으로 제한한 컬렉션입니다.
애플리케이션 옵션 정보, 데이터베이스 연결 정보,
국제화(다국어) 정보가 저장된 프로퍼티(~.properties) 파일을 읽을 때 주로 사용합니다.
프로퍼티 파일은 Key 와 Value 가 = 기호로 연결되어 있는 텍스트 파일로
ISO 8859-1 문자셋으로 저장됩니다.
이 문자 셋으로 직접 표현할 수 없는 한글은 유니코드로 변환되어 저장됩니다.
이클립스에서 유니코드로 변환된 내용을 다시 한글로 보려면 마우스를 유니코드 위에 올려놓으면 됩니다.
이클립스를 사용하지 않는다면 한글이 포함된 프로퍼티 파일을 다른 에디터에서 작성하고
<JDK설치폴더>\bin\native2ascii.exe 툴을 이용해서 ISO 8859_1 파일을 얻으면 됩니다.
프로퍼티 파일을 읽기 위해서는 Properties 객체를 생성하고 load()를 호출하면 됩니다.
load() 메서드는 프로퍼티 파일로부터 데이터를 읽기 위해 FileReader 객체를 매개값으로 받습니다.
Properties pro = new Properties();
pro.load(new FileReader("프로퍼티 파일 경로"));
프로퍼티 파일은 일반적으로 클래스파일(~.class)과 함께 저장됩니다. 클래스 파일을 기준으로 상대 경로를 이용해서 프로퍼티 파일의 경로를 얻으려면 Class 의 getResource() 메서드를 사용하면 됩니다.
getResource()는 주어진 파일의 상대 경로를 URL로 리턴합니다. URL 의 getPath()는 파일의 절대 경로를 리턴합니다.
String path = 클래스.class.getResoruce("database.properties").getPath();
path = URLDecoder.decode(path, "UTF-8"); // 경로에 한글이 있을 경우에 한글을 복원합니다.
Properties pro = new Properties();
pro.load(new FileReader(path));
만약 다른 패키지에 프로퍼티 파일이 있는 경우는 경로 구분자로 "/" 를 사용합니다. 예를 들어 A클래스가 com.naver 패키지에 있고 database.properties 파일이 com.naver.www 패키지에 있을 경우
String path = A.class.getResource("www/database.properties").getPath();
Properties 객체에서 해당 키의 값을 읽으려면 getProperty()를 사용합니다. Properties도 Map 컬렉션이므로 get() 메서드로 값을 얻을 수도 있지만, get()는 값을 object 타입으로 리턴하므로 강제 타입 변환해서 String을 얻어야하기 때문에 일반적으로 getProperty()를 사용합니다.
String val = properties.getProperty("key");
예제)database.properties 파일로부터 값을 읽어 출력하는 예제)
같은 패키지에 database.properties라는 파일이 있어야합니다.
import java.io.FileReader;
import java.net.URLDecoder;
import java.util.Properties;
public class Example {
public static void main(String[] args) throws Exception {
Properties properties = new Properties();
String path = PropertiesExample.class.getResource("database.properties").getPath();
path = URLDecoder.decode(path, "utf-8");
properties.load(new FileReader(path));
String driver = properties.getProperty("driver");
String url = properties.getProperty("url");
String username = properties.getProperty("username");
String password = properties.getProperty("password");
System.out.println("driver : " + driver);
System.out.println("url : " + url);
System.out.println("username : " + username);
System.out.println("password : " + password);
}
}
이상입니다.
다음 포스팅에서는 검색 기능을 강화시킨 컬렉션에 대해 공부하겠습니다.
'자바' 카테고리의 다른 글
자바 컬렉션 Java - TreeMap, Comparable과 Comparator (0) | 2017.03.25 |
---|---|
자바 컬렉션 Java 컬렉션 - 이진트리구조, TreeSet (0) | 2017.03.25 |
자바 Set 컬렉션 자바 셋 컬렉션 -> HashSet (0) | 2017.03.23 |
자바 컬렉션 프레임워크란? / 자바 List 컬렉션 자바 리스트 컬렉션 -> ArrayList, Vector, LinkedList (2) | 2017.03.21 |
자바 람다식 java Operator , Predicate 함수적 인터페이스 (0) | 2017.03.19 |