본문 바로가기

3월 ~ 5월) 자바/java

21Day - Member & MemberSaveApp & MemberLoadApp / NotepadApp / / InetAdressApp

Member

package xyz.itwill.io;
// 객체 직렬화 (Object Serialization) : 객체를 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 {
}