- 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
}
}
👉 다양한 타입을 다루는 메소드가 컬렉션 클래스에서 컴파일시 타입 체크를 해주는 기능을 의미한다.
👉 객체의 타입을 컴파일 시에 체크하기 때문에 안정성이 높아진다.
- 제네릭스의 형식
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);
}
}
- 람다
👉 함수를 좀더 쉽게 표현하자 > {} 등.. 없이 해보자!
👉 문법이 간결하다 > 같은 코드를 또 작성해야 한다면 > 함수로 만들자..!
- 람다 예제
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());
}
}
- 클라이언트: 서비스를 사용하게 되는 컴퓨터, 요청하는 컴퓨터 / 서버 : 서비스를 제공하는 컴퓨터
- 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());
}
}
}
1) Stream은 Collection, Array등의 조건이나 특정 상황에 직면했을 때 for ~ if 의 긴 코드를 간결하게 만들어준다.
2) 아직 레트로핏에 대한 이해가 잘 되지 않는다.
3) 레트로핏으로 Json타입의 데이터를 Url파싱을 통해 Response를 받아오는 것 같은데 JS의 Ajax와 차이를 모르겠다.. 내일 질문해야지..!