Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Tags
more
Archives
Today
Total
관리 메뉴

forDevLife

[생활코딩-자바입문] 핵심 요약 7 본문

Java

[생활코딩-자바입문] 핵심 요약 7

JH_Lucid 2020. 11. 18. 00:03

생활코딩 44. 컬렉션 프레임워크

 

1) Map의 사용법

 

앞의 프레임워크 내용을 간단히 정리하자면,

 

- 아래 그림에서 Collection, Map 및 set, list, queue는 인터페이스며, 그 하위는 클래스이다.

 

- collection을 set, list가 상속하며, 이를 AbstractSet / AbstractList 클래스가 구현한다.

 

- collection 인터페이스의 특징은, iterator를 사용할 수 있다는 점이다.

   - Iterator hi = A.iterator(); 식으로, hi에 iterator를 저장한다. iterator는 인터페이스인데, new가 아닌 이런식으로 할당 가능하다.

 

- set과 list의 차이점은, 중복의 허용 여부이다.

 

- set은 순서가 없기 때문에 index가 필요 없으며, 따라서 get 메소드(인덱스 반환)는 List에는 있고 set에는 없다.

 

- 따라서, collection 인터페이스에 정의된 메소드만 사용하고 있다면, 데이터 타입으로 collection을 사용하는게 바람직하다.

 

- map은 key - value 형태의 저장방식을 가지며, iterator가 없어 이를 사용하려면 collection(set) 化 해야한다. 아래서 설명.

    - key는 중복 불가, value는 중복 가능.

 

 

컬렉션 및 Map 프레임워크 구성

Map에서 볼 부분이 많으므로 이 부분을 주로 정리하겠슴다.

 

아래에서 두 가지 메소드를 통해, Map에 저장된 값을 하나씩 열거하여 처리한다.

import java.util.*;

public class MapDemo {

	public static void main(String[] args) {
		HashMap<String, Integer> a = new HashMap<String, Integer>();
		a.put("one", 1);
		a.put("two", 2);
		a.put("three", 3);
		a.put("four", 4);
	
		iteratorUsingForEach(a);
		System.out.println();
		iteratorUsingIterator(a);
	}

	static void iteratorUsingForEach(HashMap<String, Integer> map) {
		Set<Map.Entry<String, Integer>> entries = map.entrySet();
		for (Map.Entry<String, Integer> entry : entries) {
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}
	}
	
	static void iteratorUsingIterator(HashMap<String, Integer> map) {
		Set<Map.Entry<String, Integer>> entries = map.entrySet();
		Iterator<Map.Entry<String, Integer>> i = entries.iterator();
		while(i.hasNext()) {
			Map.Entry<String, Integer> entry = i.next();
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}
	}
}

1) iteratorUsingForeach

 

Map 인터페이스에는 entrySet 메소드가 정의되어 있는데, 이는 Set 타입 객체가 반환된다.(정확히는 Set<Map.Entry> 타입) 

여기서, Map.Entry< >는 인터페이스(즉 데이터 타입)이다. Map 인터페이스에 포함된 Entry 인터페이스이다.

즉, Map에 있는 값으로 구성된 Set 타입의 컨테이너가 만들어진 것이다. Set 안에는 Entry라는 인터페이스를 구현한 객체가 들어간다.

이 Entry는 key와 value로 이루어져 있다. 

 

Set 

  - Entry 1 → key, value

  - Entry 2 ...

 

어쨌든, 이렇게 Map을 Set화 시켰으므로, foreach를 통해 entry에 하나씩 set의 요소를 전달한다. Map.Entry의 메소드인 getkey와 getValue를 통해 key / value를 가져온다.

 

2) iteratorUsingIterator

 

동일하게 entries에 map을 set화 한 객체를 넣는다. 이번에는 앞에서 iterator를 사용했던 방식과 동일하게, Iterator에 직접 대입하여 진행한다. Iterator도 제네릭 인터페이스이므로, 데이터 타입을 넣는 것을 보인다. 

 

 

 

2) 컬렉션의 사용법과 정렬

 

아래는 Comparable 인터페이스와 Collections(Collection 인터페이스가 아닌 Collections 클래스)를 이용한 정렬 방법이다.

Collections 클래스는 정렬을 비롯한 갖가지 데이터와 관련된 작업을 처리할 수 있게 도와주는 메소드를 제공한다.

import java.util.*;

class Computer implements Comparable {
	int serial;
	String owner;

	Computer(int serial, String owner) {
		this.serial = serial;
		this.owner = owner;
	}

	public int compareTo(Object o) {
		return this.serial - ((Computer) o).serial;
	}

	public String toString() {
		return serial + " " + owner;
	}
}

public class CollectionDemo {

	public static void main(String[] args) {
		List<Computer> computers = new ArrayList<Computer>();

		computers.add(new Computer(500, "zgoing"));
		computers.add(new Computer(500, "leejohy"));
		computers.add(new Computer(3233, "mangdoong"));

		Iterator i = computers.iterator();
		System.out.println("before");

		while (i.hasNext()) {
			System.out.println(i.next());
		}

		Collections.sort(computers);
		System.out.println("\nafter");
		i = computers.iterator();

		while (i.hasNext()) {
			System.out.println(i.next());
		}
	}
}

Computer라는 클래스가 Comparable 인터페이스를 implements 해야하는데, 이유는 Collection.sort 메소드를 사용하기 위함이다. 

아래는 sort 메소드의 정의부분이다. sort는 list 타입을 인자로 받고 있는데, 이 데이터 타입이 제네릭으로 지정되어 있다. 여기에서 T는 Comparable이라는 인터페이스를 extends 해야한다고 돼어있기 때문에, 이를 사용하는 Computer 클래스가 Comparable을 implements 해야함을 알 수 있다. (아래에서는 인터페이스임에도 extends로 썼는데, 이는 제네릭에만 해당함을 잊지말자.)

 

sort의 API

 

또한, 인터페이스 내의 compareTo 메소드를 사용자가 직접 구현해야 하는데, 이 기준으로 sort가 된다. computers 리스트 내의 user define한 value를 비교하여, 기준을 뭘로 할 것인지 설계자가 직접 compareTo를 구현함으로써 지정하여야 한다.

Comments