1. Collection
설명보기
- Collection : 요소를 수집해서 저장하는 것
- 배열은 저장할 수 있는 객체 수가 생성할 때 결정되기 때문에 불특정 다수의 객체를 저장하기에 적합하지 X
- 컬렉션 : 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 java.util 패키지에 관련된 인터페이스와 클래스들을 모아둔 것
- 컬렉션 인터페이스와 그것을 구현한 클래스들:
- List : ArrayList, Vector, LinkedList
- Set : HashSet, TreeSet
- Collection인터페이스를 사용 : 객체를 추가, 삭제, 검색하는 방식이 유사
- Map : HashMap, Hashtable, TreeMap, Properties
- Collection인터페이스와 분리된 이유 : Key | Value 형태로 객체를 제공
- Collection : 배열과 같이 Index로 요소가 관리되거나 요소 자체만을 관리
- Map : Key-Value 쌍으로 요소를 관리
- Collection : 요소를 수집해서 저장하는 것
2. List - ArrayList, LinkedList
설명보기
- List 컬렉션 : 객체를 일렬로 늘어놓은 구조
- 객체 자체를 저장하는것이 아닌 객체의 주소를 참조
- null도 저장이 가능 : 해당 인덱스는 객체를 참조하지 않는다
- List 인터페이스의 메소드들
기능 메소드 설명 객체 추가 Boolean add(E e) 주어진 객체를 맨 끝에 추가 void add(int index, E element) 주어진 인덱스에 객체를 추가 set(int index, E element) 주어진 인덱스에 저장된 객체를 주어진 객체로 바꿈 객체 검색 boolean contains(Object o) 주어진 객체가 저장되어있는지 여부 E get(int index) 주어진 인덱스에 저장된 객체를 리턴 isEmpty() 컬렉션이 비어있는지 여부 int size() 저장되어 있는 전체 객체 수 리턴 객체 삭제 void clear() 저장된 모든 객체를 삭제 E remove(int index) 주어진 인덱스에 저장된 객체를 삭제 boolean remove(Object o) 주어진 객체를 삭제 - isEmpty : 컬렉션의 길이를 기준으로 확인하기 때문에 Null-safe하지 않음
- list == null || list.isEmpty 처럼 null 체크를 통해 해결 가능
- ArrayList
- List 인터페이스의 구현 클래스
- 내부 배열에 객체를 저장해서 인덱스로 관리
- 저장용량을 초과한 객체들이 들어오면 자동적으로 저장 용량이 늘어난다.
- ArrayList에 객체를 추가하면 가장 뒤쪽에 저장된다.
- 특정 인덱스의 객체를 삽입/삭제하면 바로 뒤부터 마지막 인덱스까지 한칸 씩 움직인다.
- 따라서 객체 삭제와 삽입이 빈번한 경우에는 ArrayList가 바람직하지 않다.
- LinkedList
- 사용방법은 ArrayList와 동일
- 인접 참조를 링크해서 체인처럼 관리
- 특정 인덱스의 객체를 삽입/삭제 하면 앞뒤 링크만 변경되고 나머지 링크는 변경되지 않는다.
- 아이템이 리스트에 추가되지 않으면 메모리를 할당하지 않는다. 따라서 초기 용량을 지정할 수 없다.
- List 컬렉션 : 객체를 일렬로 늘어놓은 구조
3. Set - HashSet
설명보기
- 저장 순서가 유지되지 않는다.
- 객체를 중복해서 저장할 수 없다.
기능 메소드 설명 객체 추가 Boolean add(E e) 주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 false를 리턴 객체 검색 boolean contains(Object o) 주어진 객체가 저장되어 있는지 여부 isEmpty() 컬렉션이 비어 있는지 조사 Iterator<E> iterator() 저장된 객체를 한 번씩 가져오는 반복자 리턴 int size() 저장되어 있는 전체 객체 수 리턴 객체 삭제 void clear() 저장된 모든 객체를 삭제 boolean remove(Object o) 주어진 객체를 삭제 - 인덱스로 객체를 가져올 수 없고, Iterator을 제공한다.
- Iterator : 전체 객체를 대상으로 한번씩 반복해서 가져오는 반복자
- Iterator 인터페이스에 선언된 메소드
리턴 타입 메소드명 설명 boolean hasNext() 가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴합니다 E next() 컬렉션에서 하나의 객체를 가져옵니다 void remove() Set 컬렉션에서 객체를 제거합니다
- Iterator 인터페이스에 선언된 메소드
- Iterator 없이 for each 로도 접근할 수 있다.
- HashSet
- Set 인터페이스의 구현 클래스
- 객체들을 순서없이 저장하고, 동일한 객체는 중복 저장 X
- 동일한 객체의 판단 기준 : 해시코드
- 객체의 hashCode()메소드를 통해 해시코드를 얻어낸다.
- 동일한 해시코드가 있다면 equals로 두 객체를 비교해서 true가 나오면 동일한 객체로 판단하고 중복 저장X
Set<String> set = new HashSet<String>();
public class Member { String name; int age; public Member(String name, int age) { this.name = name; this.age = age; } @Override public int hashCode() { return name.hashCode() + age; } @Override public boolean equals(Object obj) { if (obj instanceof Member) { Member member = (Member)obj; return member.name.equals(this.name) && member.age == this.age; } else { return false; } } }
import java.util.HashSet; import java.util.Set; public class HashSetExample2 { public static void main(String[] args) { Set<Member> set = new HashSet<>(); set.add(new Member("홍길동", 30)); set.add(new Member("홍길동", 30)); // 인스턴스는 다르지만 내부 데이터가 동일하므로 객체 1개만 저장 System.out.println("총 객체수: " + set.size()); } }
- 자바의 hashcode() 가 value가 같으면 동일한 이유 : https://v3.leedo.me/java-string-hash-code
4. Map - HashMap, Hashtable
설명보기
- 키와 값으로 구성된 객체를 저장하는 구조
- 키와 값은 모두 객체
- 키는 중복될 수 없다
- 값은 중복 가능
- 기존에 저장되었던 키값과 동일한 키값으로 저장하면 기존의 값이 새로운 값으로 대체된다.
- Map 인터페이스의 메소드
기능 메소드 설명 객체추가 V put(K key, V value) 주어진 키와 값을 추가, 저장되면 값을 리턴 객체검색 boolean containsKey(Object key) 주어진 키가 있는지 여부 boolean containsValue(Object value) 주어진 값이 있는지 여부 Set(Map.Entry<K,V>> entrySet() 키와 값의 쌍으로 구성된 모든 Map.Entry 객체를 Set에 담아서 리턴 V get(Object key) 주어진 키가 있는 값을 리턴 V getOrDefault(Object key, V defaultValue) 주어진 키에 매핑 value가 있으면 value를, 없으면 defaultValue를 반환 boolean isEmpty() 컬렉션이 비어 있는지 여부 Set<K> keySet() 모든 키를 Set 객체에 담아서 리턴 int size() 저장된 키의 총 개수 리턴 Collection<V> values() 저장된 모든 값을 Collection에 담아서 리턴 객체삭제 vold clear() 모든 Map.Entry(키와 값)를 삭제 V remove(Object key) 주어진 키와 일치하는 Map.Entry를 삭제하고 값을 리턴 Map 내부에는 Collection 처럼 객체를 순회할 수 있는 Iterator가 따로 구현되어 있지 않다.
- 따라서 Map을 순회하기 위해 entrySet()을 통해 Set을 구성한 뒤 Iterator로 순회한다.key를 알고있다면 위 코드와같이 get() 메소드를 사용하면 되지만, 저장된 객체 전체를 하나씩 얻고싶은 경우에는
- keySet() 메소드로 모든 키를 Set 컬렉션으로 얻은 다음, 반복자를 통해 키를 하나씩 얻고 get() 메소드를 통해 값을 얻으면 됩니다.
Map<K, V> map = ...; Set<K> keySet = map.keySet(); Iterator<K> keyIterator = keySet.iterator(); while(keyIterator.hasNext()) { K key = keyIterator.next(); V value = map.get(key); }
- entrySet() 메소드로 모든 Map.Entry를 Set 컬렉션으로 얻은 다음, 반복자를 통해 Map.Entry를 하나씩 얻고 getKey()와 getValue() 메소드를 이용해 키와 값을 얻으면 됩니다.
Set<Map.Entry<String, Object>> entries = map.entrySet(); for (Map.Entry<String, Object> entry : entries) { String key = entry.getKey(); Object value = entry.getValue(); }
- HashMap
- Map 인터페이스를 구현한 대표적인 Map 컬렉션
- 키와 값의 타입은 Primitive type을 사용할 수 없고, 클래스 및 인터페이스 타입만 가능하다.
- Hashtable
- 동기화된 메소드로 구성되어있어 멀티 스레드가 동시에 이 메소드를 실행할 수 없다.
- 생성방법은 HashMap과 동일
5. LIFO, FIFO 컬렉션- Stack 과 Queue
설명보기
- LIFO (후입선출): 나중에 넣은 객체가 먼저 빠져나가는 자료구조 (Stack)
- Stack 주요 메소드
리턴 타입 메소드 설명 E push(E item) 주어진 객체를 스택에 넣는다 E peek() 스택의 맨 위 객체를 가져온다. 객체를 스택에서 제거하지 않는다. E pop() 스택의 맨 위 객체를 가져오고, 객체를 스택에서 제거한다. public class Coin { private int value; public Coin(int value) { this.value = value; } public int getValue() { return value; } }
import java.util.Stack; public class StackExample { public static void main(String[] args) { Stack<Coin> coinStack = new Stack<>(); coinStack.push(new Coin(500)); coinStack.push(new Coin(100)); coinStack.push(new Coin(50)); coinStack.push(new Coin(10)); while (!coinStack.isEmpty()) { // 동전케이스가 비었다면 반복문 종료 Coin coin = coinStack.pop(); // 동전케이스에서 제일 위에 동전 꺼내기 System.out.println("꺼내온 동전: " + coin.getValue() + "원"); } } }
- Stack 주요 메소드
- FIFO (선입선출): 먼저 넣은 객체가 먼저 빠져나가는 구조 (Queue)
- Queue 주요 메소드
리턴 타입 메소드 설명 Boolean offer(E e) 주어진 객체를 넣는다. E peek() 객체 하나를 가져온다. 객체를 큐에서 제거하지 않는다. E poll() 객체 하나를 가져온다. 객체를 큐에서 제거한다.
- Queue 주요 메소드
- LIFO (후입선출): 나중에 넣은 객체가 먼저 빠져나가는 자료구조 (Stack)
6. 기타
'Dev > ESTsoft 오르미' 카테고리의 다른 글
이팩티브 자바-인터페이스 (0) | 2024.02.23 |
---|---|
람다식 (0) | 2024.02.23 |
리스트 (0) | 2024.02.23 |
제네릭 (0) | 2024.02.23 |
예외처리 (0) | 2024.02.23 |