자료구조에 대해 알아보자
자바 컬렉션엔 크게 3가지 종류가 있다
List, Set, Queue 그리고 성격이 조금 다른 Map이 있다.
List와 관련된 stack, vector
Set, Queue, deque을 서술하고
마지막으로 Map에 대해 적어보려 한다.
List
List의 특징은 데이터값이 중복 가능하고 순서가 정해진다는 특징이 있다.
-ArrayList ★자주사용
1. 배열에 순차적으로 기록되는 방식이다.
2. 저장공간의 낭비가 없다
3. 배열 중간에 삽입하면 뒤에 한 칸씩 밀려나 시간복잡도가 있다
-LinkedList
1. 포인터 방식으로 기록되는 방식이다.
2. 리스트 내 자료 이동이 필요 없다
3. 저장 공간의 낭비가 있다
4. 알고리즘이 복잡하다
5. 특정 자료의 탐색 시간이 많이 소요된다.
List 선언
ArrayList arl= new ArrayList(); //타입 미설정 Object로 선언된다.
ArrayList<Student> members = new ArrayList<Student>(); //타입설정 Student객체만 사용가능
ArrayList<Integer> num = new ArrayList<Integer>(); //타입설정 int타입만 사용가능
ArrayList<Integer> num2 = new ArrayList<>(); //new에서 타입 파라미터 생략가능
ArrayList<Integer> num3 = new ArrayList<Integer>(10); //초기 용량(capacity)지정
ArrayList<Integer> list2 = new ArrayList<Integer>(Arrays.asList(1,2,3)); //생성 시 값추가
이렇게 할 수 있는데
List<Object> arl= new ArrayList<>(); 로 하는 편이 더 좋다.
왜냐하면 ArrayList가 List를 상속받는데
ArrayList는 ArrayList<String> 처럼 변수타입을 지정해 줘야 하는데 반면
List는 List<Object> 즉, 다형성을 지원해서 변수타입을 유연하게 받아들이기 때문이다.
(타입 미지정시 Object로 선언되긴 하지만 잘못된 타입으로 캐스팅을 한 경우에는 에러가 발생해 비추천한다.)
따라서 그냥 List<Object> arrlist = new ArrayList<>(); 사용하자.
List의 주요 함수
list.add("123"); //원소 추가
list.add(0, "133"); //0번째 주소에 원소 추가
list.get(0); //0번째 주소에 있는 원소 가져오기
list.size()); //list 크기
list.contains(1); // list에 1 값있는지 검색 (boolean)
list.containsAll(); //. 보통 두 개의 list 안에 값이 같은지 검색할 때 사용된다 list.containsAll(list2) (boolean)
list.indexOf(1) //index 1에 값이 있는지 검색 (boolean)
list.isEmpty() //리스트가 비어 있는지 (boolean)
list.remove(0); //0번째 주소에 있는 값 제거
list.remove("123"); //해당 값 제거
list.clear(); //모든 값 제거
등등
그리고 자료구조하면 빼먹을 수 없는 클래스가 있는데..
Stack & Vector
사실 쓸 이유가 없어졌다!(자바 한정?)
Stack과 Vector은 List 인터페이스를 구현한 자료구조이다.
Vector는 예전에 사용하던 거라 지금은 거이 사용 안 하고
Stack은 Vector의 확장한 클래스이다. LIFO라는 특징을 가지고 있다.
근데? LIFO자료구조를 위해 사용한다고 하기엔 또 별로이다.
왜냐면 Stack이 중간에 값을 넣을 수 없기 때문이다.
대체 가능한 Deque를 쓰도록 하되, 사용법과 개념정도는 알아 두자
Stack 선언
Stack<Integer || String> stk= new Stack<>();
Stack의 주요 함수
stk.push(123) //123 값 추가(차례로 쌓기)
stk.peek() //제일 위에 있는 원소 리턴(제일 마지막에 저장한)
stk.pop() //제일 위에 원소 제거
stk.search(123) //123 이 들어있는 주소값 반환(제일 마지막에 넣은 값이 1, 값이 없다면 -1 리턴)
Set
Set의 특징은 데이터값이 중복 불가능하고 순서가 없다는 특징이 있다
근데 단독으로 거이 안 쓰고 맵으로 다 씀
-HashSet ★ set의 대표 그나마 사용
-LinkedHashSet
add() 한 순서대로 값이 저장된다.
-SortedSet
몰라도 됨
-TreeSet
1. 오름차순으로 값을 정렬
2. 다른 set보다 대량의 데이터를 검색할 시 훨씬 빠르다.
Set 선언
Set<Integer || String> se = new HashSet<>() ;
Set의 주요 함수
se.add()
se.size()
se.contains()
se.equals()
se.isEmpty()
se.remove()
se.clear()
보다시피 자료 순서에 관한 함수가 없다.
Queue & Deque
Queue의 특징은 FIFO인 특성을 가지고 있다. 먼저 넣은 거 먼저 빠지는데
deque가 queue 역할 전부 할 수 있으니까 쓸 거면 deque 쓰자.
-ArrayDeque
-LinkedList
이 두 개만 알아둬도 충분하다.
Queue 선언
Deque deque = new ArrayDeque();
Deque<Integer ||String> deque = new ArrayDeque<>();
Deque deque= new LinkedList();
Deque<Integer || String> deque= new LinkedList<>();
Deque 주요 함수
명령어가 좀 많다..
덱은 Stack과 Queue의 결합이기 때문에 push, pop도 가능하다.
addFirst() 맨 앞에 원소 삽입, 용량 초과 시 예외 발생
add() 마지막에 원소 삽입, 용량 초과 시 예외 발생
addLast() //add()와 동일
offerFirst() 맨 앞에 원소 삽입, 삽입 성공 시 true, 용량 제한에 걸리는 경우 false 반환
offer() 마지막에 원소 삽입, 삽입 성공 시 true, 용량 제한에 걸리는 경우 false 반환
offerLast() //offer()와 동일
////삽입
remove() 맨 앞의 원소 제거 후 해당 원소를 리턴
removeFirst() 맨 앞의 원소 제거 후 해당 원소를 리턴
removeLast() 마지막 원소 제거 후 해당 원소를 리턴
poll 맨 앞의 원소 제거 후 해당 원소를 리턴
pollFirst() //poll()와 동일
pollLast() 마지막 원소 제거 후 해당 원소를 리턴
poll은 값이 비어있을 때 null을 반환하고 remove는 에러 난다
////제거
getFirst() 덱의 앞쪽 엘리먼트 하나를 제거하지 않은 채 리턴한다.
getLast() 덱의 마지막 쪽 엘리먼트 하나를 제거하지 않은 채 리턴한다.
peek() 덱의 앞쪽 엘리먼트 하나를 제거하지 않은 채 리턴한다.
peekFirst() //peek()와 동일
peekLast() 덱의 마지막 엘리먼트 하나를 제거하지 않은 채 리턴한다.
peek는 값이 비어있을 때 null을 반환하고 get은 에러 난다
//가져오기
Map
Map의 특징은 key값과 value값을 이용해 데이터를 찾고 가져올 수 있다.
-HashMap ★자주사용
-ConcurrentHashMap ★동시성 보장
-Hashtable
-LinkedHashMap
-SortedMap
-TreeMap
선언
Map<String, Object> map= new HashMap<>();
명령어
map.put("이름", "익명"); //데이터 저장
map.put("나이", 10); //데이터 저장
키값 중복되면 덮어씀
map.keySet() key값들 반환
map.values() value값 반환
map.toString() key,value 반환
map.replace("이름", "무명"); 데이터 수정
map.remove("나이"); 키값 삭제
'Java' 카테고리의 다른 글
자바 BufferedWriter & BufferedReader 사용방법 (3) | 2023.02.01 |
---|