본문 바로가기
국비과정

국비 20일차 - [컬렉션] 컬렉션, List, ArrayList, Set, HashSet

by Jeong.dev 2022. 4. 21.

■ 컬렉션

- 자료구조 담당 프레임워크

 

1. 배열과 컬렉션 비교

- 크기 : 배열 불가, 컬렉션 가능

- 데이터 추가 삭제 : 배열 불편, 컬렉션 용이

- 데이터 타입 : 배열 1개, 컬렉션 여러개 가능

 

2. 분류

1) Collection

    - List : ArrayList, Vector, LinkedList

    - Set : HashSet, LinkedHashSet, TreeSet

2) Map

    - HashMap, HashTable, TreeMap, Properties

 

 

■ List

- 자료들 순차적으로 늘어놓은 구조

- 중복 객체 저장 가능, null 값 저장 가능

- 인덱스로 관리하여 검색, 삭제 기능 제공

  ( 특정 인덱스 삭제 시 뒤의 인덱스 1씩 앞으로 당겨짐)

 

1. List 인터페이스 구현 클래스

1) ArrayList - 동기화 미제공

2) Vector - 동기화 제공(안전)

3) LinkedList - 데이터 앞뒤 노드들 링크해서 관리

 

2. List 정렬(오름차순, 내림차순)

1) Collection.sort() 이용

2) Comparable, Comparator 인터페이스 구현

- List 정렬 시 기준 지정을 위한 구현 인터페이스

- Wrapper 객체, 문자열은  Comparable 구현되어 있음

  (그 외 객체는 Comparable 인터페이스 구현 후 사용 가능)

 

 

■ ArrayList

1. ArrayList 생성 및 주요 메소드

List list = new ArrayList();
list.add("안녕하세요");  // 객체 저장 add()
list.size(); 
double num = (Double) list.get(1); // 형 변환, 오토 언박싱

list.add(2, "반갑습니다"); // 인덱스 위치에 추가 가능
list.set(2, "고맙습니다"); // 인덱스 값 수정 가능
list.remove(Integer.valueOf(1)); // 인덱스 위치 객체 삭제 가능, 정수값 객체로 박싱
list.isEmpty(); // List가 비어 있으면 true 리턴
list.clear(); //List에 저장된 객체 모두 삭제

 

2. ArrayList 문자열, 정수 저장(제네릭스 사용)

1) 제네릭스(<>)

- 명시된 타입 객체만 사용 가능

- 객체 꺼낼 때 형 변환 불필요

List<String> list1 = new ArrayList<String>(); // <파라미터 타입> : 제네릭스
List<Integer> list2 = new ArrayList<Integer>();

Collections.sort(list1); // 오름차순
Collections.reverse(list1); // 내림차순

 

3. ArrayList 객체(Music) 저장 및 정렬

// Music 클래스 오버라이드
@Override
public int compareTo(Music music) {
	return (this.ranking > music.ranking ) ? 1 : 
		   (this.ranking == music.ranking) ? 0 : -1;

// 정렬 방식 추가 클래스
public class ArtistAcending implements Comparator<Music> {
	@Override
	public int compare(Music music1, Music music2) {
		// String 클래스 CompareTO() 메소드 사용
		int result = music1.getArtist().compareTo(music2.getArtist());
		
		if(result == 0){
			result = (music1.getRanking() > music2.getRanking()) ? 1 :
				     (music1.getRanking() == music2.getRanking()) ? 0 : -1;
		}		
		return result;
	}
}
List<Music> list = new ArrayList<>();
list.add(new Music("가가가", "A", 1));
Collections.sort(list, new ArtistAcending());

// 익명 구현 객체 사용
Collections.sort(list, new Comparator<Music>() {
	@Override
	public int compare(Music o1, Music o2) {
		return 0;
	}
});	
Comparator<Music> comparator = new Comparator<Music>() {
	@Override
	public int compare(Music o1, Music o2) {
		return o1.getTitle().compareTo(o2.getTitle());
	}
};
        
// 람다식 사용
Collections.sort(list, (o1, o2) -> o1.getTitle().compareTo(o2.getTitle()));

 

 

■ Set

- 저장 순서 없는 구조

- 동일 객체 중복 저장 불가(null 값 중복 저장 불가)

- 인덱스 없음 (대신 iterator 사용)

-  iterator() : 저장된 객체 한 번씨 가져옴

 

1. Set 인터페이스 구현 클래스

1) HashSet - hashCode(), equals() 사용하여 중복 객체 확인

2) LinckedHashSet - 입력한 순서대로 데이터 관리

3) TreeSet - 이진 트리 이용(검색 메소드 제공)

 

 

■ HashSet

Set<String> set = new HashSet<>();
// 출력 1. 향상된 for 문
for (String string : set) {
	System.out.println(string);
}
// 출력 2. Iterator 반복자 사용
Iterator<String> iterator = set.iterator();
	while(iterator.hasNext()) {		// hasNext() : 객체 있는지 확인
		System.out.println(iterator.next());	// next() : 객체 1개 가져옴
} 
// 출력 3. ArrayList 사용
ArrayList<String> list = new ArrayList<String>(set);
for (int i = 0; i < list.size(); i++) {
	System.out.println(list.get(i));
}
// HashSet 객체 저장
Set<Music> set = new HashSet<Music>()

// 객체 사용 시 hashCode(), equals() 메소드 오버라이딩 해야 중복제거 됨

 

 

■ 기타

타입 먼저 넣고 위의 방법으로 클래스 생성
Comparable 구현 메소드 넣기
클래스 생성 시 인터페이스 미리 지정 가능
set String 타입으로 생성 시 iterator에도 String 타입으로 표시됨

댓글