Map

오늘·2021년 4월 4일
0

Java

목록 보기
39/42
post-custom-banner

Map 컬렉션

: 키와 값으로 구성된 Entry 객체를 저장하는 구조
(키와 값은 모두 객체)
: 키는 중복 불가, 값은 중복 가능
-> 만약 기존에 저장된 키와 동일한 키로 값을 저장하면 기존 값은 없어지고 새로운 값으로 대치된다.
: 키로 객체들을 관리하기 때문에, 키를 매개값으로 갖는 메소드가 많다.

위 표에서 메소드의 매개 변수 타입과 리턴 타입에 K와 V라는 타입 파라미터가 있는데, 이는 Map 인터페이스가 제네릭 타입이기 때문이다.

// 맵 객체화
// < 키 타입, 값 타입>
// 아래는 키로 Integer, 값으로 String을 가지게끔하는 예시이다
Map<Integer, String> map = new -;

객체추가 .put() / 키로 객체찾기 .get()

// 값 넣기
map.put(1, "사과");
map.put(2, "귤");
map.put(3, "오렌지");

// 키로 객체 찾기
// String result에 map의 3번 키를 가지고 있는 객체를 저장한다
// = 오렌지가 찾아져  result로 들어간다
String result = map.get(3);

HashMap

Map을 구현한 대표적인 맵 컬렉션이다. HashMap의 키로 사용할 객체는 hashCode()와 equals() 메소드를 재정의해 동등 객체가 될 조건을 정해야한다.

사용해보기

// 맵 객체화
// < 키 타입, 값 타입>
Map<Integer, String> map1 = new HashMap<Integer, String>();

// 값 넣기
map1.put(1, "사과");
map1.put(2, "귤");
map1.put(3, "오렌지");
		
// 자료크기
System.out.println("map1의 현재 사이즈 : " + map1.size());
		
// 값을 출력시키기
// get(키 값)
String result1 = map1.get(3);
System.out.println("3을 키로 가지고 있는 값의 내용" + result1);
		
// 값이 있는지 확인하기
boolean a = map1.containsKey("귤");
System.out.println("귤이 있는지 확인 : " + a);
		
System.out.println();
// set에는 순서가 유지되지 않지만, 영어 숫자 한글 <= 유니코드 번호 순서는 출력시 관계가 있을 수 있다


// 키와 값으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴
Set<Entry<Integer, String>> se = map1.entrySet();
Iterator<Entry<Integer, String>> it = se.iterator();
while(it.hasNext()) {
	System.out.println(it.next());
}
		
System.out.println();
		
// 모든 키만을 Set객체에 담아서 리턴
Set<Integer> keys = map1.keySet();
Iterator<Integer> it2 = keys.iterator();
while(it2.hasNext()) {
	System.out.println(it2.next());
}
	
System.out.println();
		
// Collection에 값 담아서 리턴
Collection<String> cs = map1.values();
Iterator<String> it3 = cs.iterator();
while(it3.hasNext()) {
	System.out.println(it3.next());
}
		
System.out.println();
		
// Collection에 저장된 값을
Collection<String> ci = map1.values();
//Collection의 하위인 ArrayList로 다운 캐스팅은 제대로 안됨
// List ar = (ArrayList) ci;
// values 값만 따로 떼어서 ArrayList에 넣어주기
List ar = new ArrayList(ci);
Iterator<String> it4 = ar.iterator();
while(it4.hasNext()) {
	System.out.println(it4.next());
}

실행 모습

사용해보기 02

사용자가 한글을 입력하면 영어로 출력되도록 한다
(단, 5개 단어 지정)

Map<String, String> map2 = new HashMap<String, String>();
		
map2.put("사과", "apple");
map2.put("체리", "cherry");
map2.put("오렌지", "Orange");
map2.put("자두", "plum");
map2.put("복숭아", "Peach");
		
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("한국어를 입력해주세요");
System.out.print(">>");
String s = map2.get(br.readLine());
System.out.println(s);

실행모습

사용해보기 03

// 이름, 점수 = 키, 값
public class HashMapEx2 {
	public static void main(String[] args) {
		Map<Student, Integer> map = new HashMap<Student, Integer>();
		
		map.put(new Student(1, "홍길동"), 95);
		map.put(new Student(1, "홍길동"), 90);
		
		System.out.println("총 Entry 수: " + map.size());
		// 점수를 출력하고 싶다
		System.out.println("값 출력해보기 : " + map.get(new Student(1, "홍길동")));
		System.out.println("값 출력해보기 : " + map.values());
		
		// 키 출력해보고 싶다
		System.out.println("키 출력해보기 : " + map.keySet());
		
		//키와 값 원하는 모양으로 모두 출력
		Set<Map.Entry<Student, Integer>> entry = map.entrySet();
		Iterator<Map.Entry<Student, Integer>> it = entry.iterator();
		while(it.hasNext()) {
			Map.Entry<Student, Integer> e = it.next();
			Student key = e.getKey();
			System.out.println(key);
			System.out.println(key.sno + "번 이름 : " + key.name + " ");
			Integer Num = e.getValue();
			System.out.println(Num);
		}

	}
}


class Student{
	int sno;
	String name;
	
	public Student(int sno, String name) {
		this.sno = sno;
		this.name = name;
	}
	
	// 학번과 이름이 동일할 경우 true
	@Override
	public boolean equals(Object obj) {
		if(obj instanceof Student) {
			Student student = (Student) obj;
			return (sno == student.sno) &&
					(name.equals(student.name));
		} else {
			return false;
		}
	}
	
	// 학번과 이름이 같다면 동일 값 리턴
	@Override
	public int hashCode() {
		return sno + name.hashCode();
	}
}

실행 모습

총 Entry 수: 1
값 출력해보기 : 90
값 출력해보기 : [90]
키 출력해보기 : [a2_Map.Student@33a43af]
a2_Map.Student@33a43af
1번 이름 : 홍길동 
90

Hashtable

HashMap과 동일한 내부구조이다. 차이점은 테이블은 동기화된 메소드로 구성되어 있기 때문에 멀티 스레드가 동시에 이 메소드들을 실행할 수는 없고, 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행할 수 있다. 그래서 멀티 스레드 환경에서 안전하게 객체를 추가, 삭제할 수 있다

public class HashTableEx {
	public static void main(String[] args) {

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

		Scanner sc = new Scanner(System.in);
		System.out.println("홍길동의 반은?");
		String ban = sc.next();
		System.out.println("홍길동의 번호는?");
		String bunho = sc.next();

		map.put(new Studnet3(ban, bunho), "홍길동");

		System.out.println("이순신의 반은?");
		ban = sc.next();
		System.out.println("이순신의 번호는?");
		bunho = sc.next();
		map.put(new Studnet3(ban, bunho), "이순신");

		System.out.println("김자바의 반은?");
		ban = sc.next();
		System.out.println("김자바의 번호는?");
		bunho = sc.next();
		map.put(new Studnet3(ban, bunho), "김자바");

		System.out.println("검색하려는 학생의 자료는");
		System.out.println("반은?");
		ban = sc.next();
		System.out.println("번호는?");
		bunho = sc.next();
		String searchName = map.get(new Studnet3(ban, bunho));
		if (searchName != null)
			System.out.println(searchName);
		else
			System.out.println("그런 사람은 없습니다.");

	}

}

class Studnet3 {
	String ban;
	String bunho;
	String name;

	public Studnet3(String ban, String bunho) {
		this.ban = ban;
		this.bunho = bunho;

	}

	// 동등객체 판단하기
	@Override
	public int hashCode() {
		return ban.hashCode() + bunho.hashCode();
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Studnet3) {
			Studnet3 s = (Studnet3) obj;
			if (ban.equals(s.ban) && bunho.equals(s.bunho))
				return true;
		}
		return false;
	}
}

실행 모습


Properties

HashTable의 하위 클래스이기 때문에 테이블의 모든 특징을 그대로 가지고 있지만 테이블이 키와 값을 다양한 타입으로 지정 가능한데에 비해
Properties는 키와 값을 String 타입으로 제한한 컬렉션이다.

주로 애플리케이션의 옵션 정보, DB의 연결 정보 그리고 국제화(다국어) 정보가 저장된 프로퍼티(~.properties) 파일을 읽을 때 주로 사용한다

키와 값이 = 기호로 연결되어 있는 텍스트 파일. 한글은 사용하는 문자셋으로 직접 표현할 수 없어 유니코드로 변환되어 저장된다.

사용모습

// database.properties 파일

driver=oracle.jdbc.OracleDirver
url=jdbc:oracle:thin:@localhost:1521:orcl
username=scott
password=tiger
programmer=\uC774\uC790\uBC14

// 프로퍼티 파일로부터 읽기

Properties properties = new Properties();
		
// 외부 파일을 key값으로 저장한 후 이를 가져오는 코드
// 경로 설정
String path = C_PropertiesEx.class.getResource("B_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");
// 한글이 유니코드로 바뀌어 들어가 있다
String programmer = properties.getProperty("programmer");
	
System.out.println("driver : " + driver);
System.out.println("url : " + url);
System.out.println("username : " + username);
System.out.println("password : " + password);
System.out.println(programmer);

실행 모습

driver : oracle.jdbc.OracleDirver
url : jdbc:oracle:thin:@localhost:1521:orcl
username : scott
password : tiger
이자바

프로퍼티는 잘.. 모르겠다..

post-custom-banner

0개의 댓글