Skip to the content.

- 학습 목표 달성 확인 목록

- [] 내부 기억 장치 RAM과 외부 기억 장치 HDD, SSD의 용도를 이해하는가?

RAM:휘발성 메모리로 전원이 켜진동안에만 사용할 값들을 저장한다.그렇지만 전원이 꺼지면 그 값들이 날아간다

HDD/SSD:비휘발성 메모리로 전원이 꺼져도 데이터가 날아가지 않는 형태의 외부 기억장치이다.

HDD는 디스크 형태로 읽기쓰기는 SSD에 비해 느린편이다

SSD는 반도체 형태로 HDD에 비해 속도가 빠른 장점이 있다.

- [] HDD의 데이터 저장 원리를 이해하는가?

내부의 헤드는 디스크가 회전하면서 생기는 공기 흐름을 이용해 플래터에 떠 있는 상태로

데이터를 읽고 쓸 수 있다

헤드는 PC에서 받은 명령어를 바탕으로 플래터 위를 움직이면서 플래터에 코딩되어 있는

자성체에 0과1을 기록해 데이터를 저장하는 방식이다.

- [] HDD의 트랙, 섹터, 실린더를 설명할 수 있는가?

트랙:데이터가 기록되는 부분

섹터:트랙을 이루는 작은 단위,자체적으로 주소를 가지고 있는 스토리지의 단위이다.

실린더:각 드라이브 플래터 표면에 동일한 트랙들의 집합으로 헤드는 트랙 번호가 아닌 실린더 번호를 참조하게 된다.

- [] HDD에 데이터를 저장할 때 수평 기록 방식과 수직 기록 방식을 이해하는가?

오래된 저장방식으로 플래터와 같은 방향으로 자기장을 구성해서 0과 1을 인식한다.

플래터와 수평 방향으로 자기장을 구성하기 때문에 기록 밀도가 떨어져서 요즘 사용하는 방식은 아니다.

플레터에 직각으로 자기장을 구성해서 수평 자기 기록 방식보다 기록 밀도가 많이 증가한 방식으로

요즘 나오는 하드 디스크는 이 방법을 사용한다.

- [] 파일 시스템과 디스크 포맷을 설명할 수 있는가?

윈도우 기준으로는 FAT방식과 NTFS 방식이 있다.

FAT:디지털 카메라등 메모리 카드와 컴퓨터 시스템에 널리 쓰이는 컴퓨터 파일 시스템 구조이며 상대적으로 간단하기 때문에

휴대용 기기에 흔하게 볼수 있다.그렇지만 성능은 다른 대부분의 파일 시스템에 견주어보면 좋지 않은 평을 받는다.

그 이유는 너무나도 단순한 자료 구죠를 이용하여 조그맘ㄴ한 파일이 많으면 디스크 공간을 잘 활용하지 못하기 때문이다.

NTFS:윈도 NT계열 운영체제의 파일 시스템이다 New Technology의 준말이다.

몇가지 개선 사항을 반영하였는데 두드러지는 특징은

복구성:시스템 고장과 디스크 손상을 복구하는 능력이 있다.

보안성:보안을 위해 윈도 NT객체 모델이 적용됐다.

어떤 파일을 열면,해당 파일은 파일의 보안 속성을 관장하는 보안 서술자를 가진 파일 객체로 구현한다.

디스크 포멧은 비어있는 파일 시스템을 설정하고 사용할 저장 매체나 하드 디스크를 준비하는 작업이다.

일반포멧:그냥 실제로 모든 파일 자체를 지우기때문에 시간이 매우 오래 걸린다

빠른포멧:실제로 파일이 지워진것이 아니라 디스크와 연결되어 있던 주소값을 모두 지운다.

그렇기에 시간이 일반포멧에 비해 적게 걸린다.

- [] File 클래스를 사용하여 파일 및 디렉토리를 생성하고 조회하고 삭제할 수 있는가?

public class Exam0110 {

  public static void main(String[] args) throws Exception {
    // File 클래스
    // => 디렉토리나 파일을 다룰 때 사용하는 클래스이다.
    // => 디렉토리나 파일을 생성, 삭제, 변경할 수 있다.

    // 현재 디렉토리를 조회
    // => '.' 으로 표현한다.
    // => JVM을 실행하는 위치가 현재 폴더이다.
    // => 이클립스 : 프로젝트 디렉토리를 가리킨다.
    // => 콘솔 : 현재 명령어를 실행하는 위치를 가리킨다.
    //
    File currentDir = new File("./src/main/java");
    System.out.printf("폴더명: %s\n", currentDir.getName());
    System.out.printf("경로: %s\n", currentDir.getPath());
    System.out.printf("절대경로: %s\n", currentDir.getAbsolutePath());
    System.out.printf("계산된 절대경로: %s\n", currentDir.getCanonicalPath());

    System.out.printf("총크기: %d\n", currentDir.getTotalSpace());
    System.out.printf("남은크기: %d\n", currentDir.getFreeSpace());
    System.out.printf("가용크기: %d\n", currentDir.getUsableSpace());

    System.out.printf("디렉토리여부: %b\n", currentDir.isDirectory());
    System.out.printf("파일여부: %b\n", currentDir.isFile());
    System.out.printf("감춤폴더: %b\n", currentDir.isHidden());
    System.out.printf("존재여부: %b\n", currentDir.exists());
    System.out.printf("실행가능여부: %b\n", currentDir.canExecute());
  }
}

//결과
폴더명: java
경로: ./src/main/java
절대경로: /Users/osk2090/git/exercise_java/./src/main/java
계산된 절대경로: /Users/osk2090/git/exercise_java/src/main/java
총크기: 0
남은크기: 0
가용크기: 0
디렉토리여부: false
파일여부: false
감춤폴더: false
존재여부: false
실행가능여부: false
File dir = new File("temp");//생성할 디렉토리 경로 설정한다
//설정하지 않으면 현재 폴더를 의미한다.
//존재하지 않는 폴더 아래에 새 폴더를 만들면 자동생성이 불가능하다
dir.mkdir()//디렉토리 생성
dir.delete()//디렉토리 삭제

 File file = new File("temp2/a/test.txt");//생성할 파일의 경로 설정
 file.createNewFile() // 파일 생성
 //이미 파일이 있다면 다시 생성이 불가능하다
 //존재하지 않는 폴더에 파일을 생성할 수 없다.
 file.delete()//파일 삭제
 

- [] FileFilter와 FilenameFilter를 사용하여 디렉토리 내용을 선택적으로 조회할 수 있는가?

**-FileFilter 사용**

public class Exam02 implements FileFilter {
    public static void main(String[] args) {
        File testDir = new File("temp");
        File[] fileNameList = testDir.listFiles();
        for (File curFile : fileNameList) {
            System.out.println(curFile.getPath());
        }
    }

    @Override
    public boolean accept(File pathname) {
        return false;
    }
}

-------------------------------------------------------
public interface FileFilter {
    boolean accept(File pathname);
}

-FilenameFilter 사용**

public class Exam01 {
    public static void main(String[] args) {
        File dir = new File("temp");
        File[] fileNameList = dir.listFiles(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                return name.endsWith("data");
            }
        });
        for (File curFile : fileNameList) {
            System.out.println(curFile.getPath());
        }
    }
}

- [] FileInputStream/FileOutputStream 클래스를 사용하여 바이트 단위의 데이터를 읽고 쓸 수 있는가?

  public static void main(String[] args) throws Exception {
    // 1) 파일 데이터 읽기를 담당할 객체를 준비한다.
    // - new FileInputStream(파일경로)
    // - 해당 경로에 파일이 존재하지 않으면 예외가 발생한다.
    //
    FileInputStream in = new FileInputStream("temp/test1.data");

    // 2) 1바이트를 읽는다.
    // => read() 메서드의 리턴 타입이 int 라 하더라도 1바이트를 읽어 리턴한다.
    // => 이유?
    //    0 ~ 255까지의 값을 읽기 때문이다.
    //    byte는 -128 ~ 127까지의 값만 저장한다.
    int b = in.read(); // 읽은 값은 0x4d 이다.
    System.out.printf("%02x\n", b);

    System.out.printf("%02x\n", in.read());
    System.out.printf("%02x\n", in.read());
    System.out.printf("%02x\n", in.read());
    // read() 를 호출할 때마다 이전에 읽은 바이트의 다음 바이트를 읽는다. 

    // 3) 읽기 도구를 닫는다.
    in.close();
  }
}
public class Exam0130 {

  public static void main(String[] args) throws Exception {
    FileInputStream in = new FileInputStream("temp/test1.data");

    // 반복문을 이용하여 여러 바이트를 읽는다.
    int b;
    /*
      while (true) {
        b = in.read();
        if (b == -1) // 파일의 끝에 도달하면 -1을 리턴한다.
          break;
        System.out.printf("%02x ", b);
      }
     */
    while ((b = in.read()) != -1) {
      System.out.printf("%02x ", b);
    }

    in.close();
  }

}

- [] 문자열을 특정 문자 집합으로 인코딩 된 바이트 배열로 뽑아낼 수 있는가?

public class Exam0210 {

  public static void main(String[] args) throws Exception {

    // 현재 디렉토리는 프로젝트 폴더이다.
    //
    FileOutputStream out = new FileOutputStream("temp/test1.data");

    byte[] bytes = new byte[] {0x7a, 0x6b, 0x5c, 0x4d, 0x3e, 0x2f, 0x30};

    // write(byte[]) : 배열의 값 전체를 출력한다.
    // write(byte[], 시작인덱스, 출력개수) : 시작 위치부터 지정된 개수를 출력한다.
    //
    out.write(bytes); // 바이트 배열 전체를 출력한다.

    out.close();

    System.out.println("데이터 출력 완료!");

  }

}