[11.16] 내일배움캠프[Spring] TIL-13

박상훈·2022년 11월 17일
0

내일배움캠프[TIL]

목록 보기
13/72

[11.16] 내일배움캠프[Spring] TIL-13

1. Java - Collection

  • Stack , Queue, ArrayDeque
  • Stack
    👉 LIFO ( Last In First Out ) 의 자료구조
  • Stack 예제코드
import java.util.HashMap;
import java.util.Map;
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 -> 맨위에것 확인만 하기

        stack.pop();
        System.out.println(stack); // [1, 3, 7]
        System.out.println(stack.size());//3 pop해서 하나 빠짐

        System.out.println(stack.contains(1)); // true
        System.out.println(stack.empty());//false 비어있는지 확인 isEmpty()랑 같음

        stack.clear();
        System.out.println(stack.isEmpty());//true


    }
}
  • Queue
    👉 FIFO ( Fist In First Out ) 의 자료구조
  • Queue 예제코드
import java.util.*;

public class Main {
    public static void main(String[] args) {

        Queue<Integer> queue = new LinkedList<>(); // Queue의 구현체로 LinkedList가 있음
        queue.add(1);
        queue.add(5);
        queue.add(3);

        System.out.println(queue);//[1, 5, 3]
        System.out.println(queue.poll());//1 -> 앞에있는 것을 빼면서 return
        System.out.println(queue);

        System.out.println(queue.peek()); // 5 -> 빼지 않고 보기
        //isEmpty() 같은건 동일하게 존재

    }
}	
  • ArrayDeque
    👉 실무에서 많이 사용 , 성능이 좋고 사용할 함수가 다양함.
    👉 양쪽에서 값이 삽입과 꺼내는 것이 가능함 -> 유연하다.
  • ArrayDeque 예제 코드
import java.util.*;

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]

        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] -> addFirst()랑 비슷하지만 큐의 크기에 문제가 생길 때 return으로 False를 반환함
        arrayDeque.offerLast(-1);
        System.out.println(arrayDeque); // [10, 4, 3, 2, 1, 0, -1]

        arrayDeque.push(22);
        System.out.println(arrayDeque); // [22, 10, 4, 3, 2, 1, 0, -1]-> 22가 앞에 들어감
        arrayDeque.pop();
        System.out.println(arrayDeque); // [10, 4, 3, 2, 1, 0, -1] -> 22가 빠짐 -> stack의 기능도 제공

        System.out.println(arrayDeque.poll()); // 10 -> pollFirst() , pollLast()도 지원한다.
        System.out.println(arrayDeque.peek()); // 4 -> peekFirst(), peekLast()도 지원한다.

        System.out.println(arrayDeque.size()); // 6
        arrayDeque.clear();
        System.out.println(arrayDeque.isEmpty()); // true


    }
}

2. Java - 제네릭스

👉 다양한 타입을 다루는 메소드가 컬렉션 클래스에서 컴파일시 타입 체크를 해주는 기능을 의미한다.
👉 객체의 타입을 컴파일 시에 체크하기 때문에 안정성이 높아진다.

  • 제네릭스의 형식
public class 클래스명<T> {...}
public interface 인터페이스명<T> {...}
  • 자주 사용되는 타입인자 약어
- 자주 사용되는 타입인자 약어- 

- <T> == Type
- <E> == Element
- <K> == Key
- <V> == Value
- <N> == Number
- <R> == Result
  • 제네릭스 예제
import java.util.*;

public class Main {
    public static void main(String[] args) {

        List<String> list = new ArrayList<>();
        Collection<String> collection = list;


        list.add("string");

        List<Exception> exceptionList = new ArrayList<>();
        Collection<Exception>exceptionCollection = exceptionList;

        //exceptionList.addAll(list) --> 타입 오류

        List<IllegalArgumentException> exceptions = new ArrayList<>(); // IllegalArgumentException 타입의 list컬렉션을 위에 exceptionList에 넣을 수 있음(타입 일치)
        exceptionCollection.addAll(exceptions);


    }
}

3. Java - 람다, Stream

  • 람다
    👉 함수를 좀더 쉽게 표현하자 > {} 등.. 없이 해보자!
    👉 문법이 간결하다 > 같은 코드를 또 작성해야 한다면 > 함수로 만들자..!
  • 람다 예제
import java.util.*;
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> listStream = list.stream();
        //map 뭐로 바꿀게~ , forEach 각각 반복
        listStream.map(str -> {
            System.out.println(str); // 이처럼 map으로 수행할 경우가 여러가지인 경우 {}를 사용해서 가능!
            return str.toUpperCase();
        }).forEach(it -> System.out.println(it)); //KOREA ,JAPAN, FRANCE
        
        //listStream.forEach(System.out::println);  error ->  forEach를 사용했을 때 이미 닫힘 
    }
}
  • Stream
    👉 하나의 데이터 흐름
    👉 데이터의 다중에서 흐름이 생기는 것
    👉 보통은 Collection을 Stream으로 표현
    👉 배열도 Stream으로 표현가능
    👉 코드가 간결해진다.
    👉 List Collection을 Stream으로 표현 -> list.stream() -> stream.map() -> stream.(Collection에서 하나하나 꺼내 . 뒤에 연산을 실행할게!)
    Stream은 데이터 소스를 건드리지 않는다 -> 원본 Collection을 훼손하지 않는다.
    👉 개인 느낌 : 만약 Collection타입의 데이터나, 배열 타입의 데이터를
    어떠한 조건 ( 첫번째로 뭐로 시작?, 몇개야?, 이거는 몇개있어? 등..)
    을 찾기 위해서는 for ~ if등의 사용으로 코드가 길어진다.
    -> Stream을 사용하여 간결한 코드 가능..!
  • Stream 예제 - 1
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<String> set = list.stream()
                .filter("서울"::equals)
                .collect(Collectors.toSet());
        set.forEach(System.out::println);
    }
}
  • Stream 예제 - 2
import java.util.Arrays;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {

        String [] arr = {"SQL","Java","Python"};
        Stream<String> stringStream = Arrays.stream(arr); // Collection이 아니라도 가능!
        stringStream.forEach(System.out::println);

    }
}
  • Stream 예제 - 3
import org.apache.commons.lang3.tuple.Pair;

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

class Sale {
    String fruitName;
    int price;
    float discount;

    public Sale(String fruitName, int price, float discount) {
        this.fruitName = fruitName;
        this.price = price;
        this.discount = discount;
    }
}

public class Main {
    public static void main(String[] args) {
        List<Sale> sales = Arrays.asList(
                new Sale("Apple",5000,0.05f),
                new Sale("Orange",4000,0.02f),
                new Sale("Grape",2000,0)
        );

        sales.stream()
                .map(sale -> Pair.of(sale.fruitName,sale.price * (1 - sale.discount)))
                .forEach(pair -> System.out.println(pair.getLeft() + "실구매가:"+pair.getRight()+"원 입니다."));
        //Apple실구매가:4750.0원 입니다.
        //Orange실구매가:3920.0원 입니다.
        //Grape실구매가:2000.0원 입니다.
    }
}
  • Stream 예제 - 4
import java.util.Arrays;
import java.util.List;

public class Main {
    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
        System.out.println(list.stream().reduce(0,Integer::sum));// 55 -> 0부터 시작해서 더하기 중첩!!       

    }
}
  • Stream 사용 퀴즈
    👉 Stream을 이용하여 이씨성을 가진 친구의 숫자 세기
public class Main {
    public static void main(String[] args) {
        List<String> names = Arrays.asList("김정우", "김호정", "이하늘", "이정희", "박정우", "박지현", "정우석", "이지수");

        System.out.println("이씨 성을 가진 친구들 = > "+names.stream().
                filter(name -> name.startsWith("이"))
                .count());

    }
}

4. Java - 네트워킹 OpenAPI

  • 클라이언트: 서비스를 사용하게 되는 컴퓨터, 요청하는 컴퓨터 / 서버 : 서비스를 제공하는 컴퓨터
  • IP주소 : 컴퓨터를 구별하는데 사용되는 고유한 값
  • URL : 검색 주소
  • 포트번호 : 외부의 다른 접속과 구별하기 위한 값
  • API : 요청과 응답의 데이터 형식에 대한 약속
  • 레트로핏
    👉 API 네트워크를 구현하기 쉽게하는 라이브러리
  • 레트로핏 Lib
 //레트로핏 라이브러리
    implementation 'com.squareup.retrofit2:retrofit:2.9.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
    implementation 'com.google.code.gson:gson:2.8.5'
  • 레트로핏 사용하기 좋은 사이트
  • [https://reqres.in/]
  • 레트로핏 구현

1) RetrofitService - interface

import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Query;

public interface RetrofitService {
 // url 주소에 ?는 쿼리스트링을 작성하겠다는 신호, 쿼리스트링은 사용자가 입력 데이터를 전달하는 방법중 하나이다.
    @GET("/api/users/")
    Call<Object> getUsers(@Query("page") int page);
}

2) RetrofitClient - class

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class RetrofitClient {

    private static final String BASE_URL = "https://reqres.in/";

    public static RetrofitService getApi(){
            return getInstance().create(RetrofitService.class);
    }

    private static Retrofit getInstance(){
        Gson gson = new GsonBuilder().setLenient().create();
        return new Retrofit.Builder().baseUrl(BASE_URL)
                .addConverterFactory(GsonConverterFactory.create(gson)).build();
    }
}

3) Main - class

import retrofit2.Call;

import java.io.IOException;

public class Main {
    public static void main(String[] args) {

           Call<Object>result = RetrofitClient.getApi().getUsers(2);

           try {
           //execute 하는 시점부터 요청!
               System.out.println(result.execute().body());
           }catch (IOException e){
               System.out.println(e.getMessage());
           }
    }
}

5. 느낀점⭐

1) Stream은 Collection, Array등의 조건이나 특정 상황에 직면했을 때 for ~ if 의 긴 코드를 간결하게 만들어준다.

2) 아직 레트로핏에 대한 이해가 잘 되지 않는다.

3) 레트로핏으로 Json타입의 데이터를 Url파싱을 통해 Response를 받아오는 것 같은데 JS의 Ajax와 차이를 모르겠다.. 내일 질문해야지..!

profile
기록하는 습관

0개의 댓글