Chapter 13. 컬렉션과 제네릭 (2)

SeungHyun Son·2021년 6월 30일
0

Set

저장 순서가 유지되지 않으며, 객체를 중복해서 저장할 수 없음
인덱스로 관리하지 않기 때문에 인덱스를 매개 변수로 갖는 메소드가 없음

Set 인터페이스로 구현된 클래스

  • HashSet
  • LinkedHashSet
  • TreeSet

Set 인터페이스에 구현된 메소드

기능메소드설명
객체 추가boolean add(E e)주어진 객체 e를 추가
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 여부 확인
boolean isEmpty()컬렉션이 비어 있는지 조사
int size()저장되어 있는 전체 객체 수를 리턴
Object[] toArray()배열로 반환
Object[] toArray(Object[] a)지정한 배열의 클래스 타입으로 배열로 변환
객체 삭제void clear()저장된 모든 객체를 삭제
boolean remove(Object o)주어진 객체를 삭제
boolean removeAll(Collection c)저장된 모든 객체를 삭제

HashSet

내부적으로 HashMap을 사용
객체들을 순서 없이 저장하고 동일한 객체는 중복 저장하지 않음
저장하려는 객체의 해시코드와 저장된 객체들의 해시코드를 비교해 같은 값이 없다면 객체 추가

Set<E> set = new HashSet<E>();

LinkedHashSet

해시 테이블에 데이터를 저장
저장된 순서에 따라 순서가 결정된다.
추가된 순서, 또는 가장 최근에 접근한 순서대로 접근 가능

test.collection.TestLinkedHashSet.java

01 package test.collection;
02
03 import java.util.LinkedHashSet;
04
05 public class TestLinkedHashSet {
06
07     public void testLinkedHashSet() {
08         LinkedHashSet<String> set = new LinkedHashSet<String>();
09
10         set.add("Java");
11         set.add("Oracle");
12         set.add("JDBC");
13         set.add("HTML5");
14
15         for(String text : set) { // HashSet과 다르게 값이 들어간 순서대로 출력된다.
16             System.out.println(text);
17         }
18     }
19 }

test.main.Main.java

01 package test.main;
02
03 import test.collection.TestLinkedHashSet;
04
05 public class Main {
06     public static void main(String[] args) {
07         new TestLinkedHashSet().testLinkedHashSet();
08     }
09 }
------
Java
Oracle
JDBC
HTML5

TreeSet

정렬 기능이 추가되었고 동일한 객체는 중복 저장하지 않음
정렬된 순서대로 보관하며 정렬 방법을 지정할 수 있음
범위 검색 작업에 효과적
레드블랙트리 구조를 사용
HashSet보다 성능상 느리지만 삽입과 동시에 정렬할 때 사용

test.collection.TestTreeSet.java

01 package test.collection;
02
03 import java.util.TreeSet;
04
05 public class TestTreeSet {
06     public void testTreeSet() {
07         TreeSet<String> tset = new TreeSet<String>();
08
09         tset.add("3. Mybatis");
10         tset.add("1. Java");
11         tset.add("5. HTML5");
12         tset.add("4. Oracle");
13         tset.add("2. JDBC");
14
15         for(String text : tset) { // 앞의 번호 순으로 자동 정렬되어 출력된다.
16             System.out.println(text);
17         }
18     }
19 }

test.main.Main.java

01 package test.main;
02
03 import test.collection.TestTreeSet;
04
05 public class Main {
06     public static void main(String[] args) {
07         new TestTreeSet().testTreeSet();
08     }
09 }
------
1. Java
2. JDBC
3. Mybatis
4. Oracle
5. HTML5

Map

키와 값으로 구성된 엔트리 객체를 저장하며, 키와 값 모두 객체로, 키는 중복될 수 없지만 값은 중복 가능하다. 기존에 저장된 키로 값을 저장하면 덮어 씌워진다.

Map 인터페이스로 구현된 클래스

  • HashMap
  • Hashtable
  • Properties

Map 인터페이스에 구현된 메소드

기능메소드설명
객체 추가V put(K key, V value주어진 키와 값을 추가
객체 검색V get(Object key)주어진 키와 값을 리턴
boolean contains(Object key)주어진 키가 있는지 여부
boolean containsValue(Object value)주어진 값이 있는지 여부
Set<Map.Entry<K,V>> entrySet()주어진 키와 값의 쌍으로 구성된 모든 엔트리 객체를 Set에 담아 리턴
boolean isEmpty()컬렉션이 비어있는지 조사
int size()저장되어 있는 전체 객체 수를 리턴
Set keySet()모든 키를 Set 객체에 담아 리턴
Collection values()모든 값을 Collection 객체에 담아 리턴
객체 삭제void clear()저장된 엔트리 객체를 삭제
v remove(Object key)주어진 키와 일치하는 엔트리 객체를 삭제

HashMap

Map 인터페이스를 구현한 대표 Map 컬렉션
키는 중복 저장을 허용하지 않으며, 값은 중복을 허용
동일한 키가 될 조건은 hashCode()의 리턴값이 같고, equals() 매소드의 결과가 true이어야 함

Hashtable

HashMap과 동일한 내부 구조를 가지고 있음
HashMap과 달리 동기화된 메소드로 구성되어 있어 멀티 스레드 환경에서 동시에 구현된 메소드들을 실행할 수 있다.

test.map.TestHashMap.java

01 package test.map;
02
03 import java.util.HashMap;
04 import java.util.Iterator;
05
06 public class TestHashMap {
07     public void testMap() {
08         HashMap<Integer,String> map = new HashMap<Integer,String>();
09         map.put(1, "Apple");
10         map.put(4, "Dandelion");
11         map.put(3, "Com");
12         map.put(2, "BlackBerry");
13
14         Iterator<Integer> iterKey = map.keySet().iterator();
15
16         while(iterKey.hasNext()) { // 작성한 map 객체를 목록화하여 각각 출력한다.
17             int key = iterKey.next();
18             System.out.println("key " + key + " : " + map.get(key));
19         }
20     }
21 }    

test.main.Main.java
01 package.test.main;
02
03 import test.map.TestHashMap;
04
05 public class Main {
06 public static void main(String[] args) {
07 new TestHashMap().testMap();
08 }

09 }

key 1 : Apple
key 2 : BlackBerry
key 3 : Com
key 4 : Dandelion


### Properties
>Hashtable의 하위 클래스로, 키와 값을 String 타입으로 제한
애플리케이션의 옵션 정보, 데이터베이스 연결 정보, 다국어 정보가 저장된 프로퍼티(*.properties) 파일을 읽을 때 주로 사용하며, 예제에 관련 IO 클래스를 포함하여 작성하였다. IO 클래스는 이후 입출력 파트에서 자세히 다루도록 하겠다.

test.map.PropertiesStudent.java
```java
01 package test.map;
02
03 public class PropertiesStudent implements java.io.Serializable {
04     private String no;
05     private String name;
06     private int score;
07
08     public Student() {}
09     public Student(String no, String name, int score) {
10     this.no = no;
11     this.name = name;
12     this.score = score;
13     }
14     @Override
15     public String toString() {
16     return no + ", " + name + ", " + score;
17     }
18     /*... Getter & Setter 작성부 ... */
19 }

test.map.StudentManager.java

01 package test.map;
02
03 import.java.io.*;
04 import.java.util.*;
05
06 public class StudentManager {
07     private ArrayList<Student> list = new ArrayList<Student>();
08     private Properties prop = new Properties();
09
10     public StudentManager() {}
11     public void propertyInsert(Student st) {
12         prop.setProperty(st.getNo(), st.toString());
13         System.out.println(st.getName() + " 학생의 데이터 삽입 성공!");
14     }
15     public void propertyStore() {
16         try { // 설정 파일 저장 시...
17             prop.store(new FileWriter(new File("prop.properties")), "Ex_Student.properties");
18             System.out.println("학생 데이터 저장 성공!");
19         } catch(Exception e) {
20             e.printStackTrace();
21         }
22     }
23     public void propertyPrint() {
24         try { // 설정 파일 불러올 시...
25             prop.load(new FileReader(new File("prop.properties")));
26             for(int i = 1; i <= prop.size(); i++) {
27                 String index = String.valueOf(i); // String 형변환을 통한 key 값 도출
28                 iist.add(parseStudent(prop.getProperty(index)));
29             }
30         } catch (Exception e) {
31             e.printStackTrace();
32         }
33
34         for(Student s : list) {
35             System.out.println(s);
36         }
37         System.out.println("학생 데이터 출력이 완료되었습니다.");
38     }
39
40     public Student parseStudent(String str) { // 넘겨 받은 데이터를 학생 객체로 변환
41         String tmp[] = str.split(", ");
42         return new Student(tmp[0], tmp[1], Integer.parseInt(tmp[2]));
43     }
44 }

test.main.PropertiesMain.java

01 package test.main;
02
03 import test.map.PropertiesStudent;
04 import test.map.StudentManager;
05
06 public class PropertiesMain {
07     public static void main(String[] args) {
08         StudentManager stm = new StudentManager();
09
10         // properties 데이터 삽입
11         stm.propertyInsert(new Student("1", "홍길동", 80));
12         stm.propertyInsert(new Student("2", "김유신", 60));
13         stm.propertyInsert(new Student("3", "신사임당", 95));
14
15         // properties 데이터 저장
16         stm.propertyStore();
17
18         // properties 데이터 입출력
19         stm.propertyPrint();
20      }    
21 }   
                                          >

prop.properties

01 #Ex_Student_properties
02 1=1, 홍길동, 80
03 2=2, 김유신, 60
04 3=3, 신사임당, 95

0개의 댓글

관련 채용 정보