190507 복습, 스레드


<데이터 읽고 쓰는 Target과 자료형의 종류!>

  1. (화면) 콘솔

    • 읽기

      • int asciiNum = System.in.read();

      • String str = br.readLine();

      • pulbic class System
        {
            pulbic static InputStream in;
            pulbic static PrintStream out;
            pulbic static PrintSream err;
        }
      • BufferedReader br;

      • BufferdReader생성자

        • BufferedReader ( Reader객체 ){}
      • br = new BufferdReader( new InputStreamReader(System.in) );

        • System.in 이 키보드 입력을 받고
        • InputStreamReader 에서 바이트스트림 => 문자 단위로 변환
        • BufferdReader 에서 변환된 문자들을 버퍼에 저장!
    • 쓰기

      • System.out.println(데이터);
      • System.out.print(데이터);
      • System.out.printf(데이터);
  2. JTextArea, JTextField

    • 읽기
      • JTextArea ta; JTextField tf;
      • ta.getText();
      • tf.getText();
    • 쓰기
      • ta.setText("문자열데이터");
      • ta.append("문자열데이터");
      • tf.setText("문자열데이터");
  3. File (==> (바이트단위) FileInputStream fis, (문자단위)FileReader fr, (바이트단위)FileOutputStream fos, (문자단위)FileWriter fw)

    • 읽기
      • int b = fis.read(바이트데이터);
      • int c = fr.read(문자데이터);
    • 쓰기
      • fos.write(바이트데이터);
      • fw.write(문자데이터);
      • fw.write(문자열데이터);

미션) Swing을 통해 SimpleNotePad를 만드시오

  • ta(JTextArea) 읽기 ===> 파일 쓰기 : 파일저장
  • 필요한 입출력 객체 FileOutputStream, FileWriter

<객체 직렬화> Serialization

  • 객체를 연속적인 데이터롤 변환하는 것(반대과정은 역직렬화라고 함)

  • 객체의 인스턴스변수들의 값을 일렬로 나열하는 것

    • 객체를 파일이나 네트워크에 전송하기 위해 바이트 형태의 데이터로 변환하는것
  • 객체를 스트림으로 파일에 저장하는 방법

  • transient키워드 : 객체 멤버변수중 직렬화 대상에 제외

    class Person
    {
        String name;
        int age;
        String job;
    }
    
    //=>> class Person [String name, int age, String job]
    • 관련 클래스) - 객체단위로 쓰고 읽자!
    • ObjectOutputStream ObjectInputStream
    • Serializable(마커 인터페이스)
package j0507;

import java.io.Serializable;

public class Person implements Serializable//객체 직렬화 하겠음! 이라는 체크를 해줘야 함. implements Serializable
{
    String name = "바보";
    int age = 13;
    transient String job = "학생"; // 직렬화 대상에서 제외 => 데이터값을 전달하지 않겠음.
}

//Person 객체를 파일에 쓸 수 있습니까? => ObjectOutputStream 사용!
package j0507;

import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class ObjectWriteTest //객체 쓰기 테스트
{


    public static void main(String[] args) throws Exception
    {
        FileOutputStream fos = new FileOutputStream("person.ser");
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Person p = new Person();

        Person p2 = new Person();
            p2.name = "이진주";
            p2.age = 1;
            p2.job = "강아지";

            oos.writeObject(p);
            oos.writeObject(p2);

            oos.writeObject("직렬화 하이~!");
            oos.writeInt(300);    
            oos.writeBoolean(true);

            oos.close();
            fos.close();

        System.out.println("객체 쓰기 성공~!");

    }
}
package j0507;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;

public class ObjectReadTest
{

    public static void main(String[] args) throws Exception
    {
        FileInputStream fis = new FileInputStream("person.ser");
        ObjectInputStream ois = new ObjectInputStream(fis);

        Person p = (Person) ois.readObject();
        System.out.println("이름 : " + p.name);
        System.out.println("나이 : " + p.age);
        System.out.println("직업 : " + p.job);
        System.out.println("========================");

        Person p2 = (Person) ois.readObject();
        System.out.println("이름 : " + p2.name);
        System.out.println("나이 : " + p2.age);
        System.out.println("직업 : " + p2.job);
        System.out.println("========================");
        System.out.println("메세지 :" + ois.readObject());
        System.out.println("정수 :" + ois.readInt());
        System.out.println("논리 :" + ois.readBoolean());

    }

}

<스레드> Thread

  • 프로세스내에서 순차적으로 동작하는 문장들의 단일 집합.
  • 경량(light weight)의 프로세스
  • 하나의 프로세스내에 다수개의 스레드를 정의할 수 있으며 다수개의 스레드를 동시에 수행 될 수 있다.(다중스레드)
  • 자바에서는 클래스(Thread)와 인터페이스(Runnable)지원

<스레드 개념>

void a()
{
    1;
    2;
    3;
}

void b()
{
    4;
    5;
    6;
}

void c()
{
    7;
    8;
    9;
}

//===main
a();
b();
c();
//일반메소드의 경우 a()메소드의 문장을 전체 실행해야 b()메소드 실행
//일반메소드의 경우 기다림, 순차적인 실행!
//[실행결과] 1;2;3;4;5;6;7;8;9;

//만약 a,b,c()메소드가 스레드라고 한다면 기다림없이, 동시에 실행!



//[실행결과] 1;4;7;5;2;8;9;3;6;

※스레드 객체 생성

class My extends Thread
{
    //스레드 특성 메소드(오버라이딩)
    public void run()
    {
          //동시(독립) 실행코드  
    }
}




//Thread t = new Tread();
//t.start():

class My2 extends JFrame implements Runnable
{
    public void run()
    {
        //동시실행코드
    }
}

//my2 my = new My2();
//m2는 스레드 객체? X
//m2는 Runnable객체? O
//별도의 Thread객체 생성이 필요.
    //Thread t2 = new Thread(run()메소드의 위치);
    //Thread t2 = new 
  • 위에서 t를 스레드 객체라고 한다!

문제) MainView 클래스 상단(North)에 현재시간 정보를 작성하시오

Thread.sleep( );

  • package j0507;
    
    public class MyThread extends Thread
    {
    
        //스레드 특성을 갖는 메소드 (동시실행)
        @Override
        public void run()
        {
            //동시 실행할(기다리지 않는) 문장들
            try
            {
                for(int i = 1; i< 11; i++)
                {
                    //Thread.sleep(1000);
                    System.out.println("자바스레드 : " + i);
                }
            } catch (Exception e)
            {
                e.printStackTrace();
            }
        }
    
    }//MyThread
    
  • package j0507;
    
    public class ThreadTest
    {
        public static void main(String[] args)
        {
            MyThread t = new MyThread();
    //        t.run(); //run()메소드를 직접 호출하는 일반메소드와 같은 실행을 해버림.
            t.start(); // start()메소드는 '스레드'작접 스케줄러라고 보면 된다.
        }
    }
    
궁금상자
- 왜 Thread는 Exception이 안될까? @Override때문!

+ Recent posts