JDBC(Java Database Connectivity)는 자바 API의 하나로서 데이터베이스에 연결하여서 데이터베이스 안의 데이터에 대하여 검색하고 데이터를 변경할 수 있게 한다. 따라서 JDBC를 사용하면 자바 프로그램으로 회사같은 곳에서 사용하는 데이터베이스에 접그하여서 여러가지 작업을 할 수 있게 된다.
네트워크에는 서버와 클라이언트가 존재한다. 이들은 미리 정의된 프로토콜을 이용하여서 서로 간에 통신을 한다.
|자바와 네트워킹
자바에서 네트워크 프로그래밍을 위한 패키지는 java.net이다.
URL클래스
자바에서는 URL 객체를 이용하여 URL의 주소를 나타낸다.
URL java = new URL("http://java.sun.com/"); // 절대 경로
URL reference = new URL(java, "reference.html"); // 상대경로
<예제>
URL문자열로부터 각가의 요소 파싱
출력결과
|URL클래스를 이용한 읽기
URL 클래스 메소드인 openStream( )을 이용하면 인터넷상의 URL에서 직접 그 내용을 입력 스트림처럼 읽을 수 있다.
<예제>
출력결과
|URLConnection 클래스
URL 객체를 생성한 후에 URL 클래스의 openConnection( ) 메소드를 호출하면 URLConnection 객체를 반환한다. 이 객체를 이용하여 외부 URL에 의하여 표현되는 서버에 접속할 수 있으며 또한 접속에 앞서서 여러 가지 통신 파라미터들을 설정할 수 있다.
try{
URL java = new URL("http://java.sun.com/");
URLConnection javac = java.openConnection( );
javac.connect = java.openConnection( );
} catch (MalformedURLException e){
} catch (IOException e){
}
TCP를 이용한 통신
URL과 URLConnections 클래스는 인터넷상의 자원을 접근하는데 상대적으로 고수준의 메카니즘. 그러나 가끔은 저수준의 네트워크 통신 기능이 필요한 경우도 있다. 예를 들면 클라이언트-서버 응용 프로그램을 만드는 경우
|소켓이란?
하나의 포트에 하나의 소켓을 만들어 결합
TCP를 이용한 서버 제작
서버 제작 5단걔
1. ServerSocket 객체 생성
ex) ServerSocket server = new ServerSocket(portNumber, queueLength);
바이트 스트림 : 8비트의 바이트 단위로 입출력하는 클래스, 이진 데이터를 읽고 쓰기 위하여 사용.
문자 스트림 : 문자 단위로 입출력하는 클래스, 기본적으로 유니코드를 저장.
|데이터 싱크와 데이터 처리
데이터 싱크 스트림 : 소스나 목적지에 데이터를 입출력(메모리, 파이프, 파일)
데이터 처리 스트림 : 데이터 가공(그 외)
바이트 스트림
모든 바이트 스트림은 InputStream과 OutputStream에서 파생
|InputStream과 OutputStream 클래스
int read( ) : 한 바이트를 읽어서 int 타입으로 반환, 읽을 값이 없으면 -1을 반환
int read(byte[] buf) : buf의 크기만큼 데이터를 읽어서 buf에 저장하고 읽은 바이트 수를 반환
int read(byte[] buf, int offset, int length) : length만큼의 데이터를 읽어서 buf의 offset위치에 저장하고 읽은 바이트 수를 반환
void write(int data) : data의 하위 8비트를 출력
void write(byte[] buf) : buf[]에 저장된 바이트들을 출력
void write(byte[] buf, int offset, int length) : buf의 offset 위치에 length만큼의 바이트를 출력
|FileInputStream과 FileOutputStream 클래스
FileInputStream 클래스는 파일에서 바이트를 읽고 FileOutputStream 클래스는 파일에다가 바이트를 쓴다.
FileInputStream의 생성자
1. FileInputStream(File file) : File 객체에 연결된 파일로부터 바이트를 읽는 객체를 생성한다.
2. FileInputStream(String name) : 파일의 경로 이름이 name인 파일과 연결된 입력 담당 객체를 생성한다.
FileOutputStream의 생성자
1. FileOutputStream(File file) : File 객체가 나타내는 파일에 바이트를 쓰는 객체를 생성한다.
2. FileOutputStream(String name) : 파일의 경로 이름이 name인 파일과 연결된 출력 담당 객체를 생성한다.
3. FileOutputStream(String name, boolean append) : append가 true이면 파일의 끝에 바이트를 추가하고 false이면 바이트를 기존의 바이트 위에 겹쳐서 쓴다.
<예제>
출력결과
import java.io.*;
public class FileStreamTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream in = null;
FileOutputStream out = null;
try{
int c;
out = new FileOutputStream("data.txt",false);
for(int i=0;i<10;i++)
{
out.write(i);
}
in = new FileInputStream("data.txt");
while((c = in.read()) != -1){
System.out.println(c+" ");
}
}finally{
if(in != null){
in.close();
}
if(out != null){
out.close();
}
}
}
}
->read( )가 int 값을 반환하는 이유는 입력 스트림의 끝을 표시하는데 -1을 사용하기 위해
->더 이상 사용하지 않는 스트림을 닫는 것이 중요. 소스에서 만약 오류가 발생했을 경우에도 finally 블록을 사용하여 스트림을 닫고 있다. 만약 스트림을 닫지 않으면 심각한 자원 누출이 발생한다.
|BufferedInputStream과 BufferedOutputStream 클래스
각 read나 write 요청은 운영체제에 의하여 요청하는 즉시 처리된다. 이것은 매우 비효율적인 방법이다. 왜냐하면 입출력 요청은 디스크 접근이나 네트워크 접근같은 매우 시간이 많이 걸리는 동작을 요구하기 때문이다. 따라서 오버헤드를 줄이기 위하여 버퍼링된 스트림을 제공
BufferedInputStream(InputStream in) : 입력 스트림 in을 감싸는 버퍼 입력 스트림 객체를 생성
BufferedInputStream(InputStream in, int size) : 버퍼 크기가 size인 버퍼를 가진 버퍼 입력 스트림을 생성
버퍼가 없는 스트림을 버퍼가 있는 스트림으로 변경
inputStream = new BufferedInputStream(new FileInputStream("data.txt"));
outputStream = new BufferedOutputStream(new FileOutputStream("data.txt"));
<예제>
출력결과
import java.io.*;
public class BufferedStreamTest {
public static void main(String[] args) throws IOException{
// TODO Auto-generated method stub
BufferedInputStream in = null;
BufferedOutputStream out = null;
try{
int c;
out = new BufferedOutputStream(new FileOutputStream("data.txt"));
for(int i=0;i<10;i++){
out.write(i);
}
out.flush(); // 버퍼의 내용을 파일에 쓴다.
in = new BufferedInputStream(new FileInputStream("data.txt"));
while((c=in.read())!=-1){
System.out.println(c+" ");
}
}finally{
if(in != null){
in.close();
}
if(out != null){
out.close();
}
}
}
}
->여기서 만약 flush( )가 실행되지 않으면 출력이 나오지 않는다. 그 이유는 아직 버퍼가 다 차지 않았기 때문에 버퍼를 파일에 쓰지 않는다.
|DataInputStream과 DataOutputStream 클래스
기초 자료형 단위로 데이터를 읽고 쓸 수 있다.
<예제>
출력결과
import java.io.*;
public class DataStreamTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
DataInputStream in = null;
DataOutputStream out = null;
try{
int c;
out = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("data.bin")));
out.writeDouble(3.14);
out.writeInt(100);
out.writeUTF("자신의 생각을 바꾸지 못하는 사람은 결코 현실을 바꿀 수 없다.");
out.flush();
in = new DataInputStream(new BufferedInputStream(new FileInputStream("data.bin")));
System.out.println(in.readDouble());
System.out.println(in.readInt());
System.out.println(in.readUTF());
}finally{
if(in != null){
in.close();
}
if(out != null){
out.close();
}
}
}
}
->입력순서와 출력순서의 데이터타입을 동일하게 맞쳐야한다.
|ObjectInputStream과 ObjectOutputStream 클래스
객체의 입출력을 지원. 객체를 파일에 저장할 수 있고 또 반대로 파일에 저장된 객체를 읽어 들일 수 있다.
객체를 파일에 저장하려면 객체가 가진 데이터들을 순차적으로 데이터로 변환하는 절차가 필요 , 이것
을 직렬화(serialization)라고 한다. 어떤 클래스가 직렬화를 지원하려면 Serializable이라는 인터페이스를 구현해야 된다.
<예제 >
현재 날짜 객체를 저장하였다가 다시 읽어서 콘솔에 표시하기
출력결과
package 입출력;
import java.io.*;
import java.util.*;
public class ObjectStreamTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
ObjectInputStream in = null;
ObjectOutputStream out = null;
try{
int c;
out = new ObjectOutputStream(new FileOutputStream("object.dat"));
out.writeObject(new Date());
out.flush();
in = new ObjectInputStream(new FileInputStream("object.dat"));