TIL - 22.11.16(자바 강의)

자라나는 ㅇㅅㅇ개발자·2022년 11월 16일
0

TIL

목록 보기
13/126

컬렉션

  • 구체적인 자료구조의 종류인 리스트(list), 스택(stack), 큐(queue), 셋(set), 맵(map) 들을 통틀어 컬렉션 이라 한다.

컬렉션 프레임워크

  • 다수의 데이터를 다루기 위한 자료구조를 표현하고 사용하는 클래스의 집합

컬렉션 인터페이스


정의 1

  • List 인터페이스 : 순서가 있는 자료 관리, 중복 허용.
    이 인터페이스를 구현한 클래스는 ArrayList, Vectior, LinkedList, Stack, Queue 등이 있다.
  • Set 인터페이스 : 순서가 정해져 있지 않음, 중복을 허용하지 않음.
    이 인터페이스를 구현한 클래스는 HashSet, TreeSet 등이 있다.

정의 2

  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 등

List 예제

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> integerList = new ArrayList<>();      // 리스트에 어떤 타입의 자료구조를 담을지 선, 아직 사이즈를 지정해주지 않음
        integerList.add(1);
        integerList.add(5);
        integerList.add(4);
        integerList.add(11);
        integerList.add(10);
        System.out.println(integerList);    // 출력값 : [1, 5, 4, 11, 10]

        Collections.sort(integerList);      // 설정해주지 않으면 오름차순으로 정렬
        System.out.println(integerList);    // 출력값 : [1, 5, 4, 11, 10]
        System.out.println(integerList.size());     // 출력값 : 5

        integerList.remove(4);        // 4번째 인덱스를 삭제해라
        System.out.println(integerList);    // 출력값 : [1, 4, 5, 10]

        for(int i=0; i < integerList.size(); i++) {
            System.out.println(integerList.get(i));     // 출력값 : 1 / 4 / 5 / 10
        }
    }
}

Set 예제

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class Main {
    public static void main(String[] args) {
        Set<Integer> integerSet = new HashSet<>();
        integerSet.add(1);
        integerSet.add(1);
        integerSet.add(3);
        integerSet.add(2);
        integerSet.add(9);
        integerSet.add(8);
        System.out.println(integerSet);     // 출력값 : [1, 2, 3, 8, 9], add로 넣어준 순서와 상관이 없

        Set<String> stringSet = new HashSet<>();
        stringSet.add("LA");
        stringSet.add("New York");
        stringSet.add("LasVegas");
        stringSet.add("San Francisco");
        stringSet.add("Seoul");
        System.out.println(stringSet);      // 출력값 : [San Francisco, New York, LasVegas, LA, Seoul]

        stringSet.remove("Seoul");
        System.out.println(stringSet);      // 출력값 : [San Francisco, New York, LasVegas, LA]

        List<String> target = new ArrayList<>();
        target.add("New York");
        target.add("LasVegas");
        stringSet.removeAll(target);
        System.out.println(stringSet);      // 출력값 : [San Francisco, LA]

        System.out.println("LA 포함되어있나요?" + stringSet.contains("LA"));       // 출력값 : LA 포함되어있나요?true
        System.out.println("Seoul 포함되어있나요?" + stringSet.contains("Seoul")); // 출력값 : Seoul 포함되어있나요?false

        System.out.println(stringSet.size());   // 출력값 : 2
        stringSet.clear();
        System.out.println(stringSet);          // 출력값 : []
    }
}

Map 예제

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<Integer, String> map = new HashMap<>();
        map.put(1, "apple");
        map.put(2, "berry");
        map.put(3, "cherry");

        System.out.println(map);    // 출력값 : {1=apple, 2=berry, 3=cherry} : {key=value}형태

        System.out.println("0 in map: " + map.get(0));      // 출력값 : 0 in map: null
                                                            // : index가 아닌 key = 0을 찾으므로 없다.
        System.out.println("1st in map: " + map.get(1));    // 출력값 : 1st in map: apple
                                                            // : key를 받아서 value를 리턴한다.
        map.remove(2);             // key = 2 에 해당하는 값을 지운다
        System.out.println(map);        // 출력값 : {1=apple, 3=cherry}
        System.out.println(map.containsKey(2));             // 출력값 : false
        System.out.println(map.containsValue("cherry"));    // 출력값 : true

        map.clear();
        System.out.println(map);        // 출력값 : {}
    }
}

스택(Stack)

  • 스택은 마지막에 저장한 데이터를 가장 먼저 꺼내는 자료구조로 입니다. 이것을 LIFO(Last In First Out) 라고 합니다.
  • 웹브라우저의 앞페이지 이동 뒤페이지 이동 / 그릇 쌓기

스택 예제

import java.util.Stack;

public class Main {
    public static void main(String[] args) {
        Stack<Integer> stack = new Stack<>();
        stack.push(1);
        stack.push(3);
        stack.push(7);
        stack.push(5);
        System.out.println(stack);      // 출력값 : [1, 3, 7, 5]

        System.out.println(stack.peek());   // 출력값 : 5 : 가장 마지막에 넣은 값이 출력
        System.out.println("size : " + stack.size());   // 출력값 : size : 4 : peek은 확인만
        System.out.println(stack.pop());    // 출력값 : 5 : 가장 마지막에 넣은 값을 뽑아낸다
        System.out.println("size : " + stack.size());   // 출력값 : size : 3 : pop해서 뽑음

        System.out.println(stack.contains(1));  // 출력값 : true
        System.out.println(stack.empty());      // 출력값 : false : 비어있지 않으므로
        stack.clear();
        System.out.println(stack.isEmpty());    // 출력값 : true
    }
}

큐(Queue)

  • 큐는 처음에 저장한 데이터를 가장 먼저 꺼내게 되는 FIFO(First In First Out) 구조로 되어있습니다.
  • 은행 창구 줄서기 / 인쇄작업 대기목록

큐 예제

import java.util.LinkedList;
import java.util.Queue;

public class Main {
    public static void main(String[] args) {
        Queue<Integer> queue = new LinkedList<>();
        queue.add(1);
        queue.add(5);
        queue.add(3);
        System.out.println(queue);          // 출력값 : [1, 5, 3]
        System.out.println(queue.poll());   // 출력값 : 1 : 처음 넣어준 값을 뽑아낸다
        System.out.println(queue);          // 출력값 : [5, 3] : 가장 처음에 넣어준게 뽑아나와서
        System.out.println(queue.peek());   // 출력값 : 5 : 처음 넣어준 값을 출력
    }
}

ArrayDeque

  • deque의 경우 양 끝에서 삽입과 반환이 가능
  • 기본 Stack, Queue의 기능을 모두 포함하면서도 성능이 더 좋기 때문에 실무에서는 단순히 Stack, Queue 클래스 대신에 ArrayDeque 많이 사용

ArrayDeque 예제

import java.util.ArrayDeque;

public class Main {
    public static void main(String[] args) {
        ArrayDeque<Integer> arrayDeque = new ArrayDeque<>();
        arrayDeque.addFirst(1);
        arrayDeque.addFirst(2);
        arrayDeque.addFirst(3);
        arrayDeque.addFirst(4);
        System.out.println(arrayDeque); // 출력값 : [4, 3, 2, 1] : 계속해서 first에만 넣어주므로 처음 넣었던 1이 뒤로 밀려난다.

        arrayDeque.addLast(0);
        System.out.println(arrayDeque); // 출력값 : [4, 3, 2, 1, 0]

        arrayDeque.offerFirst(10);
        System.out.println(arrayDeque); // 출력값 : [10, 4, 3, 2, 1, 0]
        arrayDeque.offerLast(-1);
        System.out.println(arrayDeque); // 출력값 : [10, 4, 3, 2, 1, 0, -1]

        arrayDeque.push(22);         // stack에서 사용하던 push
        System.out.println(arrayDeque); // 출력값 : [22, 10, 4, 3, 2, 1, 0, -1]
        System.out.println(arrayDeque.pop());   // 출력값 : 22
        System.out.println(arrayDeque); // 출력값 : [10, 4, 3, 2, 1, 0, -1]

        // queue에 있던 poll, 둘 다 있던 peek, size, clear, isEmpty 모두 작동 
    }
}
  • offerFirst : queue에 문제가 생겼을 때 false를 리턴
  • addFirst : queue에 문제가 생겼을 때 exception을 리턴

제네릭스

  • 어떤 값이 하나의 참조 자료형이 아닌 여러 참조 자료형을 사용할 수 있도록 프로그래밍하는 것을 제네릭 프로그래밍 이라한다.
  • 다양한 타입의 객체들을 다루는 메소드나 컬렉션 클래스에 컴파일 시의 타입 체크를 해주는 기능을 의미합니다.
  • 객체의 타입을 컴파일 시에 체크하기 때문에 안정성이 높아집니다.
  • 제네릭스의 형식
public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}
  • 자주 사용되는 타입인자 약어
<T> == Type
<E> == Element
<K> == Key
<V> == Value
<N> == Number
<R> == Result

람다

  • "식별자 없이 실행 가능한 함수"
  • 즉, 함수의 이름을 따로 정의하지 않아도 곧바로 함수처럼 사용할 수 있는 것
  • 문법이 간결하여 보다 편리한 방식입니다. (익명 함수라고도 부릅니다.)
  • 람다를 사용하여서 만든 익명 함수는 재사용이 불가능합니다.
  • 람다만을 사용할 경우 비슷한 메소드를 중복되게 생성할 가능성이 있으므로 지저분해질 수 있습니다.

람다의 형식

[기존의 메소드 형식]
반환타입 메소드이름(매개변수 선언) {
    수행 코드 블록
}

[람다식의 형식]
반환타입 메소드이름(매개변수 선언) -> {
    수행 코드 블록
}

람다식 예제

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("korea");
        list.add("japan");
        list.add("france");
        Stream<String> stream = list.stream();
        stream.map(str -> {
            System.out.println(str);
            return str.toUpperCase();
            }) .forEach(System.out::println);
        // list.add에서 소문자로 입력하였지만 toUpperCase 때문에 출력은 전부 대문자로 나온다.
        // -> 뒤에는 함수의 내용이 들어간다. 여러 함수가 들어갈 경우 {} 중괄호를 사용한다.
    }
}

스트림

  • 스트림은 곧 '데이터의 흐름'입니다.
  • 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자입니다.
  • 스트림을 활용해서 필터링,데이터 변경, 다른 타입이나 자료구조로 변환 등을 할 수 있습니다.

스트림의 특징

  • 스트림은 데이터 소스를 변경하지 않습니다.
  • 스트림은 작업을 내부적으로 반복 처리합니다.
  • 스트림은 컬렉션의 요소를 모두 읽고 나면 닫혀서 재사용이 불가능합니다. 그러므로 필요할 경우 재생성을 해야합니다.
  • 어떠한 컬렉션이든(List, Set, Map) 원래 데이터에서 하나씩 꺼내 뒤에있는 연산을 수행해준다.

스트림 예제

import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class Main {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("서울");
        list.add("부산");
        list.add("대구");
        list.add("용인");

        System.out.println(list);               // 출력값 : [서울, 부산, 대구, 용인]

        List<String> result = list.stream()
                .limit(2)               // 앞에 있는 두개만 남기고 지우겠다
                .collect(Collectors.toList());
        System.out.println(result);             // 출력값 : [서울, 부산]
        System.out.println("list -> transformation -> set");    // set 이라는 자료구조로 바꾸겠다.
        Set<String> set = list.stream()         // 리스트에 있는 데이터를 하나씩 꺼내서
                .filter("서울"::equals)          // 서울이랑 글자가 같은지 보고 같은거만 남기겠
                .collect(Collectors.toSet());   // set의 자료구조로 바꿔서 모아주겠다.
        System.out.println(set);                // 출력값 : [서울]
    }
}

스트림 퀴즈

이씨 성을 가진 인원의 수를 출력해라

import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("김정우", "김호정", "이하늘", "이정희", "박정우", "박지현", "정우석", "이지수");
        System.out.println("이씨 성을 가진 친구들 : " + names.stream()
                .filter(name -> name.startsWith("이"))
                .count());
    }
}

: 이씨 성을 가진 친구들 : 3


네트워킹

  • 두 대이상의 컴퓨터를 케이블 또는 인터넷으로 연결하여 네트워크를 구성하는 것을 말합니다.

네트워크의 기본적인 개념

  • 클라이언트(Client) / 서버(Server) (컴퓨터간의 관계를 역할로 구분)
  • 서버 : 서비스를 제공하는 컴퓨터, 요청에 응답하는 컴퓨터
  • 클라이언트 : 서비스를 사용하게 되는 컴퓨터, 요청을 하는 컴퓨터
  • IP 주소 : 컴퓨터를 구별하는데 사용된느 고유한 값으로 인터넷에 연결이 되어있는 모든 컴퓨터는 IP 주소를 갖습니다.
  • URL(Uniform Resource Locator) : URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것입니다! (우리가 네이버, 구글을 검색할 때도 URL을 이용하여 접근을 하는 것이죠!)
  • API(Application Programming Interface)
    응용 프로그램에서 사용할 수 있도록 운영체제나 프로그래밍 언어가 제공하는 기능을 제어 할 수 있게 해주는 인터페이스를 의미합니다. client-server 관점에서 API는 요청과 응답의 형식에 대한 약속입니다.

0개의 댓글