Member
package xyz.itwill.io;
// 객체 직렬화 (Object Serialization) : 객체를 byte 배열로 변환하여 입력
// 처리되기 위한 기능을 제공
// 클래스를 객체 직렬화 처리하는 방법 - 객체 직렬화 클래스
// 1.Serializable 인터페이스를 상속받아 클래스 작성
// > Serializable 인터페이스에 추상메소드가 없으므로 오버라이드 선언 불필요
// > 객체의 모든 필드값을 byte 배열로 변환하여 입력 또는 출력 처리
// 2.Externalizable 인터페이스를 상속받아 클래스 작성
// > Externalizable 인터페이스의 readExternal(ObjectInput in)와 writeExternal(ObjectOutput out)
// 추상메소드를 반드시 오버라이드 선언
// > 오버라이드 선언된 메소드에서 원하는 필드값만을 byte 배열로 변환하여 입력 또는 출력 처리
// 처리되기 위한 기능을 제공
// 클래스를 객체 직렬화 처리하는 방법 - 객체 직렬화 클래스
// 1.Serializable 인터페이스를 상속받아 클래스 작성
// > Serializable 인터페이스에 추상메소드가 없으므로 오버라이드 선언 불필요
// > 객체의 모든 필드값을 byte 배열로 변환하여 입력 또는 출력 처리
// 2.Externalizable 인터페이스를 상속받아 클래스 작성
// > Externalizable 인터페이스의 readExternal(ObjectInput in)와 writeExternal(ObjectOutput out)
// 추상메소드를 반드시 오버라이드 선언
// > 오버라이드 선언된 메소드에서 원하는 필드값만을 byte 배열로 변환하여 입력 또는 출력 처리
import java.io.Serializable;
// 회원정보(아이디, 이름, 전화번호)를 저장하기 위한 클래스 - VO 클래스
// > 객체 단위로 입력 또는 출력 처리하기 위한 클래스는 반드시 객체 직렬화 클래스로 선언
public class Member implements Serializable {
// 객체 직렬화 클래스는 클래스를 구분하기 위한 고유값이 저장된 serialVersionUID 필드를
// 선언하는 것을 권장 - 필드의 자료형은 long으로 설정하고 static과 final 제한자 사용
// > 이클립스에서는 고유값이 저장된 serialVersionUID 필드를 자동 생성하는 기능 제공
private static final long serialVersionUID = -3306639107947980039L;
private String id;
private String name;
private String phone;
public Member() {
// TODO Auto-generated constructor stub
}
public Member(String id, String name, String phone) {
super();
this.id = id;
this.name = name;
this.phone = phone;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
@Override
public String toString() {
return "아이디 = "+id+", 이름 = "+name+", 전화번호 = "+phone;
}
}
MemberSaveApp
package xyz.itwill.io;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
// 회원정보 를 파일에 전달하여 저장하는 프로그램 작성
public class MemberSaveApp {
public static void main(String[] args) throws IOException {
ObjectOutputStream out=new ObjectOutputStream(new FileOutputStream("c:/data/member.txt"));
// out.writeObject(Object o) 메소드 호출시 NotSerializableException 발생
// NotSerializableException : 객체 직렬화 처리되지 않은 클래스의 객체를 출력스트림으로
// 전달할 경우 발생되는 예외
// > 출력스트림으로 전달될 객체의 클래스를 객체 직렬화 처리하면 예외 미발생
out.writeObject (new Member ("abc123", "홍길동", "010-3174-1234"));
out.writeObject (new Member ("def456", "임꺽정", "010-2145-8741"));
out.writeObject (new Member ("ghi789", "전우치", "010-9813-6547"));
out.close();
System.out.println("c:\\data\\object.txt 파일에 회원정보를 저장 하였습니다.");
}
}
c:\data\object.txt 파일에 회원정보를 저장 하였습니다.
MemberLoadApp
package xyz.itwill.io;
import java.io.EOFException;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
// 파일에 저장된 회원정보(Member)를 제공받아 출력하는 프로그램 작성
public class MemberLoadApp {
public static void main(String[] args) throws IOException, ClassNotFoundException {
ObjectInputStream in = new ObjectInputStream (new FileInputStream("c:/data/member.txt"));
System.out.println("<<회원목록>>");
while(true) {
try {
// ObjectInputStream.readObject() 메소드 호출시 파일 커서가 EOF 위치에 있는 경우 EOFException 발생
Member member = (Member)in.readObject();
System.out.println(member);
} catch (EOFException e) {
break;
}
}
in.close();
}
}
아이디 = abc123, 이름 = 홍길동, 전화번호 = 010-3174-1234
아이디 = def456, 이름 = 임꺽정, 전화번호 = 010-2145-8741
아이디 = ghi789, 이름 = 전우치, 전화번호 = 010-9813-6547
NotepadApp
// 문서파일 편집기 프로그램 작성 - 메모장
public class NotepadApp extends JFrame {
private static final long serialVersionUID = 1L;
JTextArea jTextArea;
JMenuItem init, open, save, exit;
// FileDialog 클래스 : 파일을 선택하기 위한 다이얼로그를 생성하기 위한 컴퍼넌트 클래스
FileDialog openDialog, saveDialog;
// 현재 작업중인 문서파일의 경로를 저장하기 위한 필드
private String filepath;
public NotepadApp(String title) {
super(title);
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenu = new JMenu("파일(F)");
jMenu.setMnemonic('F');
// 메뉴아이템을 선택할 경우 ActionEvent 발생
init = new JMenuItem("새로 만들기(N)", 'N');
open = new JMenuItem("열기(O)", 'O');
save = new JMenuItem("저장(S)", 'S');
exit = new JMenuItem("끝내기(X)", 'X');
init.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_N, InputEvent.CTRL_DOWN_MASK));
open.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_O
, InputEvent.ALT_DOWN_MASK+InputEvent.SHIFT_DOWN_MASK));
save.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S
, InputEvent.ALT_DOWN_MASK+InputEvent.SHIFT_DOWN_MASK));
jMenu.add(init);
jMenu.add(open);
jMenu.add(save);
jMenu.addSeparator();
jMenu.add(exit);
jMenuBar.add(jMenu);
setJMenuBar(jMenuBar);
jTextArea = new JTextArea();
jTextArea.setFont(new Font("굴림체", Font.PLAIN, 20));
JScrollPane jScrollPane=new JScrollPane(jTextArea);
getContentPane().add(jScrollPane, BorderLayout.CENTER);
openDialog = new FileDialog(this, "열기", FileDialog.LOAD);
saveDialog = new FileDialog(this, "저장", FileDialog.SAVE);
init.addActionListener(new NodepadEventHandle());
open.addActionListener(new NodepadEventHandle());
save.addActionListener(new NodepadEventHandle());
exit.addActionListener(new NodepadEventHandle());
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(450, 150, 1000, 600);
setVisible(true);
}
public static void main(String[] args) {
new NotepadApp("제목 없음 - Java 메모장");
}
public class NodepadEventHandle implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
Object eventSource = e.getSource();
if(eventSource == init) {
jTextArea.setText("");//JTextArea 컴퍼넌트 초기화
filepath = "";//필드 초기화
setTitle("제목 없음 - Java 메모장");//프레임 제목 초기화
} else if(eventSource == open) {
// 열기 관련 파일 다이얼로그를 화면에 출력
// > 파일을 선택하거나 선택을 취소한 경우 파일 다이얼로그는 자동으로 숨김 처리
openDialog.setVisible(true);
// FileDialog.getFile() : 선택된 파일의 이름을 반환하는 메소드
if(openDialog.getFile() == null)
return; //파일 선택을 취소한 경우 메소드 종료
// FileDialog.getDirectory() : 선택된 파일의 디렉토리 경로를 반환하는 메소드
filepath = openDialog.getDirectory()+openDialog.getFile();//선택된 파일의 경로 저장
setTitle(openDialog.getFile()+" - Java 메모장");
try {
// 파일 경로를 제공받아 파일 입력스트림 생성
BufferedReader in = new BufferedReader(new FileReader(filepath));
jTextArea.setText("");//JTextArea 컴퍼넌트 초기화
while(true) {
// 파일에 저장된 값을 한줄씩 읽어 문자열로 반환받아 저장
String text=in.readLine();
if(text == null)
break; //파일내용이 없는 경우 반복문 종료
// 변수에 저장된 문자열을 JTextArea 컴퍼넌트에 추가하여 출력
jTextArea.append(text+"\n");
}
in.close();
} catch (FileNotFoundException exception) {
JOptionPane.showMessageDialog(null, "파일을 찾을 수 없습니다.");
} catch (IOException exception) {
JOptionPane.showMessageDialog(null, "프로그램에 문제가 발생 하였습니다.");
}
} else if(eventSource == save) {
if(filepath == null || filepath.equals("")) {
// 저장 관련 파일 다이얼로그를 화면에 출력
saveDialog.setVisible(true);
if(saveDialog.getFile() == null) return;//파일 선택을 취소한 경우 메소드 종료
filepath = saveDialog.getDirectory() + saveDialog.getFile();//선택된 파일의 경로 저장
setTitle(saveDialog.getFile() + " - Java 메모장");
}
try {
// 파일 경로를 제공받아 파일 출력스트림 생성
BufferedWriter out=new BufferedWriter(new FileWriter(filepath));
// JTextArea 컴퍼넌트의 모든 문자열을 반환받아 저장
String text=jTextArea.getText();
// 반환받은 문자열을 파일 출력스트림으로 전달하여 저장
out.write(text);
out.close();
} catch (IOException exception) {
JOptionPane.showMessageDialog(null, "프로그램에 문제가 발생 하였습니다.");
}
} else if(eventSource == exit) {
System.exit(0);
}
}
}
}
InetAdressApp
package xyz.itwill.net;
// 네트워크(Network) : 두 대이상의 컴퓨터에서 값을 송수신 하기 위한 기능
// 인터넷(Internet) : 현실 세계에 존재하는 모든 컴퓨터들을 연결한 네트워크 통신망 - 프로토콜
// 프로토콜(Protocol) : 인터넷을 사용하기 위한 네트워크 관련 약속 - 통신규약
// > 프로토콜 구조 : 네트워크 계층 > 인터넷 계층(IP) > 전송계층(TCP or UDP) > 응용계층(FTP, HTTP, SMTP 등)
// 호스트(Host) : 네트워크 기능을 사용하는 컴퓨터(프로그램)
// 네트워크 계층 - 이더넷, 라우터, 스위치허브 등
// > 이더넷(Ethernet) : 호스트에서 사용하기 위한 통신 장비
// > 라우터(Router) : 네트워크 그룹과 네트워크 그룹을 연결하기 통신 장비
// > 스위치허브(SwitchHub) : 호스트와 호스트 또는 호스트와 네트워크 그룹을 연결하기 통신 장비
// IP(Internet Protocol) : 인터넷을 사용하기 위한 네트워크 주소(IP 주소)에 대한 통신규약 - IPV4, IPV6
// TCP(Transmission Control Protocol) : 연결형 프로토콜(네크워크 기능을 이용한 연결 후 통신
// 가능)로 신뢰할 수 있는 데이타 전송에 통신규약 - 전송 제어 프로토콜
// > 소켓(Socket) 통신 - 1:1 연결
// UDP(User Datagram Protocol) : 비연결형 프로토콜(네트워크 기능을 이용한 연결 설정 없이 통신 가능)
// 로 신뢰할 수 없는 데이타 전송에 통신규약 - 사용자 데이타그램 프로토콜
// > 고속 통신 - 1:Many 연결
// 응용계층 : 전송계층을 기반으로 생성된 다수의 서비스 프로토콜
// IP 주소 : 인터넷을 사용하기 위해 컴퓨터에 부여하는 네크워크 식별자
// > IPV4 : 32Bit를 이용하여 IP 주소 표현 - 10진수 0~255 범위의 정수값 4개를 [.]으로 구분하여 표현
// > IPV6 : 128Bit를 이용하여 IP 주소 표현 - 16진수 0000~FFFF 범위의 정수값 8개를 [:]으로 구분하여 표현
// > 공인 IP 주소와 사설 IP 주소
// A Class : 10.0.0.0 ~ 10.255.255.255,
// B Class : 172.16.0.0 ~ 172.31.255.255,
// C Class : 192.168.0.0 ~ 192.168.255.255)로 구분
// Netmask 주소 : 네트워크 그룹(SubNet)을 표현하기 위한 주소
// > A Class : 255.0.0.0 - 16,777,216 => 0.X.X.X ~ 127.X.X.X
// > B Class : 255.255.0.0 - 65,536 => 128.X.X.X ~ 191.X.X.X
// > C Class : 255.255.255.0 - 256 => 192.X.X.X ~ 232.X.X.X
// Geteway 주소 : 라우터에 부여된 IP 주소
// DNS 서버 : 도메인(호스트 이름)을 IP 주소로 변환하는 기능의 서비스를 제공하는 컴퓨터
// 도메인(Domain) : 인터넷을 사용하기 위해 네트워크 그룹 또는 호스트에게 부여하는 문자로된
// 네트워크 식별자
// > 도메인 그룹에 등록되어 있어야 호스트 사용 가능 - 도메인 호스트
// 포트번호(Port Number) : 인터넷을 사용하여 데이타를 송수신하기 위한 고유의 통신 경로
// > 네트워크 프로그램은 반드시 0~65535 범위의 포트 중 하나를 사용하여 데이타 전송
// > 0 ~ 1023 : Well-Known Port(HTTP : 80,HTTPS : 443, SMTP : 25, POP3 : 110 등)
// > 1024 ~ 49151 : 네트워크 프로그램 작성시 사용 가능한 포트
// > 49152 ~ 65535 : 일시적으로 사용하는 임시 포트 - Private Port
// 패킷(Packet) : 인터넷에서 데이타를 전송하기 위한 단위 - Java에서는 byte 배열로 표현 가능
// 방화벽(Firewall) : 네트워크를 이용한 접속 및 데이타 전송 차단 또는 허용을 위한 시스템(프로그램)
public class InetAdressApp {
}