JAVA/Java 기초

컬렉션자료구조2.java

john_ 2023. 1. 26. 14:02
728x90

Map 컬렉션

 

  • 키와 값으로 구성된 엔트리 객체를 저장합니다. (JSON : NOSQL)
  • 키는 중복 저장할수 없지만 값은 중복 저장할 수 있습니다. (키 값은 중복 저장 하면 안됩니다)
  • 기존에 저장된 키와 동일한 키로 값을 저장하면 새로운 값으로 대치 합니다.

 

 

 


HashMap (- List)

  • 키로 사용할 객체가 hashCode() 메소드의 리턴값이 같고 equals() 메소드가 true를 리턴할 경우 동일 키로 보고 중복 저장을 허용 하지 않습니다.

 

 

 

 

import java.util.*;
import java.util.Map.Entry;


public class HashMapExam {

	public static void main(String[] args) {
		
		// Map 컬렉션 생성
		Map<String, Integer> map = new HashMap<>();
		
		map.put("신용권", 85);
		map.put("홍길동", 85);
		map.put("동장군", 80);
		map.put("홍길동", 95);  // 키값이 같은것을 제일 마지막의 키값으로 저장한 값만 저장합니다
		System.out.println("총 Entry 수 : " + map.size());
		System.out.println();
		
		// 키로 값 얻기
		String key = "홍길동";
		int value = map.get(key);
		System.out.println(key + " : " + value);
		System.out.println();
		
		// 키 Set 컬렉션을 얻고, 반복해서 키와 값을 얻기
		Set<String> keySet = map.keySet();	// key로 set을 만들고
		Iterator<String> keyIterator = keySet.iterator();	// keyset 이용해서 Iterator 실행
		
		while(keyIterator.hasNext()) {	// set에 값이 있는지 확인 : 값이 없으면 실행 X
			String k = keyIterator.next();	// set에서 값을 하나 가져오기
			Integer v = map.get(k);
			System.out.println(k + " : " + v);
		}
		System.out.println();
		
		//엔트리 Set 컬렉션을 얻고, 반복해서 키와 값을 얻기.
		Set<Entry<String, Integer>> entrySet = map.entrySet();
		Iterator<Entry<String, Integer>> entryIterator = entrySet.iterator();
		while(entryIterator.hasNext()) {
			Entry<String,Integer> entry = entryIterator.next();
			String k = entry.getKey();		// key 값을 반환
			Integer v = entry.getValue();	// value 값을 반환
			System.out.println(k + " : " + v);
		}
		System.out.println();
		
		//키로 엔트리 삭제
		map.remove("홍길동"); // 홍길동 key를 가진 map을 삭제
		System.out.println("총 Entry 수: " + map.size());
		System.out.println();
	}
}
결과 :
총 Entry 수 : 3

홍길동 : 95

홍길동 : 95
신용권 : 85
동장군 : 80

홍길동 : 95
신용권 : 85
동장군 : 80

총 Entry 수: 2

 


Hashtable ( - Vector)

  • 동기화된 메소드로 구성되어 있어 멀티스레드가 동시에 Hashtable의 메소드들을 실행 불가합니다.
  • 멀티 스레드 환경에서도 안전하게 객체를 추가, 삭제할 수 있습니다.

 

 

Map<String, Integer> map = new Hashtable<String, Integer>();
Map<String, Integer> map = new Hashtable<>();

 

import java.util.*;

public class HashtableExam {

	public static void main(String[] args) {
		
		// Hashtable로 map 객체 생성
		Map<String, Integer> map = new Hashtable<>();
		
		// 작업 스레드A 객체 생성 1~1000 까지 데이터 입력
		Thread threadA = new Thread() {
			@Override
			public void run() {
				for(int i = 1; i <= 1000; i++) {
					map.put(String.valueOf(i), i);
				}
			}
		};
		
		// 작업 스레드 B 객체 생성 1001 ~ 2000까지 객체 생성
		Thread threadB = new Thread() {
			@Override
			public void run() {
				for(int i = 1001; i <= 2000; i++) {
					map.put(String.valueOf(i), i);
				}
			}
		};
		
		// 스레드 시작
		threadA.start();
		threadB.start();
		
		//작업 스레드들이 모두 종료될 때 까지 메인 스레드를 기다리게 합니다.
		try {
			threadA.join();
			threadB.join();
		} catch (Exception e) {}
		
		// 저장된 총 엔트리 수 얻기
		int size = map.size();
		System.out.println("총 엔트리 수 : " + size);
		System.out.println();
	}
}
총 엔트리 수 : 2000

 


 

 


tip)
자로구조 - 데이터베이스

LIST, SET : 일반 SQL 데이터베이스, oracleDB, mysql, mssql
MAP : NoSQL 데이터베이스, 빅데이터, 공공DB

 


Properties

 

  • Properties는 Hashtable의 자식 클래스, 키와 값을 String 타입으로 제한한 컬렉션 입니다.
  • 주로 확장자가 .properties인 프로퍼티 파일을 읽을 때 사용합니다.
  • 프로퍼티 파일은 키와 값이 ' = ' 기호로 연결된 텍스트 파일입니다.(ISO 8859-1 문자셋, 한글은 \u+유니코드)
  • Properties 객체를 생성하고, load() 메소드로 프로퍼티 파일의 내용을 메모리로 로드합니다.

 

database.properties 파일

driver=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
admin=\uD64D\uAE38\uB3D9
import java.util.Properties;

public class PropertiesExam {

	public static void main(String[] args) throws Exception{

		//Properties 컬렉션 생성
		Properties properties = new Properties();
		
		//PropertiesExam.class 와 동일한 Classpath에 있는 database.properties 파일을 로드합니다.
		properties.load(PropertiesExam.class.getResourceAsStream("database.properties"));
		
		//주어진 키에 대한 값 읽기
		String driver = properties.getProperty("driver");
		String url = properties.getProperty("url");
		String username = properties.getProperty("username");
		String password = properties.getProperty("password");
		String admin = properties.getProperty("admin");
		
		//값 출력
		System.out.println("driver : " + driver);
		System.out.println("url : " + url);
		System.out.println("username : " + username);
		System.out.println("password : " + password);
		System.out.println("admin : " + admin);
	}
}
결과 : 
driver : oracle.jdbc.OracleDriver
url : jdbc:oracle:thin:@localhost:1521:orcl
username : scott
password : tiger
admin : 홍길동

 


TreeSet

  • 이진 트리를 기반으로 한 Set 컬렉션입니다.
  • 여러 개의 노드가 트리 형태로 연결된 구조. 루트 노드에서 시작해 각 노드에 최대 2개의 노드를 연결할수 있습니다.
  • TreeSet에 객체를 저장하면 부모노드의 객체와 비교해서 낮은것은 왼쪽 자식노드에, 높은것은 오른쪽 자식노드에 저장합니다.

 

 

 


TreeSet 컬렉션을 생성 하는 방법

 

TreeSet<E> treeSet = new TreeSet<E>();
TreeSet<E> treeSet = new TreeSet<>();

 

  • Set 타입 변수에 대입해도 되지만 TreeSet 타입으로 대입한 이유는 검색 관련 메소드가 TreeSet에만 정의 되어 있기 때문입니다.

 

 

import java.util.NavigableSet;
import java.util.TreeSet;

public class TreeSetExam {

	public static void main(String[] args) {
		
		TreeSet<Integer> scores = new TreeSet<>();
		
		scores.add(87);
		scores.add(98);
		scores.add(75);
		scores.add(95);
		scores.add(80);
		
		for(Integer s : scores) {
			System.out.print(s + " ");
		}
		System.out.println("\n");
		
		System.out.println("가장 낮은 점수 : " + scores.first());
		System.out.println("가장 높은 점수 : " + scores.last());
		System.out.println("95점 아래 점수 : " + scores.lower(95));
		System.out.println("95점 위의 점수 : " + scores.higher(95));
		System.out.println("95점이거나 바로 아래 점수 : " + scores.floor(95));
		System.out.println("85점이거나 바로 위의 점수 : " + scores.ceiling(85) + "\n");
		
		// 오름차순 : ASC
		// 내림차순 : DESC(descending)
		NavigableSet<Integer> descendingScores = scores.descendingSet();
		for(Integer s : descendingScores) {
			System.out.print(s + " ");
		}
		System.out.println("\n");
		
		// 범위 검색 ( 80<=)
		NavigableSet<Integer> rangeSet = scores.tailSet(80, true);
		for(Integer s : rangeSet) {
			System.out.print(s + " ");
		}
		System.out.println("\n");
	
		// 범위 검색( 80 <= score < 90)
		rangeSet = scores.subSet(80, true, 90, false);
		for(Integer s : rangeSet) {
			System.out.print(s + " ");
		}
	}
}
결과 : 
75 80 87 95 98 

가장 낮은 점수 : 75
가장 높은 점수 : 98
95점 아래 점수 : 87
95점 위의 점수 : 98
95점이거나 바로 아래 점수 : 95
85점이거나 바로 위의 점수 : 87

98 95 87 80 75 

80 87 95 98 

80 87

 


TreeMap

 

  • 이진트리를 기반으로 한 Map 컬렉션.
  • 키와 값이 저장된 엔트리를 저장합니다.
  • 부모 키 값과 비교해서 낮은 것은 왼쪽, 높은 것은 오른쪽 자식 노드에 Entry 객체를 저장합니다.

 

 

 

 

TreeMap<K, V> treeMap = new TreeMap<K, V>();
TreeMap<K, V> treeMap = new TreeMap<>();

 

 

import java.util.Map.Entry;
import java.util.NavigableMap;
import java.util.Set;
import java.util.TreeMap;

public class TreeMapExam {

	public static void main(String[] args) {

		TreeMap<String, Integer> treeMap = new TreeMap<>();
		
		treeMap.put("apple", 10);
		treeMap.put("forever", 60);
		treeMap.put("description", 40);
		treeMap.put("ever", 50);
		treeMap.put("zoo", 80);
		treeMap.put("base", 20);
		treeMap.put("guess", 70);
		treeMap.put("cherry", 30);
		
		Set<Entry<String, Integer>> entrySet = treeMap.entrySet();
		for(Entry<String, Integer> entry : entrySet) {
			System.out.println(entry.getKey() + " - " + entry.getValue());
		}
		System.out.println();
		
		Entry<String, Integer> entry = null;
		entry = treeMap.firstEntry();	// 가장 낮은 키를 가진 엔트리
		System.out.println("제일 앞 단어 : " + entry.getKey() + " - " + entry.getValue());
		
		entry = treeMap.lastEntry();	// 가장 높은 키를 가진 엔트리
		System.out.println("제일 뒤 단어 : " + entry.getKey() + " - " + entry.getValue());
		
		entry = treeMap.lowerEntry("ever");	// ever의 앞의 키를 가진 엔트리
		System.out.println("ever 앞 단어 : " + entry.getKey() + " - " + entry.getValue());
		
		entry = treeMap.floorEntry("cherry"); // 해당글자와 같은 키를 가진 엔트리
		System.out.println("cherry 와 같은 단어 : " + entry.getKey() + " - " + entry.getValue());
		
		NavigableMap<String, Integer> descendingMap = treeMap.descendingMap();
		Set<Entry<String, Integer>> descendingEntrySet = descendingMap.entrySet();
		for(Entry<String, Integer> e : descendingEntrySet) {
			System.out.println(e.getKey() + "-" + e.getValue());
		}
		System.out.println();
		
		System.out.println("[c~h 사이의 단어 검색]");
		NavigableMap<String, Integer> rangeMap = treeMap.subMap("c", true, "h", false);
		for(Entry<String, Integer> e : rangeMap.entrySet()) {
			System.out.println(e.getKey() + "-" + e.getValue());
		}
	}
}
결과 : 
apple - 10
base - 20
cherry - 30
description - 40
ever - 50
forever - 60
guess - 70
zoo - 80

제일 앞 단어 : apple - 10
제일 뒤 단어 : zoo - 80
ever 앞 단어 : description - 40
cherry 와 같은 단어 : cherry - 30
zoo-80
guess-70
forever-60
ever-50
description-40
cherry-30
base-20
apple-10

[c~h 사이의 단어 검색]
cherry-30
description-40
ever-50
forever-60
guess-70

 


Comparable과 Comparator

 

  • TreeSet에 저장되는 객체와 TreeMap에 저장되는 키 객체를 정렬
  • Comparable 인터페이스에는 compareTo() 메소드가 정의되고, 사용자 정의 클래스에서 이 메소드를 재정의 해서 비교결과를 정수 값으로 리턴합니다.

 


Comparable

 

public class Person implements Comparable<Person> {

	public String name;
	public int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	@Override
	public int compareTo(Person o) {
		if(age<o.age)return -1;
		else if(age == o.age) return 0;
		else return 1;
	}
}
import java.util.TreeSet;

public class CompareExam {

	public static void main(String[] args) {

		TreeSet<Person> treeSet = new TreeSet<Person>();
		
		treeSet.add(new Person("홍길동", 45));
		treeSet.add(new Person("김자바", 25));
		treeSet.add(new Person("박지원", 31));
		
		for(Person person : treeSet) {
			System.out.println(person.name + " - " + person.age);
		}
	}
}
결과 :
김자바 - 25
박지원 - 31
홍길동 - 45

 

  • 비교 기능이 없는 Comparable 비구현 객체를 저장하려면 비교자 Comparator를 제공합니다.
  • 비교자는 compare() 메소드를 재정의해서 비교 결과를 정수 값으로 리턴합니다.

 


Comparator

public class Fruit {
	public String name;
	public int price;
	
	public Fruit(String name, int price) {
		this.name = name;
		this.price = price;
	}
}
import java.util.Comparator;

public class FruitComparator implements Comparator<Fruit>{

	@Override
	public int compare(Fruit o1, Fruit o2) {
		if(o1.price < o2.price) return -1;
		else if(o1.price == o2.price) return 0;
		else return 1;
	}
}

 

import java.util.TreeSet;

public class ComparableExam {

	public static void main(String[] args) {

		TreeSet<Fruit> treeSet = new TreeSet<Fruit>(new FruitComparator());
		
		treeSet.add(new Fruit("포도", 3000));
		treeSet.add(new Fruit("수박", 10000));
		treeSet.add(new Fruit("딸기", 6000));
		
		for(Fruit fruit : treeSet) {
			System.out.println(fruit.name + ":" + fruit.price);
		}
	}
}
결과 :
포도:3000
딸기:6000
수박:10000

 

728x90

'JAVA > Java 기초' 카테고리의 다른 글

람다식.java  (0) 2023.01.27
컬렉션 자료구조3.java  (0) 2023.01.26
인터페이스(Interface).java  (0) 2023.01.16
추상클래스.java  (0) 2023.01.16
메소드 재정의.jav  (0) 2023.01.13