ArrayList - 동시접근해서 데이터가 꼬일 수 있다

Vector - 동시접속자를 큐에 저장하고 임계구역으로 만들어 여러사람이 동시에 들어오면 순서대로 처리한다 

-----------------------------

모스키토 통신

mqtt

유튜브 퍼블리셔를 구독자가 구독하면

퍼블리셔와 구독자가 통신을 하는데

퍼블리셔는 업로드만 하면 구독자에게 메시지가 가게 된다

구독+업로드 만으로 통신이 연결되는 방식

 

유튜브에서 유래된 방식

 

우리나라 표준 통신으로 바뀔 예정 (국제적으로도 유행)

-----------------------------

브로드 캐스트 통신

와이파이와 같이 모든 곳에 뿌리고 받는사람이 선택해서 받는 방식

------------------------------

블루투스 통신

기본적으로 1:1방식 

메시 네트워크라는 방식으로 브로드 캐스트 통신처럼 사용가능
- 페어링을 위한 브로드캐스트인데 그것에 메시지를 담는 것 (페어링 없이 다대다 통신)

-----------------------------

소켓통신

프로토콜이 없다.(약속이 없다)

*만약 소켓통신에 약속을 달면 (지그비, HTTP) 등의 통신을 할 수 있다

 

Socket -> OS가 들고 있다

OS가 들고 있는 것을 빌려 쓰는 것을 시스템콜이라고 한다

클라이언트와 서버는 포트를 가지고 있다 - 이 포트를 소켓이라고 한다 - 0~65536

(클라이언트, 서버) 서로 포트번호가 같을 필요는 없다

스트림을 연결하고 버퍼드리더, 버퍼드라이터만 이용하면 통신가능하다

 

멀티프로세싱 - 프로세스 여러개가 동시에 작동해서 작업을 빨리 수행 하는 것
(1개의 프로세스가 3가지 작업을 15초에 할 수 있는데 3개의 프로세스로 나누어 작업하여 5초만에 할 수 있다)

멀티프로세싱 할 경우 cpu가 여러개 있으면 좋다 (병렬처리 가능)

프로그램이 멀티코어를 지원 할 경우에만 멀티프로세싱을 사용 할 수 있다

--------------------------------------

쓰레드

일을 실행하는 단위

일종의 스택

멀티스레드 - 라운드로빈 - 타임슬라이싱 -  일을 시간을 쪼개서 돌아가면서 함

스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.

https://ko.wikipedia.org/wiki/%EC%8A%A4%EB%A0%88%EB%93%9C_(%EC%BB%B4%ED%93%A8%ED%8C%85)

 

스레드 (컴퓨팅) - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 두 개의 스레드를 실행하고 있는 하나의 프로세스. 스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다. 프로세스와 스레드의 비교[편집] 멀티프로세스와 멀티스레드는 양쪽 모두 여러 흐름이 동

ko.wikipedia.org

 

문맥교환(컨텍스트 스위칭 context swiching)

여러가지 일을 시간을 쪼개서 돌아가면서 계속 하는 것

 

장점

1. 사람의 눈에 동시에 일을 하는 것 처럼 보임
2. 서버에서 그림 등의 데이터를 받는 등의 대기시간에 cpu가 다른 일을 할 수 있다

 

단점

1. 순서와 위치를 기억해야하기 때문에 느려짐 (컨텍스트 스위칭)

 

자바에는 기본적으로 main스택이라는 스레드를 가지고 있다

main스레드 이외의 스레드를 Target

Runnable 타입의 클래스 안에 run()메서드가 있고 그 스레드는 Target이 될 수 있다

 

스레드는 OS가 들고 있다 (윈도우 등)

OS에 스레드를 더 실행해달라고 요청해야 한다. (Runnable타입으로)

OS는 램에서 Runnable 타입의 힙을 찾고 run() 메서드를 실행한다 - 콜백

--------------------------------------

OS가 들고 있는 기능을 사용하는 것을 시스템 콜이라고 한다

--------------------------------------

IPC

데이터 통신을 할려면 시리얼라이즈를 해야한다 - 데이터 직렬화 - 직렬화는 마샬링의 일부

마샬링 - 프로세스간 데이터 통신할 때 데이터를 다른 프로세스가 읽을 수 있게 직렬화 하는 것
(클래스를 다른 곳으로 전송하면 String타입으로 전송되는데 그것을 다시 클래스로 만드는 등)

------------------------------------

콜백

스레드가 메인 스레드에 이벤트를 전송

다른스레드가 종료 된것을 메인 스레드에 보냄

-----------------------------------

데이터베이스에서 동기화

데이터가 일치

------------------------------------

프로세스에서 동기화

동기적 - 일의 순서가 일치해서 순서대로 실행됨

비동기적 - 일의 순서가 나뉘어서 여러개 실행됨

비동기 처리 - promise

비동기에서는 나중시간에 약속된 기능이 있다면

그 시간과 겹치는 앞쪽에 기능이 새로 추가 된다면 앞쪽기능이 실행되다가

약속된 기능이 실행된 뒤 나머지 앞쪽 기능이 실행된다

-------------------------------------

자바에서는 매개변수에 함수를 못넘기기 때문에
클래스를 만들어서 오브젝트를 매개변수로 넘겨서 그 안에 생성했던 함수를 이용한다
-> 익명클래스의 사용 이유

----------------------------------

익명클래스

 

 

 

 

 

 

익명클래스로 스레드 추가도 가능

 

 

 

 

 

 

 

야매

 

해결

 

 

 

클래스는 여러 자료를 담을 수 있는 자료형이다.

 

명함이라는 클래스 자료형

 

명함이라는 클래스로 만든 인스턴스

 

기본자료형과 클래스자료형의 차이

기본자료형(예를들어 int 등)은 int a = 1; 이라고 만들면 a 에 1이라는 숫자가 들어간다.

하지만 클래스자료형은 명함 m1 = new 명함(); 이라고 만들면
m1에 데이터가 아닌 그 데이터를 가리키는 주소가 들어간다.

위에서 생성한 m1명함 m2 = m1; 이런식으로 m2에 넣는다고 하더라도
데이터가 들어가는 것이 아닌 주소가 들어가게 된다.

즉 아래와 같이
기본자료형반환() 이라는 함수를 호출하여 반환된 값을 출력해보면 값이 나오지만,
클래스자료형반환() 이라는 함수를 호출하여 반환된 값을 출력해보면 해당 데이터의 주소가 나온다.
(컴퓨터에 따라 주소가 아니라 인스턴스의 내용이 대괄호 안에 나올 수 있다.)

 

 

package ch13;

class A {
	int a = 10;
}

public class Test {
	
	static void sample(A a) {
		System.out.println(a.a);
	}
	
	
	public static void main(String[] args) {
		
	// 기본자료형은 데이터 자체를 저장한다
	int a1 = 10;
	int a2 = a1;
	
	a1 = a1 + 10;
	System.out.println(a1);
	System.out.println(a2);
	
	
	// 클래스자료형은 인스턴스의 주소값을 저장한다
	A test = new A();
	A test1 = test;
	
	test.a = test.a + 10;
	System.out.println(test.a);
	System.out.println(test1.a);
	
	
	// 서로 다른 인스턴스 이기 때문에 데이터가 따로 계산된다
	A test2 = new A();
	A test3 = new A();
	
	test2.a = test2.a + 10;
	System.out.println(test2.a);
	System.out.println(test3.a);
	}
}

 

순서

공공데이터 링크확인
http://json.parser.online.fr/ 으로 JSON구조확인하기
http://www.jsonschema2pojo.org/ 으로 Class파일 쉽게 만들기
Gson으로 Json -> 자바객체 전환하기
이용하기

 

먼저 공공데이터 링크를 확인한다

 

http://json.parser.online.fr/ 으로 JSON구조확인하기

위 사이트는 json을 보기쉽게 해준다 (자바에서 이용할때 참조)

 

http://www.jsonschema2pojo.org/ 으로 Class파일 쉽게 만들기

위 사이트에 json을 붙여넣고 아래와 같이 설정을한뒤
preview를 한다

 

package mask;

import java.util.List;

public class MaskInfo {

	private long count;
	private String page;
	private List<StoreInfo> storeInfos = null;
	private long totalCount;
	private long totalPages;

	public long getCount() {
		return count;
	}

	public void setCount(long count) {
		this.count = count;
	}

	public String getPage() {
		return page;
	}

	public void setPage(String page) {
		this.page = page;
	}

	public List<StoreInfo> getStoreInfos() {
		return storeInfos;
	}

	public void setStoreInfos(List<StoreInfo> storeInfos) {
		this.storeInfos = storeInfos;
	}

	public long getTotalCount() {
		return totalCount;
	}

	public void setTotalCount(long totalCount) {
		this.totalCount = totalCount;
	}

	public long getTotalPages() {
		return totalPages;
	}

	public void setTotalPages(long totalPages) {
		this.totalPages = totalPages;
	}

}
package mask;

public class StoreInfo {

	private String addr;
	private long code;
	private double lat;
	private double lng;
	private String name;
	private String type;

	public String getAddr() {
		return addr;
	}

	public void setAddr(String addr) {
		this.addr = addr;
	}

	public long getCode() {
		return code;
	}

	public void setCode(long code) {
		this.code = code;
	}

	public double getLat() {
		return lat;
	}

	public void setLat(double lat) {
		this.lat = lat;
	}

	public double getLng() {
		return lng;
	}

	public void setLng(double lng) {
		this.lng = lng;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

}

 

Gson으로 Json -> 자바객체 전환하기

 

이용하기

package mask;

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

import com.google.gson.Gson;

public class MaskApp {

	public static long maskPage() {
		try {
			// 1번 주소 객체 만들기
			URL url = new URL("https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=1");

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

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

			// 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();
			MaskInfo mask = gson.fromJson(sb.toString(), MaskInfo.class);
			long count = mask.getTotalPages();

			return count;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return 0;
	}

	public static MaskInfo maskInfo(int page) {
		try {
			// 1번 주소 객체 만들기
			URL url = new URL("https://8oi9s0nnth.apigw.ntruss.com/corona19-masks/v1/stores/json?page=" + page);

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

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

			// 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();
			MaskInfo mask = gson.fromJson(sb.toString(), MaskInfo.class);

			return mask;
		} catch (Exception e) {
			e.printStackTrace();
		}

		return null;
	}

	public static void main(String[] args) {
		System.out.println("지역을 입력하세요");
		Scanner sc = new Scanner(System.in);
		String loc = sc.nextLine();

		List<StoreInfo> test = maskInfo(1).getStoreInfos();

		maskInfo(1).getStoreInfos().get(0).getAddr();

		ArrayList<MaskInfo> maskInfoList = new ArrayList<>();

		for (int i = 1; i < 1 + 1; i++) { // maskPage() 넣어야함
			MaskInfo mask = maskInfo(i);
			maskInfoList.add(mask);
		}

		for (MaskInfo maskInfo : maskInfoList) {
			for (int i = 0; i < maskInfo.getStoreInfos().size(); i++) {
				if (maskInfo.getStoreInfos().get(i).getAddr().contains(loc)) {
					System.out.println(maskInfo.getStoreInfos().get(i).getAddr());
					System.out.println(maskInfo.getStoreInfos().get(i).getName());
					System.out.println();
				}
			}
		}
	}
}

 

패키지명 : 패키지 이름을 적는다

클래스이름 : 클래스이름을 마음대로 적는다

나머지 사항도 원하는 것만 체크한다

1. Auto activation triggers for java에 .뒤에 모든 영어를 붙인다

2. Disable insertion triggers except 'Enter' 를 체크한다(엔터 칠때만 자동완성)

먼저 공공데이터 사이트에서 위와같이 설정하고 미리보기를 한다

미리보기 창이 뜨면 해당 주소를 모두 복사한다

주소 맨뒤에  &_type=json을 붙이고 검색해본다

 

코드 이용꿀팁

해당 코드들을

http://json.parser.online.fr/

사이트에 붙여넣어본다

 

같은 코드를 아래 사이트에도 붙여넣기하여

http://www.jsonschema2pojo.org/

package이름을 설정하고

class이름도 설정한다

나머지 설정도 아래와 같이하고

preview를 누른다

 

아래와 같이 뜨면

Air.java / Body.java 등의 파일을 만들어서 각각 붙여넣는다

 

아래와 같이 생성하고 붙여넣으면된다

 

 

Item.java파일에서 몇가지를 수정한다

 

gson이용하기

클래스 생성은 끝났다
Json자료를 gson을 이용하여 클래스에 자료를 집어 넣어서 인스턴스를 생성한다

"여기에 주소를넣으세요" 부분에 &_type=json을 붙인 주소를 넣는다

package ch15;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("여기에 주소를넣으세요");

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

HTTPURL 스트림을 연결한다

package ch15;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("여기에 주소를넣으세요");
			
			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

버퍼를 연결한다

package ch15;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("여기에 주소를넣으세요");
			
			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			
			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

StStringBuilder를 넣는다 StringBuilder는 String을 배열로 저장하여 나중에 한번에 출력하게 해준다

package ch15;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("여기에 주소를넣으세요");
			
			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			
			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			
			// 4번 StringBuilder는 ArrayList<String>과 비슷하다
			// append로 String을 저장한뒤 호출하면 쭉 읽는다
			StringBuilder sb = new StringBuilder();
			String input = "";
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

while문으로 StringBuilder타입의 sb에 데이터를 넣는다

package ch15;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("여기에 주소를넣으세요");
			
			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			
			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			
			// 4번 StringBuilder는 ArrayList<String>과 비슷하다
			// append로 String을 저장한뒤 호출하면 쭉 읽는다
			StringBuilder sb = new StringBuilder();
			String input = "";
			
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}
			System.out.println(sb.toString());
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

gson을 이용하여 Air타입의 인스턴스 만들기

package ch15;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("여기에 주소를넣으세요");
			
			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			
			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			
			// 4번 StringBuilder는 ArrayList<String>과 비슷하다
			// append로 String을 저장한뒤 호출하면 쭉 읽는다
			StringBuilder sb = new StringBuilder();
			String input = "";
			
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}
			System.out.println(sb.toString());
			
			// gson을 이용하여 Air타입의 인스턴스 만들기
			Gson gson = new Gson();
			
			Air air1 = gson.fromJson(sb.toString(), Air.class);
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

아래와 같이 뜨면 성공

 

테스트

package ch15;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;

import com.google.gson.Gson;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("여기에 주소를 입력하세요");
			
			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			
			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			
			// 4번 StringBuilder는 ArrayList<String>과 비슷하다
			// append로 String을 저장한뒤 호출하면 쭉 읽는다
			StringBuilder sb = new StringBuilder();
			String input = "";
			
			while ((input = br.readLine()) != null) {
				sb.append(input);
			}
			System.out.println(sb.toString());

			// gson을 이용하여 Air타입의 인스턴스 만들기
			Gson gson = new Gson();
			
			Air air1 = gson.fromJson(sb.toString(), Air.class);
			
			// 테스트해본다
			System.out.println("항공사 : " + air1.getResponse().getBody().getItems().getItem().get(0).getAirlineNm());
			
		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

 

 

 

 

1번 주소 객체 만들기

2번 스트림 연결

IMalformedURLException 은 IOException의 자식
IOException 은 Exception의 자식이기때문에 catch매개변수의 타입을 바꿔준다(나중에도)

 

 

3번 버퍼연결

4번 StringBuilder

package ch15;

import java.io.BufferedReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

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

		try {
			// 1번 주소 객체 만들기
			URL url = new URL("https://www.naver.com");

			// 2번 스트림 연결
			HttpURLConnection con = (HttpURLConnection) url.openConnection();
			
			// 3번 버퍼연결(문자열)
			BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream(), "UTF-8"));
			
			// 파일에 스트림 연결하기
			// 파일 작성기 인스턴스
			// 생성하는 순간 html 파일이 생성된다
			FileWriter fw = new FileWriter("C:\\utils\\test.html");
			
			// 4번 StringBuilder는 ArrayList<String>과 비슷하다
			// append로 String을 저장한뒤 호출하면 쭉 읽는다
			StringBuilder sb = new StringBuilder();
			String input = "";

			while ((input = br.readLine()) != null) {
				System.out.println(input);
				sb.append(input);
			}
			
			
			// toString() 모든데이터를 문자화 함
			fw.write(sb.toString());

		} catch (Exception e) {
			e.printStackTrace();
		}

	}
}

 

네이버의 html 내용이 출력된다

 

+ Recent posts