728x90

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(destsource.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

 

 


~~~~~~오늘의 정리~~~~---------

  1. 프로세스 VS 스레드

  2. 싱글스레드 VS 멀티스레드

  3. 동기식프로그램 VS 비동기식프로그램

  4. 멀티스레드 구현(스레드 상속, Runnable 구현)

  5. 스레드의 상태(Runnable, not Runnable상태)

  6. 공유객체가 일으킬 수 있는 오류 -> Critical Section을 예방하기 위한 synchronized 동기화 (1.블럭처리, 2. 메소드처리)

            sleep() join() notify() wait()

 

월요일 -> 채팅 메신저 프로그램 : 스레드 사용

 

★★주말과제

  1. 복습

    1. 자료구조가 가장 중요함★(list)

    2. IO 최소 사이즈 : 파일하나 read & write

  2. 미니도스만들기~~

  3. TowSum Solution~~

  4. 빵 쓰레드 구현해보기

  5. phoneinfo 완벽히마무리

 

 

 

 

 

 

 

 

728x90

+ Recent posts