자바[JAVA](컬렉션(리스트, 셋, 맵,스택, 큐,ArrayDeque),제네릭스)

allnight5·2022년 11월 14일
0

자바

목록 보기
4/12

컬렉션(자료구조)

자바에서는 자료구조를 통틀어서 컬렉션이라고 하며 컬렉션을 이용해서 리스트 스택 큐 셋 맵등을 불러서 사용한다.
컬렉션 프레임워크의 모든 클래스는 Collection interface를 구현(implement)하는 클래스 또는 인터페이스입니다.

자료구조별 간단한 설명

Collection 은 모든 자료구조가 구현(implement)하는 인터페이스입니다. 아래 배우는 모든 자료구조에 해당하는 클래스, 인터페이스는 언제나 Collection 인터페이스를 구현하고 있습니다.

  1. List : 순서가 있는 데이터의 집합이며 데이터의 중복을 허용합니다.
    → ArrayList, LinkedList, Stack 등
  2. Set : 순서를 유지하지 않는 데이터의 집합이며 데이터의 중복을 허용하지 않습니다.
    → HashSet, TreeSet 등
  3. Map : 키(key)와 값(value)의 쌍으로 이루어진 데이터의 집합입니다. 순서는 유지되지 않으며 키는 중복을 허용되지 않고 값은 중복을 허용합니다.
    → HashMap, TreeMap 등
  4. Stack : 마지막에 넣은 데이터를 먼저 꺼내는 자료구조입니다. LIFO(Last In First Out)
    → Stack, ArrayDeque 등
  5. Queue : 먼저 넣은 데이터를 먼저 꺼내는 자료구조입니다. FIFO(First In First Out)
    → Queue, ArrayDeque 등

1-22 컬렉션-리스트, 셋, 맵

리스트

//리스트의 경우 넣어준 순서대로 유지가 된다.
        List<Integer> integerList = new ArrayList<>();
        integerList.add(1); 
        System.out.println(integerList);
        //정렬의 경우 아무런 설정을 해주지 않는다면 오름차순으로 정렬된다 ascending
        //오름차순asc 작은것부터, 내림차순desc 큰것부터
    //내림차순 정렬을 하고싶다면 뒤에 ,Collections.reverseOrder()이것을 추가해주면 된다.
//      Collections.sort(integerList,Collections.reverseOrder());
        Collections.sort(integerList);
        System.out.println(integerList);

for문 제1형태

    for (int i=0; i< integerList.size(); i++){
        System.out.println(integerList.get(i));                               }

for문 제2형태

    for (int current : integerList){
    
        System.out.println(current); 						 }

Set(셋)

// Set의 경우 순서가 자동적으로 오름차순으로 정렬된다.
Set integerSet = new HashSet<>();
integerSet.add(1);
integerSet.add(1);
integerSet.add(3);
System.out.println(integerSet);

    Set<String> stringSet = new HashSet<>();
    stringSet.add("LA"); 
    stringSet.add("Seoul");
    System.out.println(stringSet);
    stringSet.remove("Seoul");
    System.out.println(stringSet);

    List<String> target = new ArrayList<>();
    target.add("New York");
    target.add("Seoul");

여러개의 리스트를 제거할때는 remove가아닌 removeAll을 쓰며

리스트에 담아서 사용해야한다.

    stringSet.removeAll(target);
    System.out.println(stringSet);

//인스턴스변수명.contains(“검색할문자열”); 내가 찾으려는 글자가 리스트에 들어있는지
//확인할수있게해준다 반환값은 true or false이다
System.out.println("LA가 포함되어 있나요?" + stringSet.contains("LA"));
//set에 몇 개의 리스트를 가지고 있는지 알려주는 것
System.out.println(stringSet.size());

리스트(셋) 초기화시 이용

//stringSet의 모든 내용을 지우는것
stringSet.clear();

map(맵)

//python이나 다른곳의 딕셔너리와 같다 key와 value을 같는다.
//key는 고유값으로 같은 값은 들어갈 수 없다.
//리스트나 셋과는 다르게 킷값으로 검색해줘야 내용을 찾을수 있으니 index로는 찾을 수 없다.
//get은 key값을 받아서 value를 반환해준다.
System.out.println(map.get(1));
//remove도 마찬가지로 킷값을 넣어줘야 킷값에 맞는 데이터가 삭제된다
//contains를 이용한 검색에서도 containskey()와 containsvalue()로 key값과 value값을 이용한 검색을 한다.
//clear()는 같다.

#컬렉션 – 스택, 큐,ArrayDeque

stack(스택)

//마지막에 저장한 데이터를 먼저 꺼내는 자료구조로 LIFO(Last in Fisrt Out)
//뒤로 가기나 전 작업복구가 되는 이유가 stack 때문으로 마지막에 작업한 것을 꺼내서 주기 때문이다.
//.peek()는 맨위의 자료를 보여주기만하는것이고 .pop은 맨위에 있는 것을 꺼내고 보여준다.

import java.util.Stack; //import 사용하겠다는 선언
Stack<Integer> stack = new Stack<>(); //int형 스택 선언
stack.push(1);     // stack에 값 1 추가
stack.push(2);     // stack에 값 2 추가
stack.size();      // stack의 크기 출력 : 2
stack.push(3);     // stack에 값 3 추가
stack.size();      // stack의 크기 출력 : 3
stack.peek();     // stack의 가장 상단의 값 출력(준다)
stack.size();      // stack의 크기 출력 : 3
stack.pop();     // stack에서 맨위쪽 값을 꺼내면서 값을 출력(준다).
stack.size();      // stack의 크기 출력 : 2
stack.empty();     // stack이 비어있는제 check (비어있다면 true 아니라면 false)
stack.contains(1) // stack에 1이 있는지 check (있다면 true)
stack.clear();     // stack의 전체 값 제거 (초기화)
stack.empty();     // stack이 비어있는제 check (비어있다면 true)

Quere(큐)

//기본적으로 FIFO(First In First Out)으로
//우선순위 큐, 원형 우선순위 큐, 원형 큐등 다양하게 존재한다.
//Queue는 인터페이스 이기 때문에 구현체가 필요하고 기본적으로 LikedList<>();를이용하여 받는다
//Queue queue = new LikedList<>();
//queue.poll();은 stack의 pop의 역할을 하며 stack과 같게 isempty(), empty(),peek()이 있다.
큐 참조사이트

import java.util.LinkedList; //import
import java.util.Queue; //import
Queue<Integer> queue = new LinkedList<>(); //int형 queue 선언, linkedlist 이용
Queue<String> queue = new LinkedList<>(); //String형 queue 선언, linkedlist 이용

Queue<Integer> stack = new LinkedList<>(); //int형 queue 선언
queue.add(1);     // queue에 값 1 추가
queue.add(2);     // queue에 값 2 추가
queue.offer(3);   // queue에 값 3 추가

add(value) 메소드의 경우 만약 삽입에 성공하면 true를 반환하고, 
큐에 여유 공간이 없어 삽입에 실패하면 IllegalStateException을 발생시킵니다

queue.poll();       // queue에 첫번째 값을 반환하고 제거 비어있다면 null
queue.remove();     // queue에 첫번째 값 제거
queue.clear();      // queue 초기화

queue에서 값을 제거하고싶다면 poll()이나 remove라는 메서드를 사용하면 됩니다. 
poll()함수는 큐가 비어있으면 null을 반환합니다. 

queue.peek();       // queue의 첫번째 값 참조


import java.util.LinkedList; //import
import java.util.Queue; //import
Queue<Integer> queue = new LinkedList<>(); //int형 queue 선언, linkedlist 이용
Queue<String> queue = new LinkedList<>(); //String형 queue 선언, linkedlist 이용

Queue<Integer> stack = new LinkedList<>(); //int형 queue 선언
queue.add(1);     // queue에 값 1 추가
queue.add(2);     // queue에 값 2 추가
queue.offer(3);   // queue에 값 3 추가
queue.poll();       // queue에 첫번째 값을 반환하고 제거 비어있다면 null
queue.remove();     // queue에 첫번째 값 제거
queue.clear();      // queue 초기화 
queue.peek();       // queue의 첫번째 값 참조 1을 출력
queue.offer(2);   // queue에 값 2 추가
queue.offer(6);   // queue에 값 6 추가
queue.offer(3);   // queue에 값 6 추가
queue.remove(3);     // queue에 3 값 제거 가장 처음 들어온 3을 제거
queue.peek();       // queue의 첫번째 값 참조 2를 출력

ArrayDeque

//실무에서 많이 사용하며 스택이나 큐의 기능을 다포함도하며 pop, push, pull이런
//함수들이 있으면서도 성능이 더 좋기 때문에 많이 사용한다.

    ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
    arrayDeque.addFirst(1); 
    System.out.println(arrayDeque);

    arrayDeque.addLast(0);
    System.out.println(arrayDeque);
    //offerFirst는 addFisrt와 비슷하지만 큐의 크기에 문제가 생길때
    //false라는 리턴값을 리턴하고 addFisrt의 경우는 exception이 난다.
    arrayDeque.offerFirst(10);
    System.out.println(arrayDeque);
    arrayDeque.push(22);
    System.out.println(arrayDeque);
    System.out.println(arrayDeque.pop());
    System.out.println(arrayDeque);

큐나 스택에 있는 함수를 제공하며 pollLast나 pollFirst라는 함수도 제공한다.

    arrayDeque.pollLast(22);

#우선순위큐 (Priority Queue) 사용법
우선순위 큐 참조 사이트

import java.util.PriorityQueue; //import

//int형 priorityQueue 선언 (우선순위가 낮은 숫자 순)
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();

//int형 priorityQueue 선언 (우선순위가 높은 숫자 순)
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());

//String형 priorityQueue 선언 (우선순위가 낮은 숫자 순)
PriorityQueue<String> priorityQueue = new PriorityQueue<>(); 

//String형 priorityQueue 선언 (우선순위가 높은 숫자 순)
PriorityQueue<String> priorityQueue = new PriorityQueue<>(Collections.reverseOrder());
## 추가
priorityQueue.add(1);     // priorityQueue 값 1 추가
priorityQueue.add(2);     // priorityQueue 값 2 추가
priorityQueue.offer(3);   // priorityQueue 값 3 추가
## 삭제
priorityQueue.poll();       // priorityQueue에 첫번째 값을 반환하고 제거 비어있다면 null
priorityQueue.remove();     // priorityQueue에 첫번째 값 제거
priorityQueue.clear();      // priorityQueue에 초기화

### Priority Queue에서 우선순위가 가장 높은 값 출력
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();//int형 priorityQueue 선언
priorityQueue.offer(2);     // priorityQueue에 값 2 추가
priorityQueue.offer(1);     // priorityQueue에 값 1 추가
priorityQueue.offer(3);     // priorityQueue에 값 3 추가
priorityQueue.peek();       // priorityQueue에 첫번째 값 참조 = 1

priorityQueue.contains(2) //2가 있다면 true를 없다면 false를 반환한다. true를 반환
priorityQueue.contains(5) //5가 있다면 true를 없다면 false를 반환한다. false를 반환
어째서 1이냐. 우선순위큐의 정렬은 기본적으로 오름차순으로 가장 낮은수가
첫번째로 오기때문에 이것을 바꿔주고싶다면 큐생성시
소괄호란에 Collections.reverseOrder()를 넣어주면 내림차순정렬로
가장 큰수가 첫번째로 오게된다.
 comparator<? super E>
이 큐의 요소를 정렬하는 데 사용되는 비교값을 반환합니다.

이 큐가 요소의 자연스러운 순서에 따라 정렬 된 경우에는 null을 반환합니다.
  

제네릭스

다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 의미합니다.(이미 컬렉션을 배울때 한번 만나본적있습니다!)
예를 들어 공장을 만들었고 컨베이어 벨트도 깔고 이제 물건 싣고 나르는 걷도 깔아서 인프라를 다 완료했다.
콜라 캔커피 바뀌어도 를 생산할 수 있다.
우리가 주로 사용하는 구조, 동작를 다 세팅 해두고
커피 콜라등은 자바에서는 자는 클래스를 의미한다.
컨베이어 벨트의 경우 우리가 제네릭스를 활용해서 짠 코드 클래스 메소드를 의미한다.

  • 제네릭스를 왜 사용해야할까?
    → 객체의 타입을 컴파일 시에 체크하기 때문에 안정성이 높아집니다.
    런타임시 클래스의 타입이 잘못 돼서 에러가 나거나 프로그램이 죽는일이 없다는 것을 의미한다.
    컴파일시 체크하는 것을 프로그램의 안정도를 높여준다.
    꺽쇠를하고<> 써주면 제네릭스의 형태가 된다.
    public class 클래스명 {...}
    public interface 인터페이스명 {...}
    제네릭스를 공부할때는 짜져 있는 것을 분석하는 것이 좋다.
    containAll<?>은 아무거나 와도되 없어도 된다는 뜻을 가진다 꺽쇠 ?는그런의미이다
    ? 인데 extends E 이말은 뭐냐면 어떤것들을 추가할때는 다른콜렉션을 여러개 넣을수 있는데 대신에 그 콜렉션은 E라는 그 타입이거나 그타입을 상속받은 자식 클래스를 가진 콜렉션에 한정해서만 다 받아줄거야 라는 의미이다.

제네릭스는 동작은 같지만 클래스 타입만 바뀌어야 하는 경우를 쉽게 다룰 수 있다.
컴파일의 언어 타입안정성까지 보장하면서도유연한 프로그램을 작성할수 있다는 장점이 있다
대표적으로 콜랙션이 있다.
List exceptionsList = new ArrayList<>();
collection = exceptionsList;// 이런 타입이 있다.
List exceptions = new ArrayList<>();
exceptionsCollection.addAll(exceptions);

profile
공부기록하기

0개의 댓글