IO
Steam<입력,출력> <문자, 바이트> <노트스트림, 필터스트림(보드스트림)>
노트스트림 : 소스의 젤 앞에 있는 것, 필터스트림은 노트스트림을 연결해서 사용
-직렬화
자바소스코드 => 외부 파일로 뽑아내기
외부 파일 => 자바 내부프로그램
시리얼라이즈를 구현해야 사용가능함.
arrays클래스 안에 fill메소드
<Mission1>-파일객체복사하기 -> 파일하나 복사
-CopyUtil
package Kosta.io;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class CopyUtil { //앞으로 모든 프로그램에서 한글은 배제
//byte값을 가진 파일을 복사
public static void copyFile(File source, File dest)throws Exception{ //예외 던질거야 main에서 처리하겠지~
//원본, 내용 & 예외 던지기, 파일객체 필요
int count = 0;
FileInputStream in = null; //byte배열 생성
FileOutputStream out = null; //byte배열 생성
byte[] arr = new byte[1000];
try {
in = new FileInputStream(source);
out = new FileOutputStream(dest);
while((count = in.read(arr)) != -1) { //다음배열의 내용이 아예 없을때까지
out.write(arr);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
if(in != null) {
in.close();
}
if(out !=null) {
out.close();
}
} catch (Exception e2) {
}
}
}
}
-Mission
package Kosta.io;
import java.io.File;
public class Mission {
public static void main(String[] args) {
// 1. 바이트스트림을 이용하여 파일 복사를 구현하세요
//파일객체 필요
String source = "C:\\JavaDev\\WorkSpace\\JavaProject\\src\\Kosta\\io\\CopyExam.java";
String dest = "C:\\JavaDev\\WorkSpace\\JavaProject\\src\\Kosta\\io\\CopyExam2.java";
try { //메인에서 예외처리해줌
CopyUtil.copyFile(new File (source), new File (dest));
} catch (Exception e) {
e.printStackTrace();
}
}
}
<Mission2>-파일까지만 경로지정
파일객체
파일클래스 file(디렉토리(폴더) 경로, 파일이름)
[x]file(source파일, dest파일) -> dest의 디렉토리가 안만들어졌으니
우리가 직접 복사를 원하는 dest의 경로를 지정해줘야 함.
String source = "C:\\JavaDev\\WorkSpace\\JavaProject\\src\\Kosta";
String dest = "C:\\JavaDev\\WorkSpace\\JavaProject\\src\\Kosta2";
//새로운 디렉토리를 생성하고 그 안에 모든 파일을 복사 ->재귀함수 사용
public static void copyDirectory(File source, File dest)throws Exception{
dest.mkdir(); //디렉토리생성
File[] file = source.listFiles(); //source에 있는 파일들을 가져와서 객체배열생성.
for(int i=0; i<file.length;i++) {
// File sourFile = fileList[i]; //파일객체를 하나 가져옴
if(file[i].isDirectory()) { //파일이 폴더가 있으면
File s_destfile = new File(dest, source.getName());
//새로 객체 dest에 source의 파일이름으로 만들어라
copyDirectory(file[i], s_destfile);//file[i] ->source , s_destfile ->dest
//kosta2에 kosta의 file[i]를 file하나 객체 만들어서 여기에 dest파일의 source.getName을 가져온 것을 만들어서 copyDirectory메소드에 이 생성된 객체를 반환함 s_destfile
}else {
File destfile = new File(dest, source.getName());
copyFile(file[i], destfile); //file[i] -> source, destfile -> dest
}
}
}
CopyUtil.copyDirectory(new File (source), new File (dest));//main메소드에 추가
-String 아니면 정규표현식으로 case만들기
미니 도스(DOS)를 만들어 보자.
>ls
=> 파일목록 출력
>cd kosta
=>디렉토리 이동
>cd..
=> 부모디렉토리 이동
>mkdir kosta
=> 새로운 디렉토리 생성
>cp /home/test
=>현재디렉토리에 /home/test에 있는 모든 파일 복사
->Kosta.io - DosMain
TowSum Solution (견인하다) ->map사용 n제곱 구현
정수 배열을 주고 두 숫자의 인덱스를 반환합니다.
각각의 입력이 정확히 하나의 솔루션을 가지고 있다고 가정 할 수있는
특정 타겟까지 합쳐질 수 있습니다.
동일한 요소를 두 번 사용할 수 없습니다.
Give an array of integers, return indices of the two numbers
such that they add up to a specific target
you may assume that each input would have exactly one solution,
and you may not use the same element twice.
->Algorithm - TowSumMain
18장.쓰레드
★★면접 프로세스 vs 쓰레드의 차이점을 이야기해보세요~
프로세스 : 실행프로그램의 단위, 실행 중인 프로그램
스레드 : 독립된 프로그램 내에서의 실행 흐름 하나 =>싱글스레드
실행흐름 여러개 -> 멀티스레드 : 동기식 프로그램
우리나라는 동기식(멀티스레드)프로그램만 사용함, 노드는 싱글(비동기식)
★★싱글스레드 vs 멀티스레드
★★면접 동기/비동기식 프로그램
노드 : 자바스크립트로 만든 서버(백엔드), 우리나라에서는 잘 안씀
자바스크립트 : 화면구성 <<<<구글스크립트
전세계 1위 스크립트 : 자바스크립트
멀티스레드 : 동시에 진행되는 것은 아니다.
*멀티스레딩의 장점
-CPU의 사용률을 향상시킨다(멀티코어환경- 멀티스레드 환경에서)
-자원을 보다 효율적으로 사용할 수 있다.
-사용자에 대한 응답성이 향상된다.
-작업이 분리되어 코드가 간결해진다.
한페이지내에서 프로그램을 작동한다 - 비동기식으로 병렬처리가 가능하다. ->★★최초는 에이작스Ajax
<멀티스레드 사용방법>
-Thread 클래스를 상속받기 //보통 thread클래스를 상속받으면 다른 클래스를 상속받을 수 없기 때문에
- Runnable 인터페이스 구현 //주로 Runnable 인터페이스를 구현해서 사용하고 이는 재사용성이 높고 코드의 일관성을 유지할 수 있기 때문에 객체지향적이다.
run 메소드 안에 스레드가 해야할 일을 명령문으로 써넣기.
Thread thread = new DigitThread(); 자식은 부모클래스가 될 수 있음 -> 오버라이딩 된 메소드 호출할 수 있겠네! // 부모 = new 자식 (Phoneinfo info = new Universe)
병렬작업은 cpu가 해줘야 함.
cpu
1.생성 -> 2. new -> 3. 기동(start) : 멀티쓰레드가 밥상 위에까지 올라갔다.
*쓰레드상태(통제하지 않으면 편식을 함) - 통제를 해주기 위해 멀티쓰레드를 배움
-Runnable 상태 : CPU가 왔다갔다하면서 실행해줌
-Not runnable상태 : 통제를 해주기 위해 하나를 빼서 이 상태로 만들어줌, sleepmethod1초후 다시 쉬었다 돌아감.
start이후 즉시 시작되는게 아니라 Runnable상태로 가서 기본실행조건이 되는 것이다.
sleep, join메소드 - 쓰레드 끝난후 결합해라
--예제
-MultithreadExample
package Kosta.thread;
public class MultithreadExample {
public static void main(String[] args) {
Thread thread = new DigitThread();
thread.start();
for(char ch = 'A'; ch <='Z'; ch++) {
System.out.print(ch);
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
-DigitThread
package Kosta.thread;
public class DigitThread extends Thread {
public void run() {
for(int cnt = 0; cnt<10; cnt++) {
System.out.print(cnt);
try {
Thread.sleep(1000);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
**Runnable 이용
Thread th = new SmallLetters();
th.start();
package Kosta.thread;
public class SmallLetters extends Thread implements Runnable {
@Override
public void run() {
char arr[] = {'ㄱ','ㄴ','ㄷ','ㄹ','ㅁ','ㅂ','ㅅ','ㅇ','ㅈ','ㅊ','ㅋ','ㅌ','ㅍ','ㅎ',};
for(char ch : arr)
System.out.print(ch);
try {
Thread.sleep(800);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
Aㄱㄴ0ㄷㄹㅁㅂㅅㅇㅈㅊㅋㅌㅍㅎ1B2C3D4E5FG67H8IJ9KLMNOPQRSTUVWXYZ
Mission
1~50까지의 합
51~100까지의 합
main쓰레드 a+b = sum
join()이용
-Sum5500
package Kosta.thread;
public class Sum5500 extends Thread {//sumMain함수임 강사님이 합5500이라했는데 합5050임..;_;
public static void main(String[] args) {
SumThread t1 = new SumThread(1,50);
SumThread t2 = new SumThread(51,100);
t1.start();
t2.start();
try { //try-catch문 없으면 중간중간 섞여서 잘못된 답 나올 수 있음.산출하기 전에 출력해서 오류가 뜸
t1.join();
t2.join();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("1~100까지의 합 : "+ (t1.getSum()+t2.getSum()));
}
}
1~100까지의 합 : 5050
-SumThread
package Kosta.thread;
public class SumThread extends Thread {
private int start;
private int end;
private int sum;
public SumThread() {}
public SumThread(int start, int end) {
super();
this.start = start;
this.end = end;
}
@Override
public void run() {
for(int i=start;i<=end;i++) {
sum +=i;
}
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getEnd() {
return end;
}
public void setEnd(int end) {
this.end = end;
}
public int getSum() {
return sum;
}
public void setSum(int sum) {
this.sum = sum;
}
}
-스레드간의 커뮤니케이션
산출하기 전에 출력해서 오류가 뜸 -> 스레드 실행 중 다른 스레드로 제어가 넘어가면 문제가 일어남
->while문으로 처리 ->결과나올때까지 계속 돌려야 하는 함정
-critical section의 동기화(synchronized) : 이 부분이 실행되는 동안 다른 스레드가 공유 데이터를 사용할 수 없도록 만드는 것.
동기화 블록 두개중 하나만 실행 - 공유객체를 기준으로 해서 동기화시켜줌.
보통 두개의 synchronized를 하나의 클래스에 넣음
=>두개 메소드를 하나의 클래스에 정의해주면 어디서 하나의 이 synchronized를 호출하면 다른 synchronized도 lock됨.
=> 안정성을 위해
wait(), notify(), notifyAll()
-Object에 정의되어 있다.
-동기화 블록내에서만 사용할 수 있다.(Synchronized블록 내에서만)
-보다 효율적인 동기화를 가능하게 한다.
-스레드간의 신호 전송
쓰레드간의 통신이 중요함! (빵사기)
-Main
-Bread
-Customer
-Manager
~~~~~~오늘의 정리~~~~---------
-
프로세스 VS 스레드
-
싱글스레드 VS 멀티스레드
-
동기식프로그램 VS 비동기식프로그램
-
멀티스레드 구현(스레드 상속, Runnable 구현)
-
스레드의 상태(Runnable, not Runnable상태)
-
공유객체가 일으킬 수 있는 오류 -> Critical Section을 예방하기 위한 synchronized 동기화 (1.블럭처리, 2. 메소드처리)
sleep() join() notify() wait()
월요일 -> 채팅 메신저 프로그램 : 스레드 사용
★★주말과제
-
복습
-
자료구조가 가장 중요함★(list)
-
IO 최소 사이즈 : 파일하나 read & write
-
미니도스만들기~~
-
TowSum Solution~~
-
빵 쓰레드 구현해보기
-
phoneinfo 완벽히마무리
'FULLSTACK > JAVA' 카테고리의 다른 글
JAVA 18차시 - Test , 호텔예약프로그램 (프로젝트) (0) | 2020.11.13 |
---|---|
JAVA 17차시 - 네트워크 통신 프로그래밍 (0) | 2020.11.13 |
JAVA 15차시 - 복습, 입출력(3가지 카테고리&파일클래스) (0) | 2020.11.12 |
JAVA 14차시 - 자료구조(list, map,set), 최초정렬(Comparable -> compareTo()), 정렬바꾸기(Comparator -> compare()) (0) | 2020.11.12 |
JAVA 13차시 - (자바API) 정규 표현식, 자료구조(ArrayList vs LinkedList) (0) | 2020.11.12 |