[Java] Java Utility APIs

게맛살맛게·2021년 12월 8일
0

Java

목록 보기
16/18
post-thumbnail

Java Basic APIs

Utility API

java.util 패키지 : 자바 프로그램에서 필요로 하는 편리한 기능을 모아둔 클래스들의 패키지

Arrays API

배열을 조작하는 기능을 가진 API

Collection Framework

  • 컬렉션 (Collection)
    다수의 데이터, 즉 데이터 그룹을 의미

  • 프레임워크 (Framework)
    표준화, 정형화된 체계적인 프로그래밍 방식

  • 컬렉션 프레임워크
    컬렉션을 저장하는 클래스들을 표준화한 설계

  • 컬렉션 클래스 (Collection Class)
    다수의 데이터를 저장할 수 있는 클래스 (ex/ Vector, ArrayList, HashSet 등)

  • 핵심 인터페이스

List 리스트

Set 셋

  • 순서를 유지하지 않는 데이터의 집합
  • 데이터의 중복을 허용하지 않음
    구현 클래스 : HashSet, TreeSet 등

Map 맵

  • 키(key) - 값(value)의 쌍으로 이루어진 데이터 집합
  • 순서는 유지되지 않으며, 키는 중복을 허용하지 않고, 값은 중복을 허용
    구현클래스 : HashMap, TreeMap, Hashtable, Properties 등

배열Array vs 리스트List


Collection

Vector

객체만 저장할 수 있음

  • Vector의 참조 결과는 항상 Object 타입 ➡ 적적한 Type으로 변환 후 사용
    ❕ Generics로 지정하지 않으면 여러 타입을 동시에 저장 가능
  • Generic 사용시
    Vector<T> v = new Vector<>();
  • Vector 클래스 메서드 (Method)
	- 생성자 	: Vector() / Vector(int capacity)
	- 개체 추가 	: addElement(Object o) / insertElementAt(Object o, int index)
	- 개체 참조 	: elementAt(int index)
	- 역개체참조 	: indexOf(Object o)		// -1 : 없음
	- 개체 변경 	: setElementAt(Object o, int index)
	- 개체 삭제 	: remove(Object o) / remove(int index);
	- 객체 검색 	: contains(Object o)
	- 크기와 용량 	: size() / capacity()
	- 비우기 	: clear()
	- 복사 		: clone()

반복자

자바에서 제공하는 컬렉션에 대해 각 컬렉션의 항목들을 순차적으로 접근하는데 사용

반복자 Enumeration

백터와 해시테이블에 존재하는 요소들에 대한 접근방식을 제공해주는 인터페이스
java.util.Enumeration
Enumeration<T> e : hasMoreElements(), nextElement()제공

	// 순회
	for (int i = 0 ; i < v.size(); ++i) {
		Integer item = v.elementAt(i);
		System.out.printf("%d ", item);
	} System.out.println();
		
	// 반복자 활용
	Enumeration<Integer> e = v.elements();
	while (e.hasMoreElements()) {		// 다음 요소가 있는지 확인
		Integer item = e.nextElement();
		System.out.printf("%d ", item);
	} System.out.println();
  • Vector::elements()
  • Hashtable::keys()
  • Hashtable::values()

반복자 Iterator

Collection Framework로 확장하면서 도입(List, Set 등)
java.util.Iterator
Iterator<T> it : hasNext(), next(), remove()제공

	// List, set의 경우 Iterator 사용
	Iterator<String> it = lst.iterator();
	while(it.hasNext()) {
		String item = it.next();
		System.out.println(item);
	}
  • Set::iterator()
  • List::iterator()



Linked List

링크(Link)로 연결된 노드(Node)의 집합
java.util.LinkedList

  • 임의의 객체를 리스트로 저장하는 기능 제공
  • Index를 통한 참조 접근 불가
    Head로 부터 링크를 따라가면서 접근
  • 각 노드는 데이터와 다음 노드로의 링크를 가지고 있음
  • 새로운 노드 추가
  • 기존 노드 제거


Array List

배열을 다루는 것과 유사한 방식으로 동적 자료구조를 사용
java.util.ArrayList

  • ArrayList는 중간에 객체가 삭제되면 뒤의 객체들을 당겨, 인덱스를 재구성
    ➡ 마지막 인덱스에 객체가 추가되는 속도는 LinkedList보다 빠름
    ➡ 중간에 객체의 추가, 삭제가 빈번하게 일어나는 경우는 속도 저하

Vector vs List

항목 삽입, 삭제 동작이 동기화(synchronization) 여부의 차이

  • Vector : 동기화된 삽입 삭제 동작 제공 (Thread Safe)
  • List : 삽입과 삭제가 동기화 되어 있지 않음 – 외부적 동기화 필요



Stack

한쪽 끝점에서만 새로운 항목을 삽입, 삭제 할 수 있는 데이터집합
java.util.Stack

  • Vector 클래스를 상속받아 구현
  • Last In First Out (LIFO)의 특성
  • 스택의 메서드
	push()	: 스택에 객체를 넣음
	pop()	: 스택에서 객체를 추출(top은 삭제)
	peek()	: pop과 같지만, top 값을 삭제하지 않는다 (조회만)
	empty()	: 스택이 비었는지 확인
  • EmptyStackException (Underflow)
    Stack에 자료가 없을 때 pop을 실행하면 발생



Queue

한 방향으로만 새로운 항목을 삽입하고, 다른 한 방향으로만 삭제할 수 있는 데이터 집합
java.util.Queue

  • 인터페이스 형태로 제공
  • 목록의 가장 마지막에 새로운 항목 추가
  • 기존 항목의 제거는 리스트의 처음에서 일어남
  • First In First Out (FIFO)의 특성
  • 큐의 메서드
	offer()	: 데이터 입력 (enqueue)
	poll()	: 데이터 삭제 (dequeue)
	peek() 	: 맨 앞 데이터 조회

List vs Set

  • List

    • 순서가 있다
    • 중복 허용 ⭕

  • Set (집합)

    • 순서가 없다 (Index 접근 불가)
    • 중복 허용 ❌

Hash Set

자료구조에 포함된 자료의 순서나 키에 상관없이 자료 전체를 하나의 셋으로 관리
java.util.HashSet

  • 해시 알고리즘을 사용하는 컬렉션
  • 해시테이블에서 키 없이 값들만 존재하는 경우
  • 자료의 해시로 유지 ➡ 검색이 빠름
  • 순서가 없고 중복을 허용하지 않음
  • HashSet의 메서드
	add(Object obj)		: 데이터 입력
	remove(Object obj)	: 데이터 삭제
	size()			: 데이터의 개수 확인
	contains(Object obj) 	: 포함여부 확인

Hash 알고리즘과 hashCode()

  • 객체 해시 코드란 객체를 식별할 하나의 정수값
  • Object의 hashCode()의 메서드는 객체의 메모리 번지를 이용하여 해시 코드를 만들어 리턴
    ➡ 모든 객체는 다른 값을 가짐
  • Hash 관련 컬렉션들은 다음과 같은 방식으로 두 객체가 동등한지 아닌지를 비교
  • Custom 객체에 대한 동등 객체 판단 방법
	// hashCode 비교 ➡ equals 확인 ➡ 동등
	@Override
	public int hashCode() {
		// 객체 식별값 (정수)
		return id;
	}

	@Override
	public boolean equals(Object obj) {
		if (obj instanceof Student) {
			// 다운캐스팅
			Student other = (Student) obj;
			return name.equals(other.name) && id == other.id;	// hashCode와 field 모두 동일 시 동등 객체
		}
		return super.equals(obj);
	}

Hash Table

Map 인터페이스를 구현하여 키와 값의 쌍을 저장하는 데이터 집합
java.util.HashTable

  • 자료에 순서가 없음
  • 키(Key)와 값(Value)은 모든 임의의 객체가 허용됨
  • 키는 중복 될 수 없음 (Key : HashSet)
  • HashTable의 메서드
	put(Object obj)			: 데이터 입력
	get(Object key)			: 데이터 조회
	isEmpty()			: 비어있는지 확인
	keySet()			: Key 목록 반환 (HashSet 형태)
	containsKey(Object obj)		: 해당 키 포함여부 확인
	containsValue(Object obj)	: 해당 값 포함여부 확인

Hashtable vs HashMap

  1. Thread-safe 여부
  2. null값 허용 여부
  3. Enumeration 여부
구분HashtableHashMap
Thread-safe
null Key
Enumeration

Hashtable은 not fail-fast Enumeration을 제공
HashMap은 보조해시를 사용 ➡ Hashtable에 비해 해시 충돌(hash collision) 이 덜 발생

profile
IT 기술블로그

0개의 댓글