본문 바로가기

개발 공부/Java

자바 프로그래밍 입문 강좌 26~28. JAVA 마무리

자바 프로그래밍 입문 강좌 (renew ver.) - 초보부터 개발자 취업까지!!

 

 

26. 예외처리

 

26-1. 예외란?

프로그램에 문제가 있는 것을 말하며, 예외로 인해 시스템 동작이 멈추는 것을 막는 것을 예외처리라고 한다.

Exception : Error는 개발자가 대처할수 있음

Error : 개발자가 대처할 수 없음

 

Exception - Checked Exception : 예외처리를 반드시 해야하는 경우(네트워크, 파일 시스템 등)

       Unchekced Exception : 예외처리를 개발자의 판단에 맡기는 경우(데이터 오류 등)

 

 

 

26-2. Exception 클래스

Exception 클래스 하위 클래스로 NullPointerException(객체를 가리키지 않고 레퍼런스를 이용할 때), ArrayIndexOutOfBoundException(배열에서 존재하지 않는 인덱스 참조), NumberFormatException(숫자에 문자를 넣었을 떄)

 

 

26-3. try~catch

개발자가 예외처리가 가장 쉽고 많이 사용되는 방법

 

try {

   예외가 발생할 수 있는 코드

} catch (Exception e) {

    예외가 발생했을 때 처리할 코드

}

 

package pjtTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		int i = 10;
		int j = 0;
		int r = 0;
		System.out.println("Exception BEFORE");
		try {
			r = i/j;
		} catch(Exception e) {
			e.printStackTrace();
			String msg = e.getMessage();
			System.out.println(msg);
		}
		
		System.out.println("Exception AFTER");
	}
	
}

catch 구문을 여러 개 두어 여러 개의 예외처리를 할 수 있다.

try 안에서 예외처리가 발생하면 바로 catch로 넘어간다. try 안에서 예외 이후의 코드는 처리되지 않는다.

 

finally 구문에 이용해 예외 발생 여부에 상관없이 언제나 실행되는 코드를 넣어줄 수 있다

 

26-6. throws

예외 발생 시 예외 처리를 직접 하지 않고 호출한 곳으로 넘긴다.

package pjtTest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Main m = new Main();
		try {
			m.firstMethod();
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
	
	public void firstMethod() throws Exception {
		secondMethod();
	}
	
	public void secondMethod() throws Exception {
		thirdMethod();
	}
	
	public void thirdMethod() throws Exception {
		System.out.println("10 / 0 = " + (10/0));
	}
	
}

 

예외를 직접 처리하지 않고 나를 호출한 곳으로 던져버리는 것

 

 

 

 

27. 입력과 출력

 

27-1 : 입/출력이란?

프로그램과 입출력 대상 사이에 stream으로 입출력을 한다.

 

27-2 입출력 기본 클래스

입출력에 사용되는 기본 클래스는 1byte 단위로 데이터를 전송하는 InputStream, OutputStream이 있다.

InputStream : FileInputStream, DataInputStream, BufferedInputStream

 

27-3. FileInputStream, FileOutputStream

파일에 데이터를 읽고 쓰기 위한 클래스

read(), write() 메서드.

 

read() : 1byte씩

read(byte[])

 

write(byte[] b) : 전체 쓰기

write(byte[], int off, int len) : 시작점~시작점+길이까지 쓰기

 

package pjtTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		InputStream inputStream = null;
		try {
			inputStream = new FileInputStream("C:\\Users\\sarmi\\OneDrive\\바탕 화면\\Study\\컴터\\testtest.txt");
			int data = 0;
			while(true) {
				try {
					data = inputStream.read();
				}catch(IOException e) {
					e.printStackTrace();
				}
				if(data == -1) break;
				System.out.println("data : " + data);
			}
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if(inputStream!=null) inputStream.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
}

 

package pjtTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		InputStream inputStream = null;
		try {
			inputStream = new FileInputStream("C:\\Users\\sarmi\\OneDrive\\바탕 화면\\Study\\컴터\\testtest.txt");
			int data = 0;
			byte[] bs = new byte[3];
			while(true) {
				try {
					data = inputStream.read();
				}catch(IOException e) {
					e.printStackTrace();
				}
				if(data == -1) break;
				System.out.println("data : " + data);
				for(int i = 0; i<bs.length; i++)
					System.out.println("bs[" + i + "] : " + bs[i]);
			}
		}catch(FileNotFoundException e) {
			e.printStackTrace();
		} finally {
			try {
				if(inputStream!=null) inputStream.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
}

 

package pjtTest;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
			OutputStream outputStream = null;
			try {
				outputStream = new FileOutputStream("C:\\Users\\sarmi\\OneDrive\\바탕 화면\\Study\\컴터\\testtest.txt");
				String data = "Hello java World!!";
				byte[] arr = data.getBytes();
				
				try {
					outputStream.write(arr);;
					
				} catch(IOException e) {
					e.printStackTrace();
				}
			} catch(FileNotFoundException e) {
				e.printStackTrace();
			} finally {
				try {
					if(outputStream!=null) outputStream.close();
				} catch(IOException e) {
					e.printStackTrace();
				}
			}
	}
	
	
	
}

 

여기서 byte[] arr = data.getBytes();

outputStream.write(arr, 0, 5);

로 글자 수를 지정해 입력할 수 있다.

 

27-5. DataInputStream, DataOutputStream

byte 단위의 입출력을 개선해 문자열을 좀 더 편리하게 다룰 수 있다.

 

package pjtTest;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
			String str = "Hello Java World";
			OutputStream outputStream=null;
			DataOutputStream dataOutputStream = null;
			
			try {
				outputStream = new FileOutputStream("C:\\\\Users\\\\sarmi\\\\OneDrive\\\\바탕 화면\\\\Study\\\\컴터\\\\testtest.txt");
				dataOutputStream = new DataOutputStream(outputStream);
				
				dataOutputStream.writeUTF(str);
			} catch(Exception e) {
				e.printStackTrace();
			}finally {
				try {
					if(dataOutputStream!=null) dataOutputStream.close();
				} catch(Exception e) {
					e.printStackTrace();
				}
				
				outputStream.close();
			}
	}
	
	
	
}

27-6. BufferedReader, BufferedWriter

byte 단위의 입출력을 개선해 문자열을 좀 더 편리하게 다룰 수 있음

 

package pjtTest;
import java.io.BufferedReader;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
			String fileName = "hello.txt";
			BufferedReader br = null;
			FileReader fr = null;
			
			try {
				fr = new FileReader(fileName);
				br = new BufferdReader(fr);
				
				String strLine;
				while((strLine = br.readLine())!=null) {
					System.out.println(strLine);
				}
				
			}catch(IOException e) {
				e.printStackTrace();
			}finally {
				try {
					if(br!=null) br.close();
					if(fr!=null) fr.close();
				}catch(IOException ex) {
					ex.printStackTrace();
				}
			}
	}
	
	
	
}

 

package pjtTest;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
			String fileName = "hello.txt";
			BufferedWriter bw = null;
			FileWriter fw = null;
			
			try {
				String str = "Hello~\n";
				str == "Hello \n";
				bw = new BufferedWriter(fileName);
				fw = new FileWriter(bw);
				
				bw.write(str);;
				
			}catch(IOException e) {
				e.printStackTrace();
			}finally {
				try {
					if(br!=null) bw.close();
					if(fr!=null) fw.close();
				}catch(IOException ex) {
					ex.printStackTrace();
				}
			}
	}
	
	
	
}

 

28. 네트워킹

 

28-1. 네트워크 사이에 입출력을 이용해 데이터를 입력하고 출력한다.

 

28-2. 소켓

네트워크 상에서 데이터를 주고받기 위한 장치.

 

28-3. Socket 클래스

서버는 클라이언트를 맞을 준비를 하고 있다가 클랑리언트 요청에 반응한다.

 

package pjtTest;

import java.net.ServerSocket;
import java.net.Socket;

public class Main {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		try {
			serverSocket = new ServerSocket(9000); //포트번호
			System.out.println("클라이언트 맞을 준비 완료");
			
			socket = serverSocket.accept();
			System.out.println("클라이언트 연결!");
			System.out.println("socket : " + socket);
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if(socket!=null) socket.close();
				if(serverSocket!=null) serverSocket.close();
			}catch(Exception e)
			{
				e.printStackTrace();
			}
		}
	}
	
	
	
}

28-4.Client와 Server 소켓

서버에 ServerSocket을 준비하고 클라이언트에서 Socket 이용해서 접속.

 

 

 

package pjtTest;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
	public static void main(String[] args) {
		Socket socket = null;
		try {
			socket = new Socket("localhost", 9000);
			System.out.println("서버 연결");
			System.out.println("socket : " + socket);
		}catch(IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(socket!=null) socket.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
}
package pjtTest;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class Main {
	public static void main(String[] args) {
		ServerSocket serverSocket = null;
		Socket socket = null;
		try {
			serverSocket = new ServerSocket(9000);
			
			socket = serverSocket.accept();
			System.out.println("클라이언트 연결!");
		} catch(IOException e) {
			e.printStackTrace();
		} finally {
			try {
				if(socket!=null) socket.close();
				if(serverSocket!=null) serverSocket.close();
			}catch(IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	
	
}