관리 메뉴

JIHYUN JEONG

[java] 엄마도 이해하는 자바 기본 6일차 (1) 본문

Information Technology/Java

[java] 엄마도 이해하는 자바 기본 6일차 (1)

StopHyun 2013. 2. 19. 11:35

□ 복습시간

 - Thread 

  : 프로세스 내의 개별적인 실행 흐름

  : 프로세스는 프로그램 실행에 필요한 자원과 thread로 구성

  : 모든 프로세스는 최소 하나 이상의 thread가 존재해야 실행 가능


- Thread 생성방법 1. Class

class Test extends Thread{}
Test t = new Thest();
t.start();


- Thread 생성방법 1. Runnable interface 구현

class Test2 implements Runnable{}
Test2 t2 = new Test();
Thread thread = new Thread(t2)
thread.start();


- Thread Synchronization

 : 다수의 thread가 공유 데이터에 접근해서 작업할 경우 thread간의 간섭 현상이 발생

 : 이를 방지하기 위해 thread간에 동기화(synchronization)를 시켜줌 → 일종의 l


- Vector 로 만들때는 이미 동기화 되어 있는 상태라 Thread가 동시에 되지 않음 (속도 면에서 약간 느림)

- ArrayList는 처음부터 lock 이 걸려 있지 않음, Thread가 동시에 됨

 → Vector보단 ArrayList를 사용하라


[ArrayList Synchronization ]


ArrayList <String> list = new ArrayList<String>( );

List.add( );

Synchronized(list) {  };



□ Stream

 : 일련의 데이터를 이동시키는 입출력 파이프 혹은 그 데이터


- 입출력 Stream

 * 입력파이프 : 외부에서 데이터가 들어오는 파이프

 * 출력파이프 : 프로그램에서 데이터가 나가는 파이트


※ Stream을 통해 이동이 될때 코드값이 이됭됨



- Stream 종류

 

구분 

Stream 종류 

입력용/출력용

InputStream

OutputStream 

 입출력 단위

(char [2byte] / byte [1byte] )

Character Stream

Byte Stream 

 데이터 입출력 방법

(직/간접)

Node(Sink) Stream

Process Stream 


 Node(Sink) Stream(일반 파이프) : 데이터를 소스에서 직접 읽거나 씀

 * Process Stream(필터) : Node(Sink) Stream을 받아서 가공한 후 직접 쓰는 애한테 넘겨줌 

   (Ex. 욕실의 샤워기)


- Node(Sink) Stream


근원지/
목적지 

Byte stream

(1byte) 

Character stream

(2byte) 

 memory

ByteArrayInputStream
ByteArrayOutputSream 

CharArrayReader
CharArrayWriter 

 file

FileInputStream
 - 파일로 부터 입력 받는
FileOutputStream 

 - 파일에 다가 출력

FileReader

- 파일로 부터 입력 받는

FileWriter

- 파일에 다가 출력


★ 한글을 사용할 때는 Character stream에 있는 것을 사용한


  * memory로 부터 데이터를 입력/출력 하는 파이프

  * file로 부터 입력/출력 하는 파이프


- Process Stream


처리 

Byte stream

(1byte) 

 Character stream

(2byte) 

 버퍼링

 BufferedInputStream
bufferedOutputStream

 BufferedReader
BufferedWriter

 자료변환
(기본자료형 인식)

 DataInputStream
DataOutputStream

 

 객체직렬화
(객체입출력)

ObjectInputStream
ObjectOutputStream 

 


 * BufferedReaderBufferedWriter

   => 이걸 사용, 필터


※ 한글을 Byte Stream(1byte)을 사용하게 되면 한글은 깨짐 (한글은 2byte)


- Charater S -> ~Reader, ~Writer 

 * 한글을 쓸때는 Reader, Writer를 써야함

- Byte S -> ~InputStream, ~OutputStream


[ 파일 복사 예제 ]

package asianaidt.io;

import java.io.FileInputStream;
import java.io.FileOutputStream;

public class FileCopy {
	

	public static void main(String[] args) {
		FileInputStream fis;		// 파일로부터 읽어 오는 스트림
		FileOutputStream fos; // 파일로 출력하는 스트림
		
// FileCopy.java (기존에 있는거),args[0]    Copy.java(새로 만들거), args[1]		
		
		try{
		fis = new FileInputStream(args[0] );
		fos = new FileOutputStream(args[1]);
		
		for(int i; (i=fis.read()) !=-1; )	// fis.read는 글자의 코드값(2진수)을 읽어서 i 에 저장, 파일의 끝을 맞나면 -1이 리턴됨
			fos.write(i);	// 글자값의 코드를 받아서 코드의 해당하는 글자를 출력함, i를 글자의 코드로 인식해서 해당 글자를 출력해줌

			fis.close();		// 출력 파일은 글자를 다 쓰면 꼭 닫아줘야 함
			fis.close();		// 출력 파일은 글자를 다 쓰면 꼭 닫아줘야 함
			
			System.out.println("file copied.....");
		}catch(Exception e){}
		
	}

}

* FileCopy.java (기존에 있는거),args[0] Copy.java(새로 만들거), args[1]
* 이클립스에서 작업할때는 앞에 경로명을 적어줘야 함
* 경로 : src\\asianaidt\\io\\클래스명.java
* Variable input 창에서 입력하면 됨

[순서]

1. 위 코드 입력 

2.  RUN AS > config > argument > Variable > string_prompt > apply > Ok












[ 실습 예제 ]

package asianaidt.io;
import java.io.*;

class  CharacterStreamTest{
	public static void main(String[] args) throws IOException{
		File tempfile = File.createTempFile("haha",".txt");	// 임시파일이라 실행할때 마다 파일명이 바뀜
		System.out.println(tempfile);
		
		// 10 ~ 17번 라인 : 파일에 내용 쓰기  --> 저장하기
		FileWriter fw = new FileWriter(tempfile);
		BufferedWriter bw = new BufferedWriter(fw);//필터 스트림, bw가 가공, 버퍼 크기 만큼 쓰는 필터(속도를 좀 더 빨리 하기 위해)

		for(int i = 0;i 열기
		FileReader fr = new FileReader(tempfile);
		BufferedReader br = new BufferedReader(fr); //필터 스트림
				
		for(String str; (str = br.readLine()) != null; ){		// readLine, 줄단위로 읽어냄 (BufferedReader가 소유)
			System.out.println(str);
		}
		br.close();		// 필터를 끼어 놓은 경우에는 필터만 닫아줘도 됨

	}
}


package asianaidt.io;




import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;




import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;




public class CopyOfNotePad extends JFrame implements ActionListener {
	JTextArea output;
	JScrollPane scrollPane;

	JMenuBar menuBar;
	JMenu menu, secondMenu;
	JMenuItem menuItem1, menuItem2,fnew,fopen,fsave,fsaveas,fexit;	// 새글, 불러오기, 저장하기, 새이름으로, 끝내기
	JRadioButtonMenuItem rbMenuItem1, rbMenuItem2;
	JCheckBoxMenuItem cbMenuItem1, cbMenuItem2;
	JFileChooser fc;

	public CopyOfNotePad() {       
		fc = new JFileChooser();
		//Create the menu bar.
		menuBar = new JMenuBar();

		//Build the first menu.
		menu = new JMenu("A Menu");
		menuBar.add(menu);

		// Build the second menu
		secondMenu = new JMenu("secondMenu");
		menuBar.add(secondMenu);

                //a group of JMenuItems
		menuItem1 = new JMenuItem("menu item 1");      
		menu.add(menuItem1);

		menuItem2 = new JMenuItem("menu item 2");
		menu.add(menuItem2);        

		// fnew,fopen,fsave,fsaveas,fexit
		// 새글, 불러오기, 저장하기, 새이름으로, 끝내기
		// second of JMenuItem
		fnew = new JMenuItem("새글");      
		secondMenu.add(fnew);
	        secondMenu.addSeparator();									//  JMenuItem의 구분선

		fopen = new JMenuItem("불러오기");      
		secondMenu.add(fopen);

		fsave = new JMenuItem("저장하기");      
		secondMenu.add(fsave);

		fsaveas = new JMenuItem("새이름으로");      
		secondMenu.add(fsaveas);

		fexit = new JMenuItem("끝내기");      
		secondMenu.add(fexit);

		fnew.addActionListener(this);  
		fopen.addActionListener(this);
		fsave.addActionListener(this);
		fsaveas.addActionListener(this);
		fexit.addActionListener(this);

		//a group of radio button menu items
		menu.addSeparator();									//  JMenuItem의 구분선
		ButtonGroup group = new ButtonGroup();	//radio button 사용할때 필요

		rbMenuItem1 = new JRadioButtonMenuItem("A radio button menu item 1");
		rbMenuItem2 = new JRadioButtonMenuItem("A radio button menu item 2");

		group.add(rbMenuItem1);
		group.add(rbMenuItem2);

		menu.add(rbMenuItem1);
		menu.add(rbMenuItem2);
   
       	//a group of check box menu items
		menu.addSeparator();
		cbMenuItem1 = new JCheckBoxMenuItem("A checkbox menu item 1");
		cbMenuItem2 = new JCheckBoxMenuItem("A checkbox menu item 2");

		menu.add(cbMenuItem1);
		menu.add(cbMenuItem2);            

		//secondMenu  생성

		//JMenuItem 생성: 새글, 불러오기, 저장하기, 새이름으로, 끝내기

	       //JMenuItem에 Listener 등록하기, MenuItem에 감시자를 붙여두기

		//secondMenu에 JMenuItem 붙이기

		//menuBar에 secondMenu 붙이기

		output = new JTextArea(5, 30);
		scrollPane = new JScrollPane(output);  
		add(scrollPane, "Center");
		setJMenuBar(menuBar);//****화면에 메뉴바 붙일 때 사용하는 메소드 :  setJMenuBar() 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setSize(550, 550);
		setVisible(true);   
	}

	public static void main(String[] args) {       
		CopyOfNotePad demo = new CopyOfNotePad();               
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object o = e.getSource();

		if(o == fnew){ //새글, 타이핑한 글자를 다 지워지게 하고
			output.setText("");
						
		}
		else if(o == fopen){ //열기
			//showOpenDialog(): 화면에 열기 창을 띄워 줌
			int returnVal = fc.showOpenDialog(this);	
			output.setText("");
			if (returnVal == JFileChooser.APPROVE_OPTION) { //열기버튼 클릭시
				File file = fc.getSelectedFile();								// 선택한 파일 알아내기
				
				FileReader fr;
				try {
					fr = new FileReader(file.getAbsolutePath());
					BufferedReader br = new BufferedReader(fr);
				
					for(String str; (str = br.readLine()) != null; ){		// readLine, 줄단위로 읽어냄 (BufferedReader가 소유)
						output.append(str+"\n");
						
						//System.out.println(str);
										}
					br.close();
										
				} catch (Exception e1) {
					
					e1.printStackTrace();
				}
				
								}
			}
			
			else if(o == fsave){ //저장하기

				//showSaveDialog(): 화면에 저장 창을 띄워 줌
				int returnVal2 = fc.showSaveDialog(this);
				// output.setText("");
				if (returnVal2 == JFileChooser.APPROVE_OPTION) {
					File file = fc.getSelectedFile();				// 저장하기 위해 입력한 파일명
					
					FileWriter fw;
					try {
						fw = new FileWriter(file.getAbsolutePath());
						BufferedWriter bw = new BufferedWriter(fw);
						
						bw.write(output.getText());
						
						output.setText("");
						bw.close();
						
					}
					catch (Exception e1) {
							e1.printStackTrace();
					}
										
				} 

			}else if(o == fsaveas){

			}else{ //fexit
				System.exit(0);				// 0을 제외한 나머지는 모두다 비정상 종료임
			}
		}
	}
package asianaidt.io;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.ButtonGroup;
import javax.swing.JCheckBoxMenuItem;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JRadioButtonMenuItem;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class CopyOfNotePad extends JFrame implements ActionListener {
	JTextArea output;
	JScrollPane scrollPane;

	JMenuBar menuBar;
	JMenu menu, secondMenu;
	JMenuItem menuItem1, menuItem2,fnew,fopen,fsave,fsaveas,fexit;	// 새글, 불러오기, 저장하기, 새이름으로, 끝내기
	JRadioButtonMenuItem rbMenuItem1, rbMenuItem2;
	JCheckBoxMenuItem cbMenuItem1, cbMenuItem2;
	JFileChooser fc;

	public CopyOfNotePad() {       
		fc = new JFileChooser();
		//Create the menu bar.
		menuBar = new JMenuBar();

		//Build the first menu.
		menu = new JMenu("A Menu");
		menuBar.add(menu);

		// Build the second menu
		secondMenu = new JMenu("secondMenu");
		menuBar.add(secondMenu);

		//a group of JMenuItems
		menuItem1 = new JMenuItem("menu item 1");      
		menu.add(menuItem1);

		menuItem2 = new JMenuItem("menu item 2");
		menu.add(menuItem2);        

		// fnew,fopen,fsave,fsaveas,fexit
		// 새글, 불러오기, 저장하기, 새이름으로, 끝내기
		// second of JMenuItem
		fnew = new JMenuItem("새글");      
		secondMenu.add(fnew);
		secondMenu.addSeparator();									//  JMenuItem의 구분선

		fopen = new JMenuItem("불러오기");      
		secondMenu.add(fopen);

		fsave = new JMenuItem("저장하기");      
		secondMenu.add(fsave);

		fsaveas = new JMenuItem("새이름으로");      
		secondMenu.add(fsaveas);

		fexit = new JMenuItem("끝내기");      
		secondMenu.add(fexit);

		fnew.addActionListener(this);  
		fopen.addActionListener(this);
		fsave.addActionListener(this);
		fsaveas.addActionListener(this);
		fexit.addActionListener(this);

		//a group of radio button menu items
		menu.addSeparator();									//  JMenuItem의 구분선
		ButtonGroup group = new ButtonGroup();	//radio button 사용할때 필요

		rbMenuItem1 = new JRadioButtonMenuItem("A radio button menu item 1");
		rbMenuItem2 = new JRadioButtonMenuItem("A radio button menu item 2");

		group.add(rbMenuItem1);
		group.add(rbMenuItem2);

		menu.add(rbMenuItem1);
		menu.add(rbMenuItem2);

		//a group of check box menu items
		menu.addSeparator();
		cbMenuItem1 = new JCheckBoxMenuItem("A checkbox menu item 1");
		cbMenuItem2 = new JCheckBoxMenuItem("A checkbox menu item 2");

		menu.add(cbMenuItem1);
		menu.add(cbMenuItem2);            

		//secondMenu  생성
		//JMenuItem 생성: 새글, 불러오기, 저장하기, 새이름으로, 끝내기
		//JMenuItem에 Listener 등록하기, MenuItem에 감시자를 붙여두기
		//secondMenu에 JMenuItem 붙이기
		//menuBar에 secondMenu 붙이기

		output = new JTextArea(5, 30);
		scrollPane = new JScrollPane(output);  
		add(scrollPane, "Center");
		setJMenuBar(menuBar);//****화면에 메뉴바 붙일 때 사용하는 메소드 :  setJMenuBar() 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		setSize(550, 550);
		setVisible(true);   
	}

	public static void main(String[] args) {       
		CopyOfNotePad demo = new CopyOfNotePad();               
	}

	@Override
	public void actionPerformed(ActionEvent e) {
		Object o = e.getSource();

		if(o == fnew){ //새글, 타이핑한 글자를 다 지워지게 하고
			output.setText("");
						
		}
		else if(o == fopen){ //열기
			//showOpenDialog(): 화면에 열기 창을 띄워 줌
			int returnVal = fc.showOpenDialog(this);	
			output.setText("");
			if (returnVal == JFileChooser.APPROVE_OPTION) { //열기버튼 클릭시
				File file = fc.getSelectedFile();								// 선택한 파일 알아내기
				
				FileReader fr;
				try {
					fr = new FileReader(file.getAbsolutePath());
					BufferedReader br = new BufferedReader(fr);
				
					for(String str; (str = br.readLine()) != null; ){		// readLine, 줄단위로 읽어냄 (BufferedReader가 소유)
						output.append(str+"\n");
						
						//System.out.println(str);
										}
					br.close();
										
				} catch (Exception e1) {
					
					e1.printStackTrace();
				}
								}
			}
			
			else if(o == fsave){ //저장하기

				//showSaveDialog(): 화면에 저장 창을 띄워 줌
				int returnVal2 = fc.showSaveDialog(this);
				// output.setText("");
				if (returnVal2 == JFileChooser.APPROVE_OPTION) {
					File file = fc.getSelectedFile();				// 저장하기 위해 입력한 파일명
					
					FileWriter fw;
					try {
						fw = new FileWriter(file.getAbsolutePath());
						BufferedWriter bw = new BufferedWriter(fw);
						
						bw.write(output.getText());
						
						output.setText("");
						bw.close();
						
					}
					catch (Exception e1) {
							e1.printStackTrace();
					}
				} 
			}else if(o == fsaveas){

			}else{ //fexit
				System.exit(0);				// 0을 제외한 나머지는 모두다 비정상 종료임
			}
		}
	}


Card.java

CardSave.java

CharacterStreamTest.java

FileCopy.java

CopyOfNotePad.java



Comments