System.out.println("Hello, World");


자바에서는 모든 입출력에서 스트림이라는 개념을 사용하는데, 이것은 C언어와 유닉스에서 온 개념이다. 자바에서는 위와 같은 그림처럼 스트림을 직접 파일에 연결되는 '노드 스트림'과 노드 스트림에 연결하여 다른 처리를 해 주는 '필터 스트림'으로 구분하고 있다.(파일이라고 했지만, 자바에서는 키보드, 모니터, 메모리, 네트워크 상의 리소스도 마찬가지로 취급하고 있다.)

위 그림에서는 노드 스트림과 필터 스트림을 자세히 표현한 그림으로, 역시 바이트 데이터의 저수지(파일이나 키보드 모니터, 메모리, 인터넷 리소스 등)에 직접 연결되어 있는 부분이 노드 스트림이다. 대표적인 입력 노드 스트림은 InputStream 클래스다. 키보드에서 입려을 받는 System.in도 바로 이 InputStream 클래스의 객체다. 대표적인 출력 노드 스트림은 OutoutStream 클래스다. 저수지 데이터로부터 데이터를 하나 가져오면 당연히 노드 스트림을 통하게 된다. 

◎ 입력 스트림

InputStream 클래스는 바이트 단위로 읽기 때문에 한글 등의 이유로 캐릭터 단위로 읽으려면 InputStreamReader 클래스를 연결해서 사용해야 한다. InputStream 클래스는 추상 클래스이기 때문에 바로 사용하는 것은 불가능하고, 반드시 상속받아서 쓰거나 InputStream 클래스의 서브 클래스를 사용해야 한다. 
다음은 InputStream 클래스의 객체인 System.in에 InputStreamReader 클래스의 객체를 연결하여 키보드로부터 문자열을 입력받는 예제다.

InputStreamReaderTest.java

import java.io.IOException;
import java.io.InputStreamReader;

public class InputStreamReaderTest {
	public static void main(String[] args) {
		InputStreamReader in = new InputStreamReader(System.in);		
		try{
			while(true){
				int i=in.read();
			char myChar=(char)i;
			System.out.print(myChar);
		}
	}catch(IOException e){
		System.out.println(e.toString());			
		}
	}
}

◎ FileInputStream과 FileReader
FileInput 클래스는 Input클래스의 서브 클래스로, 파일로부터 바이트 단위로 읽는 입력 스트림이다. 캐릭터 단위로 읽으려면 FIleReader클래스를 사용하면 된다. FileInputStream 클래슨 파일 이름을 바로 적거나 FIle클래스를 사용해서 생성 할 수 있다.

◎ BufferedInputStream과 BufferedReader
BufferedInputStream 클래스는 InputStream 클래스에 버퍼를 추가한 스트림이다. BufferedInputStream 클래스를 사용하면, 프로그램에서 데이터를 읽어올때 요청한 데이터보다 많은 양의 데이터를 미리 버퍼에 읽어 놓았다가 다음 요청때 돌려주기 때문에 프로그램이 기다리는 시간이 줄어들어서 전체적인 수행속도가 빨라 진다. BufferedInputStream 클래스는 필터 스트림이기 때문에 그 자체로는 쓸 수 없고, InputStream 클래스의 객체를 인수로 받아서 생성 해야 한다. 이와 마찬가지로 InputStreamReader클래스에 버퍼를 추가 한 것이 BufferedReader 클래스이다. BufferedReader 클래스를 생성할 때 InputStreamReader 클래스의 객체를 인수로 주면, 버퍼를 사용하면서 캐릭터 단위로 데이터를 읽는 스트림이 생성된다. 

◎ OutputStream과 OutputStreamWriter
OutputStream클래스는 대표적은 출력 스트림이다. OutputStream 클래스는 바이트 단위로 데이터를 출력하기 때문에, 한글과 같은 비영어궈 문자를 출력하려면 캐릭터 단위로 출력하는 OutputStreamWriter 클래스를 연결해서 사용해야 한다. OutputStream 클래스도 InputStream 클래스와 마찬가지로 추상 클래스이기 때문에 바로 사용할수는 없고, 서브 클래스를 사용해야 한다. OutputStream 클래스는 모든 출력 스트림의 슈퍼클래스이기 때문에 OutputStream 클래스의 모든 메소드는 서브클래스에서 사용할 수 있다.

◎ FileOutPutStream과 FilwWriter
FileOutputStream 클래스는 OutputStream 클래스의 서브 클래스로, 파일에 바이트 단위로 출력하는 출력 스트림이다. 캐릭터 단위로 출력하려면 FileWriter 클래스를 사용하면 된다.

◎ BufferedOutputStream과 BufferedWriter
BufferedOutputStream 클래스는 BufferedInputStream 클래스처럼 버퍼 처리를 하는 출력 스트림이다. 프로그램에서 BufferedOutputStream 클래스로 만든 출력 슽림에 출력을 하면, 바로 장치(파일이나 모니터, 네트워크 소켓등)에 출력되지 않고, 메모리의 버퍼에 출력된다. 버퍼가 가득 차면 자동으로 장치에 출력되기 때문에 프로그램이 매번 저장장치에 기록되길 기다리는 OutputStream에 비해 전체적인 수행 속도가 빨라진다.
BufferedOutputStream 클래스는 필터 스트림이기 때문에 그 자체로는 쓸 수 없고, OutputStream 클래스의 객체를 인수로 주어 생성해야 한다. 이와 마찬가지로 OutputStreamWriter 클래스에 버퍼 처리를 한 것이 BufferedWriter클래스다. BufferedWriter 클래스를 생성 할 때 OutputStreamWriter 클래스의 객체를 인수로 주면, 버퍼를 사용하면서 캐릭터 단위로 출력하는 스트림이 생성된다. 

◎ DataOutputStream
입력 스트림인 DataInputStream 클래스의 대응 되는 출력 스트림이 DataOutputStream 클래스다. DataOutputStream 클래스는 자바의 기본 데이터형으로 출력할 수 있도록 해주는 출력 스트림이다. DataInputStream 클래스처럼 DataOutputStream 클래스도 바이트 단위로 데이터를 처리하기 때문에 별로 인듯 하다. DataInputStream 클래스보다는 PrintStream클래스나 PrintWriter클래스를 사용하는 편이 좋다.

◎ PrintStream와 PrintWriter
PrintStream 클래스는 필터 스트림으로 OutputStream 클래스의 객체를 인수로 받아서 생성할 수 있다. PrintStream 클래스는 OutputStrema 클래스의 모든 기능을 단 2개의 메소드인 print()메소드와 println() 메소드로 출력 할 수 있도록 해주는 강력하고 편리한 출력 스트림이다. PrintStream 클래스의 print()메소드와 println()메소드는 메소드 오버로딩을 이ㅛㅇㅇ해서 주어지는 데이터형에 상관없이 출력 할 수 있도록 되어 있다.

Posted by 김마농

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileReaderWriterTest{
		public static void main(String[] args) {
			FileReader fr = null;
			FileWriter fw = null;
			//d:\news.txt를 읽어서 news2.txt로 쓴다 char[]로 받아서 쓰이게 된당
			try{
				fr = new FileReader("D:\\news.txt");
				fw = new FileWriter("D:\\news2.txt");
				long l1 = System.currentTimeMillis();
				char[] data = new char[100];
				int length = fr.read(data);
				int count=0;
				
				while(length !=-1){
					fw.write(data,0,length);
					length = fr.read(data);
					count++;
				}
				long l2 = System.currentTimeMillis();
				System.out.println(l2-l1);
				System.out.println(count);					
				
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}finally{
				if(fr!=null){//만약 fi가 null이 아닐 경우
					try {
						fr.close();
					} catch (IOException e) {
						e.printStackTrace();
					}
				}
				if(fw!=null){
					try {
						fw.close();
					} catch (IOException e) {
						e.printStackTrace();
						}
					}
				}	
			}
		}

Posted by 김마농

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileStreamArrayTest { public static void main(String[] args) { FileInputStream fi = null; FileOutputStream fo = null; try { //1. 연결 fi = new FileInputStream("D:\\Desert.jpg");//연결 fo = new FileOutputStream("D:\\Desert3.jpg");//덮어쓰기 //fo=new FileOutputStream("D:\\Desert2.jpg",true);//이어쓰기 파일크기가 2배가 되어버린다. //2. I/O작업(읽는 작업, 출력작업) long l1 = System.currentTimeMillis(); int count =0; byte[] buff = new byte[10000];//읽은 데이터는 배열에 있다. int length = fi.read(buff);//몇바이트 읽었는지 while(length != -1){ fo.write(buff,0,length);// 0번부터 length까지 쓰게 된다. 그냥 buff로 쓰면 기존에 있던 바이트들이 중복처리되서 파일 용량이 이전것보다 크게 써지게 된다.

length =fi.read(buff);// count++; } long l2 = System.currentTimeMillis(); System.out.println(l2-l1+"초"); System.out.println("반복횟수 : "+count); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(fi!=null){//만약 fi가 null이 아닐 경우 try { fi.close(); } catch (IOException e) { e.printStackTrace(); } } if(fo!=null){ try { fo.close(); } catch (IOException e) { e.printStackTrace(); } } } } }


Posted by 김마농

<파일을 읽어서 출력해주기 : 파일 복사>


import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileStreamTest { public static void main(String[] args) { FileInputStream fi = null; FileOutputStream fo = null; try { //1. 연결 fi = new FileInputStream("D:\\Desert.jpg");//연결 //fo = new FileOutputStream("D:\\Desert2.jpg");//덮어쓰기 fo=new FileOutputStream("D:\\Desert2.jpg",true);//이어쓰기 파일크기가 2배가 되어버린다. 만약 텍스트파일을 이어쓰기 했을 경우 텍스트 파일이 복사된다. //2. I/O작업(읽는 작업, 출력작업) int data = fi.read();//1바이트, 여기서 먼저 1바이트 읽게 된다. int count =0; long l1 = System.currentTimeMillis();//시간 계산 while(data!=-1){ fo.write(data);//출력 count++; data = fi.read();//입력 } long l2 = System.currentTimeMillis();//시간 계산 System.out.println("읽은 횟수 : "+count); System.out.println((l2-l1)/1000+"초"); //3. 연결 끊기 //fi.close();//연결 끊기 } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally{ if(fi!=null){//만약 fi가 null이 아닐 경우 try { fi.close(); } catch (IOException e) { e.printStackTrace(); } } if(fo!=null){ try { fo.close(); } catch (IOException e) { e.printStackTrace(); } } } } }


Posted by 김마농

파일을 byte하나씩 받기


import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class FileStreamTest {
	public static void main(String[] args) {
		FileInputStream fi = null;
		try {
			//1. 연결
			fi = new FileInputStream("D:\\Desert.jpg");//연결
			//2. I/O작업(읽는 작업)
		int data = fi.read();//1바이트 
		int count =0;
		long l1 = System.currentTimeMillis();//시간 계산
		while(data!=-1){
			count++;
			data = fi.read();
		}
		long l2 = System.currentTimeMillis();//시간 계산
		System.out.println("읽은 횟수 : "+count);
		System.out.println((l2-l1)/1000+"초");
		//3. 연결 끊기
		//fi.close();//연결 끊기
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			if(fi!=null){//만약 fi가 null이 아닐 경우
				try {
					fi.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}		
	}
}


Posted by 김마농

뽀삐

260 RP

50%

130 RP

아무무

585 RP

50%

292 RP

베이가

585 RP

50%

292 RP

블리츠크랭크

975 RP

50%

487 RP

코르키

975 RP

50%

487 RP

럼블

975 RP

50%

487 RP                    

킨tt

전투 예복 뽀삐

975 RP

50%

487 RP

작은 기사 아무무

975 RP

50%

487 RP

회색수염 베이가

975 RP

50%

487 RP

필트오버 커스텀 하이머딩거

975 RP

50%

487 RP

스피드광 코르키

520 RP

50%

260 RP

빌지워터 럼블

520 RP

50%

260 RP

 

 

◆ 챔피언

 

Poppy(뽀삐)Amumu(아무무)Veigar(베이가)Blitzcrank(블리츠크랭크)Corki(코르키)Rumble(럼블)

 

 

◆ 스킨


 
 
 

 

원본 크기로 보시려면 그림을 클릭하세요. 원본 크기로 보시려면 그림을 클릭하세요.
원본 크기로 보시려면 그림을 클릭하세요.

Posted by 김마농

Stream : 데이터의 흐름(통로)

Java.io 

① Input/Output class로 구분

② Node / Filter로 구분

③ Byte / Character 계열로 구분

ex)하나의 클래스가 Input/Node/byte 여러가지를 가질수 있다.


Node계열 : 연결시 목적인 Stream class

                연결이 목적이므로 입출력을 위한 기본 기능을 제공

Filter계열 : 기존의 Stream(연결된)이 읽고 쓰는 기능을 추가하는 class

          기능 추가가 목적이므로 연결 기능은 없다.

  -> Node로 연결하고 Filter로 기능 추가

Byte계열 : 1byte단위 입출력 처리하는 Stream

               binary code 입출력시 사용

Character 계열 :2byte 단위 입출력 처리시 Stream Class

                       Text 입출력시 사용


<패턴>

try{
1.연결- Node
        -기능추가 -> Filter
2. I/O(Input / Output)
}finally{
3. 연결끊기 -> 필터를 끊으면 Node도 같이 끊키게 된다.
}



 

 Input 계열

Outout 계열


Byte계열 

 character계열

 Byte계열

character계열

 최상위 class(추상)

 InputStream

Reader

OutputStream

Writer

 Node계열

 FileSteam

 FileReader

FileoutputStream 

FileWriter 

 Filter계열

 ObjectFileStream
DataInputStream

BufferedReader
InputStreamReader 

ObjectOutputStream 
DataOutputStream
PrintWriter

BufferedWriter
OutputStreamWriter
PrintWriter 

BufferedReader로 읽고 PrintWriter로 출력한다.

DataOutputStream은 primitive타입으로 출력한다.

또한 만약 Input의 Byte계열로 받을때에는 그 라인에 해당되는 계열만 사용할 수 있다. 또한 FileInputStream을 

FileInputStrema을 BufferedReader 뒤에 쓰고 싶을때에는 FileInputStream을 InputStreamReader로 변환시켜서 사용한다. FileOutputStream도 마찬가지다. 

Node계열 생성자의 인수 : 연결대상
Filter계열 생성자의 인수 : Stream class type, Reader/Writer, InputStream / OutputStream

<입력시>

InputStream
-
1byte로 입력 받음

InputStream의 메소드

read():int
읽어들인 Data를 int type의 공간의 마지막 1 byte에 저장
- EOF(파일의 마지막)을 만나면 -1을 return

read(byte[]):int
- 읽어들인 Data들을 byte[]에 꽉 찰때까지 넣은 후 1 byte씩 꺼내 저장함
- byte[]의 index를 return
EOF(파일의 마지막)을 만나면 -1을 return

Reader
- char(2 byte) 단위로 입력 받음

Reader의 메소드

read() : int
- 읽어들인 Data를 int type의 공간의 마지막 2 byte에 저장
- EOF(파일의 마지막)을 만나면 -1을 return


read(char[]) : int
- 읽어들인 Data들을 char[]에 꽉 찰때까지 넣은 후 char 문자 1개씩 꺼내 저장함
- char[]의 index를 return


<출력시>

- OutputStream
○byte계열

write(int) 
- 인수로 받은 byte를 출력

wirte(byte[])
- byte 배열내의 data들을 한번에 출력한다.

wirte(byte[],int Start Index, int length)
- byte 배열내의 data중 Start Index에서 length만큼의 data출력한다.

ex) byte[] b= new byte[50]{
write(b,5,10)
}
-> 5 ~ 14만큼의 출력한다.

- Writer
○character계열 

write(int)
-인수로 받은 char를 출력

write(char[])
-
char 배열내의 data들을 한번에 출력한다.

write(char[],int start index, int length)
- char 배열내의 data중 Start Index에서 length만큼의 data출력한다.

close() : 연결 끊는 서비스
in.read() : 읽은 data가 없으면 무한히 기다린다. I/O Blocking
flush() : 버퍼를 이용하는 Stream의 버퍼내 Data들을 강제 출력 처리한다.


<입출력 코딩 패턴>

File IO
- File과 연결하여 Input / Output을 하는 것
- File과 연결해야 하므로 생성자 호출시 String fileName1을 인수로 넘김
- 생성과 동시에 File과 연결이 됨

byte 단위

- FileInputStream
- FileOutputStream

char 단위

- FileReader
- FileWriter

생성자 : (String 파일명)
ex)FileWriter fw = new FileWriter("a.txt");

위와 같은 구문을 작성해서 실행하고, 생성되면 그 순간 Stream이 연결되어 출력 할 수 있게 된다.

Posted by 김마농

문법 에러외의 다른 에어를 실행에러이다. 컴파일이 잘 되었음에도 실행 중에 에러가 발생하는 것이다. 실행 에러는 크게 세 가지로 나눌수 있는데, 논리적으로 잘못된 프로그램에서 발생하는 '논리 에러'와 프로그램 실행중의 특별한 상황 떄문에 발생하는 '예외', 그리고 컴퓨터 시스템에서 발생하는 '시스템 에러'이다. 논리에러는 프로그램을 완전히 잘못 작성한 경우로 해결방법은 다시 작성하는 수밖에 없다. 정전이나 하드 디스크 오류와 같은 시스템 에러는 사실 프로그래머가 어떻게 할 수 있는 성질의 것이 아니라서 사전에 예방 할 수 밖에 없다. 

예외라는 것은 프로그램이 정상적으로잘 작성되었는데에도, 실행하는 과정에서 여러 이유로 발생하는 에러를 말한다. 이처럼 프로그램이 정상적으로 잘 진행될 수 있는데, 실행중에 잘못된 입력이나 사용으로 발생하는 에러를 예외(Exception)라고 하고, 자바에서는 예외를 복구 할수 있는 방법을 제공한다.


 메소드

설명 

 ArithmeticException

0으로 나누려고 할 떄 발생 예 : (int i=12/0;) 

 NullPointerException

객체를 생성하기 전에 사용하려고 할때와 NULL값 

 NegativeArraySizeException

 배열의 크기를 음수로 줄때 발생

 ArrayIndexOfBoundsException

 첨자가 배열의 크기 범위를 벗어날 때 발생

 SecurityException

 애플릿이 보안을 위반했을때 발생

◎Try - catch 문

자바에서는 예외가 발생했을때, 이를 처리하기 위한 루틴으로 이동하는 것을 "던진다(throw)라고 말한다. 예외를 복구하는 방법은 ①예외가 발생할 가능성이 있는 부분을 try 명령으로 감싸고 예외가 발생한 메시지를 던진 후 ② catch 명령으로 try가 던진 예외를 받아서 처리한다. 

현재 여기서는 try-catch구문을 만들어본다. 이때 catch문을 여러개가 있을 수 있는데, 그럴 떄는 Exception객체에 따라 구분한다. 예를 들어 try명령이 MyException형 예외를 던지면 catch(Exception e)가 받고, try 명령이 ArithmeticException형 예외를 던질경우 catch(ArithmeticException)가 받게 된다.

try{
//예외가 예상되는 부분
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분 1
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분 2
}

ArrayException.java

public class ArrayExceptionTest {
	
	public static void main(String[] args) {
		String language[] = {"언어","C언어","자바"};
		
		int i=1;
		while(i<4){
			try{
				System.out.println(language[i]);
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("배열의 첨자를 다시 설정합니다.");
				i=-1;			
			}
			i++;
		}
	}
}

◎ finally

try - catch명령을 사용할때 예외의 발생과는 상관없이 무조건 실행하고 싶은 명령이 있다면 finally명령을 사용하면 된다. 이때 finally명령은 try-catch 명령이 종료된 후에 처리되는 명령이기 때문에 catch명령 다음에 사용해야 한다.

try{
//예외가 예상되는 부분
}catch(Exception형 e){
//Exception형에 따라 예외를 처리하는 부분
}finally{
//무조건 실행하고 싶은 부분
ArrayExceptionTest2
public class ArrayExceptionTest2 {
	
	public static void main(String[] args) {
		String language[] = {"언어","C언어","자바"};
		
		int i=1;
		while(i<4){
			try{
				System.out.println(language[i]);
			}catch(ArrayIndexOutOfBoundsException e){
				System.out.println("배열의 첨자를 다시 설정합니다.");
				i=-1;
			}finally{
				System.out.println("언제나 나오는 부분");
			}
			i++;
		}
	}
}

◎ throws와 throw

신뢰성 있는 코드를 작성하도록 하기 위해서 자바에서는 '선언하거나 처리하라(Declare or Handle'라는 규칙을 정해두었다. 이 규칙은 예외가 발생할 가능성이 있는 곳은 try-catch 명령으로 처리하고, 만일 처리하지 못하는 경우에는 throws 명령으로 선언해야 한다는 뜻이다. 자바에서는 예외가 발생하면 해당하는 명령으로 감싸고 있는 try-catch명령을 찾고, 만약 try-catch 명령이 없을 경우에는 예외가 발생한 부분을 호출한 상위 클래스로 올라가게 된다. 따라서 예외를 처리해 주지 않으면, 연속적으로 예외가 던져지고(throw), 마지막에는 자바 가상머신(JVM)이 에러 메시지를 출력하고 프로그램이 종료되게 된다. 

모든 예외에서 try-catch명령으로 처리를 해주는게 옳지만, 예외가 발생할 가능성이 있는 모든 곳을 다 처리한다는 것은 사실상 불가능한 일이다. 이럴 때는 thows명령으로 발생 가능한 예외를 선언해 주면, '이 부분이 예외를 발생시킬 가능성은 있지만 처리는 하지 않고, 이 부분을 호출한 곳으로 처리를 미룬다'는 뜻이 된다.

public class ThrowsTest {

	public int divide(int x, int y) throws ArithmeticException
	{
		int result;
		
		try{
			result = x/y;
		}catch(ArithmeticException e){
			throw(e);
		}
		return result;
	}
	public static void main(String[] args) {
		{
			ThrowsTest x = new ThrowsTest();
			for(int i=5; i>=0; i--){
				int dive_100 = x.divide(100,i);
				System.out.println("100을 "+i+"로 나누면:"+dive_100);
			}	
		}
	}
}



Posted by 김마농