Set
저장 순서가 유지되지 않고, 중복 인스턴스도 저장하지 못하게 하는 자료구조
수학에 비유하면 집합과 비슷한 개념이다.
구현 클래스 : HashSet, LinkedHashSet, TreeSet
Set 인터페이스를 구현 한 Set 컬렉션 클래스의 특징
1. 요소의 저장 순서를 유지하지 않는다.
2. 같은 요소의 중복 저장을 허용하지 않는다. (null 값도 중복되지 않아 하나의 null 만 저장한다)
HashSet 클래스
Set 컬렉션 클래스에서 가장 많이 사용 되는 클래스 중 하나이다.
JDK 1.2부터 제공되고 있으며 해시 알고리즘을 사용하여 검색 속도가 빠르다는 장점을 가진다.
HashSet Set에 인스턴스를 저장할 때 hash함수를 사용하여 처리 속도가 빠름
동일 인스턴스 뿐 아니라 동등 인스턴스도 중복하여 저장하지 않음
(동일 : 완전히 같은 인스턴스)
(동등 : 다른 인스턴스이지만 특정한 기준들의 속성 값이 같음)
HashSet 인스턴스 생성
HashSet<String> hset = new HashSet<>();
다형성 적용하여 상위 인터페이스를 타입으로 사용 가능
//Set hset2 = new HashSet();
//Collection hset3 = new HashSet();
hset.add(new String("java"));
hset.add(new String("oracle"));
hset.add(new String("jdbc"));
hset.add(new String("html"));
hset.add(new String("css"));
저장 순서 유지 안됨
System.out.println(hset);
중복 허용 안함
hset.add(new String("java"));
System.out.println(hset);
System.out.println("저장 된 객체 수 : " + hset.size());
System.out.println("포함 여부 확인 : " + hset.contains(new String("oracle")));
저장 된 객체를 하나씩 꺼내는 기능이 없음
반복문을 이용한 연속 처리 하는 방법
1. toArray() 로 배열로 변경한 뒤 for loop 사용
Object[] arr = hset.toArray();
for(int i = 0; i < arr.length; i++) {
System.out.println(i + " : " + arr[i]);
}
2. iterator() 로 목록 만들어 연속 처리
iterator는 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스로
List와 Set계열에서만 사용된다. (Map의 경우 Set 또는 List화 시켜서 iterator()를 사용
Iterator<String> iter = hset.iterator();
while(iter.hasNext()) {
System.out.println(iter.next());
}
지우는 방법
hset.clear();
System.out.println("empty? : " + hset.isEmpty());
LinkedHashSet 클래스
HashSet이 가지는 기능을 모두 가지고 있고
추가적으로 저장 순서를 유지하는 특징을 가지고 있다.
JDK 1.4부터 제공하고 있다.
LinkedHashSet<String> lhset = new LinkedHashSet<>();
lhset.add("java");
lhset.add("oracle");
lhset.add("jdbc");
lhset.add("html");
lhset.add("css");
System.out.println("lhset : " + lhset);
출력: java, oracle, jdbc, html, css
만들어진 링크드해쉬셋을 가지고 트리셋으로 객체를 생성하면
같은 타입의 객체를 자동으로 비교하여 오름차순으로 정렬한다.
TreeSet<String> tset = new TreeSet<>(lhset);
System.out.println(tset);
출력: css, htm, java, jdbc, oracle
TreeSet 클래스
TreeSet 클래스는 데이터가 정렬 된 상태로 저장 되는 이진 검색 트리의 형태로 요소를 저장한다.
이진 검색 트리는 데이터를 추가하거나 제거하는 등의 기본 동작 시간이 매우 빠르다.
JDK 1.2부터 제공되고 있으며
Set 인터페이스가 가지는 특징을 그대로 가지지만 정렬 된 상태를 유지한다는 것이 다른 점이다.
이진트리를 기반으로 한 Set 컬렉션으로,
왼쪽과 오른쪽 자식노드를 참조하기 위한 두 개의 변수로 구성.
TreeSet<String> tset = new TreeSet<>();
//Set<String> tset2 = new TreeSet<>(); 이렇게 다형성 이용해서 사용도 가능하다.
tset.add("java");
tset.add("oracle");
tset.add("jdbc");
tset.add("html");
tset.add("css");
/* 자동 오름차순 정렬 */
System.out.println(tset);
TreeSet은 자동으로 정렬기준이 있는데 같은 타입만 저장이 된 경우만 가능하다.
목록 만들어서 하나씩 대문자로 변경해서 출력 처리
Iterator<String> iter = tset.iterator();
while(iter.hasNext()) {
System.out.println(iter.next().toUpperCase());
}
배열로 바꾸어 연속 처리하기
Object[] arr = tset.toArray();
for(Object obj : arr) {
System.out.println(((String)obj).toUpperCase());
}
로또 번호 발생기 (TreeSet의 특징 이용)
Set<Integer> lotto = new TreeSet<>();
while(lotto.size() < 6) {
lotto.add((int)(Math.random() * 45) + 1);
}
System.out.println("lotto : " + lotto);
Map
키(key)와 값(value)으로 구성되어 있으며, 키와 값은 모두 인스턴스
키는 중복 저장을 허용하지 않고(Set방식), 값은 중복 저장 가능(List방식)
키가 중복되는 경우, 기존에 있는 키에 해당하는 값을 덮어 씀
구현 클래스 : HashMap, HashTable, LinkedHashMap, Properties, TreeMap
Map 인터페이스의 특징
Collection 인터페이스와는 다른 저장 방식을 가진다.
키(key)와 값(value)를 하나의 쌍으로 저장하는 방식을 사용한다.
키(key)란?
값(value)을 찾기 위한 이름 역할을 하는 객체를 의미한다.
1. 요소의 저장 순서를 유지하지 않는다.
2. 키는 중복을 허용하지 않지만, 키가 다르면 중복 되는 값은 저장 가능하다.
HashMap, HashTable, TreeMap 등의 대표적인 클래스가 있다.
HashMap이 가장 많이 사용 되며 HashTable은 JDK 1.0부터 제공되며
HashMap과 동일하게 동작된다. 하위 호환을 위해 남겨놓았기 때문에 가급적이면 HashMap을 사용하는 것이 좋다.
HashMap 인스턴스 생성
HashMap hmap = new HashMap();
//Map hmap = new HashMap(); //상위 타입으로도 사용 가능.
키와 값 쌍으로 저장한다. 키와 값 둘 다 반드시 객체여야 한다.
hmap.put("one", new Date());
hmap.put(12, "red apple");
hmap.put(33, 123);
// AutoBaxing 처리 됨. int => integer
저장 순서 유지하지 않음
System.out.println("hmap : " + hmap);
키는 중복 저장 되지 않음(set방식) : 최근 값으로 덮어쓰기
hmap.put(12, "yellow banana");
System.out.println("hmap : " + hmap);
키가 다르면 값 객체 저장은 중복으로 가능함
hmap.put(11, "yellow banana");
System.out.println("hmap : " + hmap);
값 객체의 내용을 가져올 때
System.out.println("키 11에 대한 객체 : " + hmap.get(11));
키 값을 가지고 삭제를 처리할 때
hmap.remove(11);
System.out.println("hmap : " + hmap);
저장 된 객체 수를 확인할 때
System.out.println("hmap에 저장 된 객체 수 : " + hmap.size());
제네릭 설정한 HashMap 인스턴스 생성
HashMap<String, String> hmap2 = new HashMap<>();
hmap2.put("one", "java");
hmap2.put("two", "oracle");
hmap2.put("three", "jdbc");
hmap2.put("four", "html");
hmap2.put("five", "css");
1. keySet()을 이용해서 키만 따로 set으로 만들고,
iterator()로 키에 대한 목록을 만든다.
//Set<String> keys = hmap2.keySet();
//Iterator<String> keyIter = keys.iterator();
Iterator<String> keyIter = hmap2.keySet().iterator();
while(keyIter.hasNext()) {
String key = keyIter.next();
String value = hmap2.get(key);
System.out.println(key + " = " + value);
}
2. 저장 된 value 객체들만 values()로 Collection으로 만든다.
Collection<String> values = hmap2.values();
2-1. iterator()로 목록 만들어서 처리
Iterator<String> valueIter = values.iterator();
while(valueIter.hasNext()) {
System.out.println(valueIter.next());
}
2-2. 배열로 만들어서 처리
Object[] valueArr = values.toArray();
for(int i = 0; i < valueArr.length; i++) {
System.out.println(i + " : " + valueArr[i]);
}
3. Map의 내부 클래스인 EntrySet을 이용 : entrySet()
Set<Map.Entry<String, String>> set = hmap2.entrySet();
Iterator<Map.Entry<String, String>> entryIter = set.iterator();
while(entryIter.hasNext()) {
Map.Entry<String, String> entry = entryIter.next();
System.out.println(entry.getKey() +" : " + entry.getValue());
}
Properties
키와 값을 String 타입으로 제한한 Map 컬렉션
주로 Properties는 프로퍼티(*.properties)파일을 읽어 들일 때 주로 사용
프로퍼티(*.properties)파일
옵션정보, 데이터베이스 연결정보, 국제화(다국어)정보를 기록하여 텍스트 파일로 활용
애플리케이션에서 주로 변경이 잦은 문자열을 저장하여 관리하기 때문에
유지보수를 편리하게 만들어 줌
키와 값이 ‘=‘기호로 연결되어 있는 텍스트 파일로 ISO 8859-1 문자셋으로 저장되고,
한글은 유니코드(Unicode)로 변환되어 저장
프로퍼티 생성 후 setProperty(String 키, String 값 )으로 작성한다.
Properties prop = new Properties();
prop.setProperty("driver", "oracle.jdbc.driver.OracleDriver");
prop.setProperty("url", "jdbc:oracle:thin:@127.0.0.1:1521:xe");
prop.setProperty("user", "student");
prop.setProperty("password", "student");
System.out.println(prop);
경로를 지정하지 않으면 새로고침 후 작성한 클래스에 작성한 파일이 생성된 걸 확인할 수 있다.
try {
prop.store(new FileOutputStream("driver.dat"), "jdbc driver");
prop.store(new FileWriter("driver.txt"), "jdbc driver");
prop.storeToXML(new FileOutputStream("driver.xml"), "jdbc driver");
} catch (IOException e) {
e.printStackTrace();
}
#jdbc driver //지정한 이름
#Tue Jan 11 10:31:42 KST 2022 //생성일자
password=student
driver=oracle.jdbc.driver.OracleDriver
user=student
url=jdbc\:oracle\:thin\:@127.0.0.1\:1521\:xe
형태로 driver.dat 저장된 것을 확인 가능하다.
파일로부터 읽어와서 Properties에 기록할 수 도 있다.
Properties prop2 = new Properties();
try {
//prop2.load(new FileInputStream("driver.dat"));
//prop2.load(new FileReader("driver.txt"));
prop2.loadFromXML(new FileInputStream("driver.xml"));
/* Properties의 모든 키 값 목록을 대상 스트림에 내보내기 한다. */
prop2.list(System.out);
System.out.println(prop2.getProperty("driver"));
System.out.println(prop2.getProperty("url"));
System.out.println(prop2.getProperty("user"));
System.out.println(prop2.getProperty("password"));
} catch (IOException e) {
e.printStackTrace();
}
=> 지금까지 id, password같은 정보를 리터럴하게 코드안에 작성했다면, 이제는 옵션 프로퍼티 파일안에서 수정후
값을 읽어오기만 하면 되니 코드를 수정할 필요가 없게 된다. (프로퍼티의 목적)
'백엔드 과정 > Java' 카테고리의 다른 글
[Java] day22. 입출력IO / Stream / File (0) | 2022.01.12 |
---|---|
[Java] 국비교육 day21. 예외처리 Exception (0) | 2022.01.12 |
[Java] day19. 컬렉션 자료구조 Stack/ Queue (0) | 2022.01.11 |
[Java] day19. 컬렉션 프레임워크 LinkedList (0) | 2022.01.11 |
[Java] day19. 컬렉션 프레임워크 ArrayList (0) | 2022.01.11 |