Thread

-프로세스(Process) : 실행중인 프로그램

-멀티 태스킹(Multi Tasking) : 프로세스를 동시에 여러개 처리하는 것.

-쓰레드(Thread) : 실행 쓰레드(Thread of execution)을 의미.

이런 실행 쓰레드가 여러 개가 동작할 경우를 멀티 쓰레딩이라고 한다.(실행 단위)

하나의 프로세스 안에서 여러 개의 실행 단위를 만들 수 있으며 이러한 실행 단위들을 쓰레드로 사용할 수  있으며

이것을 멀티 쓰레딩(동시 다발적으로 실행)이라고 한다.

 

 

Thread 사용하기 

 

1)java.lang.Thread 클래스 사용

 

Thread 클래스를 상속받은 후 해당 쓰레드에서 지원하고 싶은 코드를 run()메소드로 오버라이딩한다.

해당 클래스 인스턴스를 생성한 후 클래스 객체의 start()메소드를 호출한다. 

 

스레드 상속 -> 객체 생성 - > 오버라이딩

 

ex)

public class FirstThread extends Thread{
public void run(){
	while(true){
    	System.out.println("쓰레드 테스트 .." );
        }
     }
public static void main(String[] args){
	FirstThread thread = new FirstThread();
    thread.start();
    }
}

    

2) Runnable 인터페이스 사용

 

Runnable 인터페이스를 구현한 클래스를 정의하고 구현하고 싶은 코드를 run()메소드에서 오버라이딩 한다.

클래스 객체를 Thread 클래스 생성자의 매개변수로 넘겨서 새로운 쓰레드 객체를 만들고 그 객체에서 start()메소드를 호출한다.

 

클래스 정의 -> 인터페이스 임플리먼트 -> 객체 생성 -> new로 쓰레드를 생성하는데 생성자 중 Runnable인스턴스를 가질 수 있는 

생성자 오버로딩을 사용하면 스레드를 생성할 수 있다.

 

ex)

public class SecondThread implements Runnable{
public void run(){
	while(true){
    	System.out.println("쓰레드 테스트...");
    }
}
public static void main(String []args){
	SecondThread st = new SecondThread();
    Thread thread = new Thread(st);
    thread.start();
}
       

FileInputStream은 파일 시스템의 파일에서 입력 바이트를 얻는다. 

FileInputStream은 이미지 데이터와 같은 원시 바이트의 스트림을 읽기 위한 것으로 문자 스트림을 읽으려면

FileReader을 사용하면 된다.

 

다음은 저장한 텍스트 파일을 불러오는 코드이다.

package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;

public class IOEx5 {

	//파일에 문자 데이터 저장
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		//근원지와 목적지의 개념을 가지고 접근해야 함. 
		File file = new File("C:/IO/IOtest.txt");
		FileInputStream fis; //파일을 읽어들임
		int readByte;
		try {
			fis = new FileInputStream(file); //객체 생성해서 경로 넣어줌(파일의 근원지를 받음 - 목적지는 시스템 화면).
			while(true) { //전부 읽기위해 무한 루프
			//파일을 읽음
			readByte = fis.read(); //정수로 넘어오기 때문에  캐릭터로 변환시킴
			if(readByte == -1) {   //더이상 읽을것이 없으면 -1 반환 
				break;
			}
			System.out.print((char)readByte); //개행 기능이 없음.			
			}
			fis.close(); //파일을 닫음.
		}catch(IOException e) {
			e.printStackTrace();
		}
		
	
	}

}

File file = new File("C:/IO/IOTest.txt");로 텍스트 파일이 저장된 객체를 생성하고 

파일을 읽어들이는 FileInputStream fis 객체를 생성한다.  그 다음 파일 경로를 넣어주기 위한  fis = new FileInputStream(file); 객체를 생성해서 경로를 넣어준다.

 

int readByte로 데이터가 정수로 넘어오기 때문에 readByte = fis.read();로 캐릭터로 변환시키고 더 이상 읽을 것이 없으면 -1을 반환하며 while문을 빠져나온다. 마지막으로 불러온 파일을 꼭 닫아줘야 하기 때문에 close()로 파일을 닫는다. 

 

C:/IO/IOTest.txt 파일을 정상적으로 불러와 출력한 결과이다.

 


다음은 txt파일에 저장된 텍스트를 배열로 저장하여 출력하는 코드이다. 

package io;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.IOException;

public class IOEx6 {
	public static void main(String[] args) throws IOException {

		File file = new File("C:/IO/IOtest.txt");
		InputStream is = new FileInputStream(file); // 파일 경로 넣어줌.
		int readByteNo;
		byte[] readBytes = new byte[3]; // 파일에서 읽어온 걸 담는 역할
		String data = "";
		readByteNo = is.read(readBytes); // 다 읽어들여라.

		
		data += new String(readBytes, 0, readByteNo); // 배열에 있는 모든 값들을 읽어와서 문자열로 만들어라.
		System.out.print(data);
		is.close();
	}
}

아까와 마찬가지로 파일 경로가 있는 file객체를 생성해주고 FileInputStream is에 파일 경로를 넣어준다.

int readBytesNo;     //read()는 입력 스트림의 1바이트를 읽기 위한 메소드로 반환형이 int형이다.

byte[] readBytes = new bytes[3];  //파일에서 읽어온 걸 3크기를 갖는 readBytes[]에 담는다.

String data = "";     //다시 문자열로 변환하기 위해 String data를 선언하고 

readByteNo = is.read(readBytes);  //다 읽어 들인다.

 

그 다음

data += new String(readBytes, 0 ,readBytesNo); // 배열에 있는 모든 값들을 읽어와서 문자열로 만들고

System.out.print(data); //출력한다.

 

 

'JAVA' 카테고리의 다른 글

[JAVA] 쓰레드(Thread) -2  (0) 2020.10.03
[JAVA] 쓰레드(Thread) -1  (0) 2020.10.03
[JAVA] IO(InputStreamReader / BufferedReader) (2)  (0) 2020.10.01
[JAVA] IO(Input / output) (1)  (0) 2020.10.01
[JAVA] Exception - 예외 처리(1)  (0) 2020.09.24

InputStreamReader / BufferedReader

1) InputStreamRedaer

 

-InputStreamReader는 바이트를 읽고 지정된 문자 집합을 사용하여 문자로 해독한다.

즉 InputStreamReader는 바이트 단위로 읽어 들여 InputStream을 통해 데이터를 문자 단위로 읽어 들이는 방식으로 변형한다는 의미이다.

 

ex)

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

 

InputStreamReader docs설명

2)BufferedReader

 

-BufferedReader는 단어 뜻 그대로 버퍼를 읽는다.

즉 InputStream에서 데이터를 읽고 문자, 배열 등을 효율적으로 읽을 수 있다. 많은 데이터를 읽어야 할 상황에 적합하다고 볼 수 있다.


package io;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;

//네트워크에서 사용 - 다양한 객체 활용 가능(포장되지 않은 상태) 
public class IOEx4 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		InputStream is = System.in;
		InputStreamReader isr = new InputStreamReader(is);  //InputStreamReader-필터 스트림(문자열 데이터를 활용한다고 했을 때 )
		BufferedReader br = new BufferedReader(isr);  //Reader 문자열에 관련된 입력장치	
		String data = "";
		while(true) {
			System.out.print("문자열 입력 : ");
			try {
				data = br.readLine();
			}catch(IOException e) {
				e.printStackTrace();
			}
			if(data.equals("end")) {
				System.out.println("프로그램 종료");
				break;
			}
			System.out.println("입력한 데이터는 : " + data + "입니다.");
		}
		
	}
}

InputStream은 자바의 내장 함수로서 System.in 객체를 포함하고 있다.  키보드로 문자를 입력받기 위해 System.in을 사용하고 키보드로 입력한 값에 대한 InputStream 객체를 얻을 수 있다. 이 객체를 통해 InputStreamReader 객체를 생성하는데 사용되고 이어서 BufferedReader의 버퍼에 저장해 놓았다가  readLine() 메소드를 통해 한 줄을 한번에 읽어 들이게 되는 것이다.

용어

-스트림 : 일반적으로 데이터, 패킷 등의 일련의 연속성을 갖는 흐름을 의미한다.

(흐르는 데이터 - 물의 흐름)

 

-입.출력 스트림 : 데이터를 읽고 쓰는 구조를 프로그램의 구조로 모델링 해놓은 것.

 

-버퍼 : 데이터를 임시적으로 담아두는 공간

 

자바의 입출력 스트림 개념

:단 방향으로 흐르며(진행되며) 버퍼를 가질 수 있다. 자바의 입출력 스트림은 FIFO(First In First Out)의 구조를 갖는다.

또 문자(Character Stream) , 바이트(Byte Stream)으로 분류한다.

 

 

문자(Character Stream)문자 최상위 스트림

 

-Reader Class(입력 스트림)

:문자 데이터를 읽어 들이는 스트림.

 

-Writer Class(출력 스트림)

:문자 데이터를 출력하기 위한 스트림.

 

바이트(Byte Stream)바이트 최상위 스트림

 

-InputStream Class(입력 스트림)

:바이트 데이터를 읽어 들이는 스트림.

 

-OutputStream Class(출력스트림)

:바이트 데이터를 출력하기 위한 스트림.

 


 

package io;

import java.io.IOException;

public class IOEx2 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		int b = 0 , count = 0;
		try {
			b = System.in.read();
			//Ctrl + z 가 아니면 무한 반복
			//문자 하나를 연속적으로 입력받는다.
			while(b != -1) {
				System.out.print((char)b);
				b = System.in.read();
			}
		}catch(IOException e) {
			e.printStackTrace();
		}
		//문자를 입력받아 문자열로 (여러 문자를 입력 받을 수 있도록)흉내
		System.out.println("\n byte InputStream Test.... total byte : "  + count);
	}
}

 

이 코드는 InputStream 클래스의 read()메소드를 이용해서 문자 하나하나를 연속적으로 입력 받아 마치 문자열로 받는 것처럼 흉내내는 코드이다. 

 

Apple을 입력하면 내가 입력한 문자 : A부터 내가 입력한 문자 : e 까지 반복해서 출력한다.

 

 

 

 

 

 

 

 


 

package io;

import java.io.IOException;

//배열을 문자열로 읽기
public class IOEx3 {

	public static void main(String[] args) {
		byte b[] = new byte[20]; //문자 담을 배열 공간 확보(버퍼처럼 활용)
		System.out.print("입력 : ");
		char c = ' ';
		try {
			//0번부터 5까지 입력받아라
			System.in.read(b, 0 ,5);
		}catch(IOException e) {
			e.printStackTrace();
		}
		System.out.print("출력: ");
		//0번부터 5까지 출력해라
		System.out.write(b, 0, 5);
		System.out.println();
 	}

}

 

 

다음은 배열을 문자열로 읽는 코드이다.  크기 20만큼 byte라는 이름을 갖는 배열을 선언하여 이 배열을 버퍼처럼 활용하면서 문자열을 입력받아 출력한다. 자바 docs 도움말을 보면 input stream에서 최대 bytes의 길이만큼 데이터를 읽을 수 있다고 나와있다. 

System.in.read(b,0, 5)는 배열 b를 인덱스 0 부터 5까지 입력 받으라는 뜻이고

System.out.write(b, 0 ,5)도 마찬가지로 

배열 b를 0부터 5까지 출력하란 뜻이 된다. 

Hello World!를 입력하게 되면 배열 b에는 Hello만 저장되게 되고 출력하면 Hello가 출력되는 것을 확인할 수 있다.

 

Exception

-키보드 입력, 파일 처리, 네트워크 처리, DB처리 등 외부와의 작업을 하는 경우

예의치 못한 에러가 발생할 수 있으므로 자바에서는 반드시 예외처리를 하도록 하고 있다.

 

예외 처리 방법1

: try - catch는 보통 명확환 오류일 때 사용하며, 다중 catch가 가능하다.

 

		try {
		//예외발생 지역
		//실행코드 1
		//int c = System.in.read(); - 예외 발생 (예외 발생 시 밑에 코드 실행 안함)
		//실행코드 3
		}catch(Exception e) {
			//예외 처리 지역
		}finally {
			//반드시 실행하는 지역(예외가 발생하던 안하던 반드시 실행)
			//
		}

 

 

public class ExceptionEx2 {
		// TODO Auto-generated method stub
		String str = "";
		public void foo(int i) {
			try {
				if(i == 1) {
					throw new Exception(); //고의적 예외 발생(밑으로 내려가지 않는다.)
				}
				str += "1"; 
			}catch(Exception e) {
				str += "2";
				return; //메소드를 빠져나감(함정)
			}finally {        //finally 반드 실행한다.
				str += "3";
			}
			str+= "4";
		}
		public static void main(String[] args) {
			ExceptionEx2 ee = new ExceptionEx2();
			ee.foo(0);
			ee.foo(1);
			System.out.println(ee.str);
		}
}

인자 0을 갖는 foo가 먼저 실행되어 처음으로 try문을 만나는데

if문에 해당되지 않으므로 str +="1"을 실행한다. 예외가 발생하지 않았으므로 catch문을 건너뛰고 반드시 실행되는 finally를 만나 str += "3";을 실행한다. 그 다음 str +="4"를 실행하고 빠져나온다. 다음 인자 1을 갖는 foo를 실행하게 되면 if(i == 1) 조건에 일치하므로 고의적으로 발생시킨 예외를 만나게 된다.

예외가 발생하면  str+="1"은 실행하지 않고 건너뛰어 catch문으로 가게되는데 str+="2";를 수행하고 반드시 실행되는 finally를 만나 13423이 출력되게 된다.

Random

-Random Object는 일련의 난수를 생성한다.

이렇게 생성된 Random Object는 int type, float type 등의 난수가 발생 가능하며

정수형 난수 발생은 특정 범위가 없다. 하지만 부동소수점을 갖는 실수형 난수들의 

난수는 0.0 에서 1.0 사이의 값을 받는다.

 

Random Object를 생성할 수 있는 생성자

Ex)

 

1. Random ran = new Random();

    int su1 = ran.nextInt(3);

 

2. Math class 기능으로 난수를 사용

    int su2 = (int)(Math.random() * 3);

 

import java.util.Random;

public class RandomEx {

	public static void main(String[] args) {
		Random ran = new Random();
		//float 0.0에서 1.0범위
		float a = ran.nextFloat();
		System.out.println("float형 난수 : " + a);
		
		//int n범위
		int b = ran.nextInt(3);
		System.out.println("int형 난수 : " + b);
		
		
		//Math class
		int c = (int)(Math.random()* 3);
		System.out.println("Int형 난수2 : " + c);
		
	}

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

import java.util.*;

public class RandomEx2 {
	public static void main(String args[]) {
		Random ran = new Random();
		Scanner sc = new Scanner(System.in);
		int me, com;
		
		System.out.println("무엇을 내시겠습니까? \n1.가위 \n2.바위 \n3.보 \n1~3의 값을 입력하세요 ->" );
		me = sc.nextInt();
		com = ran.nextInt(3)+1; // 1~3	
		if(com == 1 ) {
			System.out.println("컴퓨터는 가위를 냈습니다.");
		}else if(com == 2) {
			System.out.println("컴퓨터는 바위를 냈습니다.");
		}else {
			System.out.println("컴퓨터는 보를 냈습니다.");
		}
		int result = (me - com + 3) %3;
		switch(result) {
		case 0:
			System.out.print("비겼습니다.");
			break;
		case 1:
			System.out.print("이겼습니다.");
			break;
		case 2:
			System.out.print("졌습니다.");
			break;
		}
	}
}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

/*
  로또 게임 만들기
  조건
  1) 1 ~ 45 숫자 중 6개 난수 발생
  2) 6개 난수 중 중복 X
 */
import java.util.*;

public class RandomEx3 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Random ran = new Random();

		int num[] = new int[6];
		for (int i = 0; i < num.length; i++) {
			num[i] = ran.nextInt(45)+1;
			for(int j=0; i<j; j++) {
				if(num[i] == num[j]) {
					num[j] = ran.nextInt(45)+1;
					j= -1;
				}
			}
			System.out.println("로또 번호 : " +num[i]);
		}
	}
}

'JAVA' 카테고리의 다른 글

[JAVA] IO(Input / output) (1)  (0) 2020.10.01
[JAVA] Exception - 예외 처리(1)  (0) 2020.09.24
[JAVA] 콜렉션 (Collection / 제네릭(Generic)  (0) 2020.09.22
[JAVA] 콜렉션-Collection  (0) 2020.09.22
[JAVA] Wrapper클래스  (0) 2020.09.22

+ Recent posts