Skip to the content.

- 학습 목표 달성 확인 목록

- [] 바이너리 파일과 텍스트 파일을 구분할 수 있는가?

바이너리 파일 포멧:해당 파일 포맷을 다루는 정용 프로그램을 사용해야만 편집할 수 있다

예).class, .hwp, .mp3 등등

텍스트 파일 포멧:전용 프로그램의 도움 없이 텍스트 편집기로 직접 편집할 수 있다

예).txt, .cvs., .html 등등

- [] FileInputStream과 FileOutputStream 클래스의 사용 방법을 아는가?

FileOutputStream out = new FileOutputStream("temp/test3.data");//해당 폴더에 해당 이름으로 저장
int money = 1_3456_7890; // = 0x080557d2
// int 메모리의 모든 바이트를 출력하려면,
    // 각 바이트를 맨 끝으로 이동한 후 write()로 출력한다.
    // 왜?
    // write()는 항상 변수의 마지막 1바이트만 출력하기 때문이다.
    out.write(money >> 24); // 00000008|0557d2
    out.write(money >> 16); // 00000805|57d2
    out.write(money >> 8);  // 00080557|d2
    out.write(money);       // 080557d2

    out.close();//자원해제를 해야한다

    System.out.println("데이터 출력 완료!");
FileInputStream in = new FileInputStream("temp/test3.data");//해당 폴더에서 해당 파일을 읽어온다
    // Exam02_1을 실행하여 출력한 데이터를 read()로 읽는다.
    // => 파일에서 4바이트를 읽어 4바이트 int 변수에 저장하라!
    // => 읽은 바이트를 비트이동 연산자를 값을 이동 시킨 후 변수에 저장해야 한다.
    // => 파일에 들어 있는 값 예: 080557d2
    int value = in.read() << 24;   // 00000008 =>   08000000
    value += (in.read() << 16);    // 00000005 => + 00050000
    value += (in.read() << 8);     // 00000057 => + 00005700
    value += in.read();            // 000000d2 => + 000000d2
    //==========================================>   080557d2

    in.close();

    System.out.printf("%08x\n", value);

- [] 데코레이터 패턴의 구조와 특징을 이해하는가?

모든 부품은 같은 유형이다 즉 같은 부모의 자식인 서브클래스들이다.

다른 부품을 붙일 수 있도록 생성자를 만든다

- [] 자바의 스트리밍 API에 데코레이터 패턴이 적용된 것을 설명할 수 있는가?

FileInputStream in = new FileInputStream("temp/test3.data");
BufferedInputStream in2 = new BufferedInputStream(in);
ObjectInputStream in3 = new ObjectInputStream(in2);

//같은 부모클래스의 자식들을 연달아서 연결한다 생각하면 좋다!

- [] DataInputStream/DataOutputStream 클래스의 용도를 아는가?

자바의 기본 자료형 데이터를 바이트 스트림으로 입출력하는 기능을 제공하는 바이트 스트림이다.

- [] 입출력에 버퍼를 적용했을 때 이점을 아는가?

문자를 하나씩 전달하는 것이 아닌 묶어서 한 번에 전달하믈 전송시간이 적게 걸려 성능이 향상된다

- [] BufferedInputStream/BufferedOutputStream 클래스를 구현할 수 있는가?

- [] ObjectInputStream/ObjectOutputStream 클래스의 용도를 아는가?

/*
        ObjectOutputStream
        DataOutputStream의 기능을 포함한다
        인스턴스를 바이트 배열로 만들어 출력하는 기능이 있다
        단 java.io.Serializable 인터페이스를 구현한 클래스에 대해서만 가능하
         */
        FileOutputStream fileOutputStream = new FileOutputStream("temp/member2.data");
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);

        Member member = new Member();
        member.name = "버질 아블로";
        member.age = 38;
        member.gender = true;
        /*
        writeObject()
        - java.io.Serializable 이 선언된 클래스의 객체만 출력할 수 있다.
        인스턴스의 필드 값을 바이트 뱅ㄹ로 만들어(직렬화) 출력한다
        인스턴스의 필드의 값만 출력하는 것이 아니다
        클래스 이름과 인스턴스 변수의 정보도 함께 출력한다
        출력데이터 = 클래스+인스턴스변수정보+인스턴스 변수 값
         */

        objectOutputStream.writeObject(member);
        /*
        그러나 실행하면 오류가 발생한다
        java.io.NotSerializableException
        인스턴스의 값을 자동으로 바이트 배열로 만들수 있도록 허락하지 않아서 발생한 실행 오류이다

        Member 클래스가 java.io.Serializable을 구현하면
        바이트 배열로 자동 변환하는 것이 가능하다
        writeObject()를 호출하여 인스턴스의 값을 출력할 수 있다
         */
        objectOutputStream.close();

        System.out.println("데이터 출력 완료");
/*
        ObjectInputStream
        DataInputStream의 기능을 포함한다
        ObjectOutputStream.writeObject()로 출력한 바이트 배열을 읽어 인스턴스를 생성하는 기능이 있다
        단 java.io.Serializable 인터페이스를 구현한 클래스여야 한다
        출력할 때 클래스 버전과 읽을 때 클래스의 버전이 같아야 한다
        인스턴스 필드를 생성한 후 직접 필드에 값을 저장한다
        이때는 생성자가 호출되지 않는다
        따라서 초기화시킬 것이 있다면 따로 메서드를 호출해야 한다
         */
        FileInputStream fileInputStream = new FileInputStream("temp/member2.data");
        ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);

//        Serialize로 출력된 데이터를 읽어 다시 원래의 객체로 만들기
        Member member = (Member) objectInputStream.readObject();

        objectInputStream.close();

        System.out.println(member);

- [] 직렬화(serialization)/객체 복원(deserialization)의 동작 원리를 설명할 수 있는가?

직렬화(serialization):객체(인스턴스)–>바이트 배열로 변환

객체 복원(deserialization):바이트 배열–>객체로 복원

- [] 제네릭을 사용하여 다양한 타입의 파라미터 값이나 리턴 값을 처리할 수 있는가?

%[https://gist.github.com/osk2090/5802749982c7806a02ec5fbb6afebba8]