java 기초 공부 내용 정리(컬렉션 프레임웍-제네릭, set, List)

홍준성·2022년 6월 3일
0

java 기초 공부

목록 보기
30/39

컬렉션 프레임웍(Collection Framework)

데이터를 효율적으로 다루기 위한 클래스들의 집합

  • 자료구조(Data Structure)
    자료들을 저장할 때, 효율적인 구조로 저장하는 것(데이터의 구조)
  • 컬렉션프레임웍
    자바에서 제공하는 자료구조

<Collection 인터페이스를 구현하는 클래스>
Set, List, Queue, Map

<제공된 메서드>

메서드설명
add(E e)지정요소(e) 추가
contains(Object obj)객체 obj 존재여부
isEmpty()컬렉션 비어있는지 여부
isIterator()컬렉션 iterator 반환
remove(Object obj)객체 obj 제거
size요소 개수 반환

* iterator: 컬렉션 요소에 접근해서 반복적으로 요소 접근 시 도움을 주는 객체

제네릭(Generic)

클래스가 다룰 객체를 미리 명시하는 기법

제네릭의 의미

제네릭 == 일반화
ex) 택시를 다루던, 버스를 다루던 그냥 자동차(일반화)라고 다룬다.
→ 제네릭은 모든 종류의 타입을 다룰 수 있도록, 클래스나 메서드를 타입 매개변수를 이용하여 선언한 기법(일반화)

사용 방법

클래스명 뒤에 < E >, < K >, < V >와 같은 형식으로 사용
단, <> 안에는 구현 시에는 알파벳, 사용 시에는 클래스만 들어갈 수 있다.

제네릭 사용 구간

1) 제네릭 클래스: 클래스 뒤에 제네릭 기법 사용
2) 제네릭 메서드: 메서드 뒤에 제네릭 기법 사용

제네릭타입 매개변수

관례적으로 사용되는 타입명은 하나의 대문자 알파벳 사용

  1. E(Element): 배열이나 집합들의 요소타입을 지정
  2. T(Type): 변수의 자료형과 같은 타입을 지정
  3. S,U(...): 여러개의 제네릭 기법을 사용할 때 많이 사용
  4. K(Key): 키 타입 지정 시 사용
  5. V(Value): 값 타입 지정 시 사용

제네릭타입 사용 예시

	public static void main(String[] args) {
		Value v = new Value();
		v.typeSearch(3);
		v.typeSearch(3.14);
		v.typeSearch(3.14f);
		v.typeSearch('a');
		v.typeSearch("hello");
		v.typeSearch(true);
	}
}

class Value{
	public <T> void typeSearch(T x) {
		if(x instanceof Integer) {
			System.out.println(x+"는 정수입니다.");
		}
		else if(x instanceof Double|| x instanceof Float) {
			System.out.println(x+"는 실수입니다.");
		}
		
		else if(x instanceof Character) {
			System.out.println(x+"는 문자형입니다.");
		}
		
		else if(x instanceof String) {
			System.out.println(x+"는 문자열입니다.");
		}
		
		else if(x instanceof Boolean) {
			System.out.println(x+"는 논리형입니다.");
		}
	}
}


###출력값
3는 정수입니다.
3.14는 실수입니다.
3.14는 실수입니다.
a는 문자형입니다.
hello는 문자열입니다.
true는 논리형입니다.

제네릭 클래스 사용 예시

사용할 때 어떤 타입인지 정확히 명시를 해야함

	public static void main(String[] args) {
		A<Integer>a1=new A<>();
		a1.x=10;
		a1.y=20;
		System.out.println(a1.x+a1.y);
		
		A<String>a2 = new A<>();
		a2.x="hello ";
		a2.y="world";
		System.out.println(a2.x+a2.y);

	}
}

class A<T>{
	T x;
	T y;
}

Set(집합)

요소들을 집합적으로 모아놓은 자료구조

특징

  1. 중복을 허용하지 않음
  2. 저장 순서를 유지하지 않음

Set을 구현한 클래스

  1. HashSet
    Set과 동일하게 중복이 없고, 순서가 없다.
    → 중복된 요소 add()시 집합에 추가 안되고 false값을 반환함
생성자설명
HashSet()HashSet 클래스의 기본 생성자
HashSet(Collection c)컬렉션의 요소로 HashSet 객체 생성
HashSet(int capacity)capacity 용량을 갖는 객체 생성
  1. TreeSet
    Set과 동일하게 중복이 없으나, 정렬기능이 추가된 형태
    → 이진 탐색 트리의 구조(데이터 추가 시 기준 데이터보다 작다면 기준의 왼쪽에, 기준 데이터보다 크면 기준의 오른쪽에 위치)
HashSet과 TreeSet 비교


	public static void main(String[] args) {
		
		HashSet hs = new HashSet();
		hs.add("demon");
		hs.add("banana");
		hs.add("tomato");
		hs.add("apple");
		hs.add("cargo");
		
		
		TreeSet ts = new TreeSet();
		ts.add("demon");
		ts.add("banana");
		ts.add("tomato");
		ts.add("apple");
		ts.add("cargo");
		
		Iterator it = hs.iterator();
		System.out.println("<Hash Set 출력>");
		
		while(it.hasNext()) {
			System.out.println(" "+it.next());
		}
		
		System.out.println();
		Iterator it2=ts.iterator();
		System.out.println("<Tree Set 출력>");
		while(it2.hasNext()) {
			System.out.println(" "+it2.next());
		}
		
		System.out.println();
		System.out.println("현재 TreeSet의 크기: " +ts.size());

	}
}


//출력값
<Hash Set 출력>
 banana
 apple
 demon
 tomato
 cargo

<Tree Set 출력>
 apple
 banana
 cargo
 demon
 tomato

현재 TreeSet의 크기: 5

List

데이터를 일렬로 늘어놓은 구조

특징

  1. 순서가 있음
  2. 중복 허용

List인터페이스를 구현한 클래스

  1. ArrayList
    요소 추가 시 0번 인덱스부터 차례대로 요소 저장(배열에서 발전된 형태)
	public static void main(String[] args) {
		ArrayList list1 = new ArrayList(10);
		list1.add("A");
		list1.add("C");
		list1.add("E");
		list1.add("D");
		System.out.println("초기상태");
		System.out.println(list1);

		System.out.println("인덱스1 위치에 B 추가");
		list1.add(1, "B");
		System.out.println(list1);
		
		System.out.println("인덱스2 위치의 값 삭제");
		list1.remove(2);
		System.out.println(list1);
		
		System.out.println("인덱스2 위치의 값 반환: " +list1.get(2));
	}
}

##출력값
초기상태
[A, C, E, D]
인덱스1 위치에 B 추가
[A, B, C, E, D]
인덱스2 위치의 값 삭제
[A, B, E, D]
인덱스2 위치의 값 반환: E

  1. LinkedList
    1) 요소들이 서로 연결되어 있는 리스트
    2) 각 요소가 다음 요소의 주소를 저장
    3) LinkedList가 ArrayList보다 빠름
LinkedList와 ArrayList의 작업 시간 비교

	public static void main(String[] args) {
		ArrayList al = new ArrayList();
		LinkedList ll = new LinkedList();
		long start = System.currentTimeMillis();
		
		for(int i=0;i<100000;i++) {
			al.add(0,String.valueOf(i));
		}
		long end = System.currentTimeMillis();
		System.out.println("ArrayList 작업시간: " + (end-start));
		
		start = System.currentTimeMillis();
		for(int i = 0;i<100000;i++) {
			ll.add(0,String.valueOf(i));
		}
		end=System.currentTimeMillis();
		System.out.println("LinkedList 작업시간: " + (end-start));
	}
}

## 출력값
ArrayList 작업시간: 287
LinkedList 작업시간: 5

List 인터페이스의 주요 메서드

메서드설명
add(int index, E elem)index 위치에 elem 추가
get(int index)index 위치에 있는 요소 반환
indexOf(Object o)요소 o가 있는 위치 반환
listiterator()Listiterator() 반환
remove(int index)index 위치 요소 삭제 후 삭제값 반환
set(int index, E elem)index 위치 요소를 elem으로 변경
profile
준성이의 개발자 공부 velog

0개의 댓글