package Airplane;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

import com.google.gson.Gson;

import Airplane.FlightInfo;

public class FlightApp {

	public static int getTotalCount(String depAirportId, String arrAirportId, long depPlandTime) {
		try {
			// 1번 주소 객체 만들기
			URL url = new URL(
					"http://openapi.tago.go.kr/openapi/service/DmstcFlightNvgInfoService/getFlightOpratInfoList?serviceKey=TYJuOuhQd%2BPQB9hRLr96SDnMNeegd0U3g9mOpBpumr6DwZ6sgto5MjcX%2F8rUKaIKC3AHWmO4gTEHK39cCxwLug%3D%3D&numOfRows=50&pageNo=1&depAirportId="
							+ FlightInfoService.airPortId.get(depAirportId) + "&arrAirportId="
							+ FlightInfoService.airPortId.get(arrAirportId) + "&depPlandTime=" + depPlandTime
							+ "&_type=json");

			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));

			// FileWriter fr = new FileWriter("c:\\utils\\test.html"); //파일에 스트림을 연결한 것

			// 4번 문자 더하기 (중요)
			StringBuilder sb = new StringBuilder();

			String input = "";
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}

			System.out.println(sb.toString());
			System.out.println();

			br.close(); // 버퍼 닫기
			con.disconnect(); // 스트림 닫기

			// 5. 자바 오브젝트로 변환
			Gson gson = new Gson();
			FlightInfo flightInfo = gson.fromJson(sb.toString(), FlightInfo.class);

			return flightInfo.getResponse().getBody().getTotalCount();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	public static FlightInfo getFlightInfo(String depAirportId, String arrAirportId, long depPlandTime, int page) {
		// 1번 주소 객체 만들기
		try {
			URL url = new URL(
					"http://openapi.tago.go.kr/openapi/service/DmstcFlightNvgInfoService/getFlightOpratInfoList?serviceKey=BTERlPQquIzWPNPwhyG74H1Q%2FoDrHpnubL%2FXCu%2FHneA%2BYSKX%2FstOJrcTUGI7BZX%2BClPcZ8DgeT5h2SAfhqvr6w%3D%3D&numOfRows=50&pageNo="
							+ page + "&depAirportId=" + FlightInfoService.airPortId.get(depAirportId) + "&arrAirportId="
							+ FlightInfoService.airPortId.get(arrAirportId) + "&depPlandTime=20200407&_type=json");

			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();

			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));

			// FileWriter fr = new FileWriter("c:\\utils\\test.html"); //파일에 스트림을 연결한 것

			// 4번 문자 더하기 (중요)
			StringBuilder sb = new StringBuilder();

			String input = "";
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}

			System.out.println(sb.toString());
			System.out.println();

			br.close(); // 버퍼 닫기
			con.disconnect(); // 스트림 닫기

			Gson gson = new Gson();
			FlightInfo flightInfo = gson.fromJson(sb.toString(), FlightInfo.class);

			return flightInfo;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static void main(String[] args) {
		FlightInfoService.setAirLineId();
		FlightInfoService.setAirPortId();

		for (String key : FlightInfoService.airPortId.keySet()) {// 여기 airportid가 flightinfoservice에 있는 airportid임
			// keyset : 왼쪽에 있는 키값 다 뽑아줌
			System.out.print(key + " ");
		}
		System.out.println();
		System.out.println("출발지를 입력하세요.");
		Scanner sc = new Scanner(System.in);
		String depAirportId = sc.next(); // 김포

		System.out.println("도착지를 입력하세요.");
		String arrAirportId = sc.next();

		System.out.println("출발일자를 입력하세요.");
		String depPlandTimeTemp = sc.next();

		long depPlandTime = Long.parseLong(depPlandTimeTemp);
		Integer depPlandTimeInteger = Integer.parseInt(depPlandTimeTemp);
		Double depPlanTimeDouble = Double.parseDouble(depPlandTimeTemp);

		int page = 1;
		String strTemp = depPlandTime + "";
		String strTemp2 = depPlandTimeInteger.toString();
		String strTemp3 = depPlanTimeDouble.toString();

		int totalCount = getTotalCount(depAirportId, arrAirportId, depPlandTime);

		int count = 0;
		if (totalCount % 50 == 0) {
			count = totalCount / 50;
		} else {
			count = totalCount / 50 + 1;
		}

		ArrayList<FlightInfo> flightInfos = new ArrayList<>();

		for (int i = 0; i < count; i++) {
			FlightInfo flightInfo = getFlightInfo(depAirportId, arrAirportId, depPlandTime, page);
			page++;
			flightInfos.add(flightInfo);
		}

		for (FlightInfo flightInfo : flightInfos) { // 122개-3번
			List<Item> flightItems = flightInfo.getResponse().getBody().getItems().getItem();

			// iterable(반복)
			for (Item item : flightItems) { // foreach문
				System.out.println("항공사 : " + item.getAirlineNm());
				System.out.println("출발지 : " + item.getDepAirportNm());
				System.out.println("도착지 : " + item.getArrAirportNm());
				System.out.println("출발시간 : " + item.getDepPlandTime());
				System.out.println("도착시간 : " + item.getArrPl

 

 

for each문

 

for(타입 변수 : 컬렉션 원형)

끝까지 다 반복할 거면 for each문을 사용한다.

주소분석

1. http

2. IP 주소

3. port :80

4, endpoint

5. 상세주소

6. 쿼리스트링

공공데이터 서버의 주소를 알게된다.

컴퓨터와 서버를 Stream으로 연결한 후,

BufferReader로 정보를 읽는다

---> request

다운받은 데이터 타입은 String!

Json을 자바 오브젝트로 변경

1. json스키마

2. gson

Hashmap에 넣는 것이 좋음

(계속해서 변화가 X)

 

 

DNS

 

도메인 : 나만의 특정한 범위

이름

서버 : 도메인 네임의 값(정보를 가지고 있기 때문에)

1급객체 : 제일 바깥에 나올 수 있는 객체이다.

ex. class

* 자바스크립트는 모든게 다 1급객체이다

윗 데이터를 String으로 받고 있기 때문에 getFlightInfo 가 오류가 뜬다

String 타입을 바꿔줘야한다.(원래는 long으로 그냥 받으면 됨^^;)

타입을 바꿔주면 오류가 사라진다.

* int 타입으로 바꾸려면

이렇게 작성하면 된다.

이 것들을 문자화 시키려면

1. 묵시적 형변환

2.

int를 integer로 바꿔주고 String 타입으로 변경한다.


* 자바 컬렉션

* 이미지 출처 : https://www.crocus.co.kr/1553

 

Java에서 Collection이란?

Collection 이란? Collection 객체는 여러 원소들을 담을 수 있는 자료구조를 뜻한다 배열이 가장 기본적인 자료구조이며, DTO 또한 자료를 담는 하나의 방식이라고 볼 수 있다. 자바에서의 자료구조 유형은 다음..

www.crocus.co.kr

 

Queue

 

FIFO : First In First out

뺄때 First out

먼저 들어온거 먼저 출력

중간에 데이터를 빼낼 수 없다.

 

Set

 

중복이 없는 데이터이다.

중복된 데이터가 안 들어간다.

SortedSet : Set의 자식 / Set의 기능을 가지면서 정렬해준다.

List

* 커피숍만들기 포스트 참고

https://saludar.tistory.com/100?category=842509

 

Java - 커피숍만들기, Linked List, ArrayList, Generic

<커피숍 만들기> - 필요한 것 : 손님, 바리스타, 메뉴판(메뉴목록이라는 object가 들어있다), 커피 * 모든 object 는 생명력이 있다고 생각해야 한다. ㄴ 모든 오브젝트는 역할(부모)을 가진다. ㄴ역할(부모)을 가..

saludar.tistory.com

 

* stack : FILO​ (First In Last Out)

먼저 들어온 데이터가 가장 늦게 빠져나간다.

꺼내면서 메모리를 소멸시켜버림

메서드 내부는 전부 Stack 구조로 이루어져 있음


Hash

엄청 중요하다

* 컬렉션 아님 주의

https://medium.com/@elamachain/hash-%ED%95%B4%EC%8B%9C%EB%9E%80-3c7891b81dd3

 

HASH 해시란?

블록체인이란 거래내역 등의 데이터가 ‘블록’이라고 하는 저장환경에 저장되어 누구라도 임의로 수정할 수 없고 누구나 변경의 결과를 열람할 수 있는 데이터 위변조 방지 기술입니다.

medium.com

참고사이트

해시란 : 암호화 사이트이다.

어떤 문자열(크기가 없다)을 더 짧은 길이의 값으로 변경하는 것을 말한다.

방대한 내용의 문장도 짧은 몇 개의 문자로 표현이 가능하다.

해시의 특징

1. 어떤 문자열이든 고정된 크기로 암호화 할 수 있다.

긴문자이든 짧은 문자이든 고정길이 문자열로 변환된다.

2. 복호화 불가

(커지면 커질수록 값을 만들 수 있는 경우의 수가 너무 많기 때문에)

3. 해시는 충돌할 수 있다.

4. 진위여부를 판단할 수 있다.

(같은 암호를 입력하면 같은 값이 나오는데 조금만 수정되도 해시값이 다르게 나오니까)

5. 해시화 한 후 값으로 해시를 찾을 수 있다.

* 복호화가 안되는 이유 :

숫자가 하나 있다고 가정 --> 60

60을 약분하면 1, 2, 3,4, 5, 6, 10,12, 15, 20, 30, 60

끝의 수끼리 곱하면 60이 만들어짐

? X ? = 60

경우의 수가 많아지기 때문에

?에 무슨 값이 들어갔는지 복호화 하기는 쉽지 않음

 

package Airplane;

import java.util.HashMap;

public class HashEx01 {

	public static void main(String[] args) {
		HashMap<String, String> auth =
				new HashMap<>();
		
		// 값을 넣을 거임
		auth.put("아이디", "ssarmange");
		auth.put("비밀번호", "1234");
		
		System.out.println(auth.get("아이디"));
	}

}

 

 

key 값에 아이디를 추가하면 데이터를 덮어씌어 버린다.

 

결과값

a값이 있는지 찾는 코드

public static coid main(Stringp[] args){

String addr = "a";

}

if(addr.contains("a")){

system.out.print("있어요");

}else{

system.out.print("없어요");

}

 

 

 

'Java programing > 프로그래밍 언어 활용' 카테고리의 다른 글

Java - 스레드1, 익명클래스  (0) 2020.04.13
코로나 마스크 앱 만들기  (0) 2020.04.10
Java - OSI 계층  (0) 2020.04.07
Java - json  (0) 2020.04.06
Java - 접근지정자, 자바 입출력  (0) 2020.04.06
openclose