KOSTA
KOSTA 교육 (File, Thread)
코린이 연대기
2021. 3. 5. 09:39
배운 내용
- File Class
- Thread
1. File Class
파일클래스는?
파일 자체를 관리하는 클래스로서 파일에 대한 다양한 기능을 제공한다.
- 파일클래스의 메소드의 종류는 아래와 같다.
- 파일정보를 가져오는 메소드, 정보를 수정하는 메소드, 생성 및 삭제하는 메소드
- 마지막으로 디렉토리 관리가 있다.
- 사용하는 이유 : File을 객체화하여 그 파일을 활용하기 위함
예시를 참고하여 메소드의 활용을 알아보자
여기서 예제를 http://hyeonstorage.tistory.com/233 페이지에서 잘 정리해주고 있어 참고하여 예제를 활용하였다.
- 먼저 “.” 을 경로로 가진 File 객체를 생성한다. 생성은 new로 동일하게 생성한다.
- file.exists()로 존재를 알 수 있다.
- getName()으로 이름을 출력, getPath()로 경로를 출력, getAbsolutePath()로 절대경로를 출력, getCanonicalPath()로 정규경로 출력, getParent()로 상위 폴더를 출력한다.
- canWrite()는 파일을 쓸 수 있는지 권한을 체크, canRead()는 읽을 수 있는지 체크
- isFile()은 파일이 있는지 여부를 체크, isDirectory는 폴더를 체크
- 컴파일을 하면 경로에 “ . ” 이 들어간 파일들이 출력이 된다.
- 자주 사용하는 메소드이므로 차근차큰 하나씩 사용해보면서 익히는 것이 좋겠다.
다음 예제를 보며 활용해보자
- 이번 예제는 해당 경로에 존재하는 디렉토리와 내에 있는 파일을 출력하는 예제이다.
- 먼저 디렉토리가 아니면 전부 파일일 것이기 때문에 존재하지 않거나, 디렉토리가 아니라면 디렉토리가 아닌 것이니 예외문을 던진다.
- File리스트를 디렉토리로서 배열로 생성하고 반복을 하는데 이 때 list[i]가 디렉토리라면 조건을 만족하니 디렉토리가 출력되어야 할 것이고 중요한 점은 재귀함수를 선언하여 다시 조건을 반복시킨다.
- 조건을 만족하지 않으면 파일이 나올 것이기 때문에 파일을 출력한다.
- Main 메소드에서 는 내가 선언했던 주소값이 선언되어있다.
- 반드시 예외처리를 해주어야 하기 때문에 try, catch문을 사용하여 fileList내에 File(path)객체를 생성하여 출력한다.
다음 예제는 FileInput,OutputStream을 사용하여 파일을 복사하는 예제를 보자
- 먼저 source를 dest로 복사를 하려면 두 변수를 먼저 Main메소드에 선언을 한다.
- 다음 이 두가지를 복사하기 위하여 메소드 변수 파라미터 값을 File source와 dest로 선언하고 예외를 던진다.
- 여기서 count를 선언하는데 이유는 추후에 나온다.
- 입출력 스트림을 null값으로 생성한다. 이 때 Input,Output스트림은 바이트 형식이기 때문에 바이트 배열을 생성한다.
- try, catch문을 사용하여 스트림 객체를 생성해주고 read와 write를 반복해야하기 때문에 while문을 사용하여 반복해준다. 이 때 true값은 배열을 읽을 때 -1이 되지 않으면 이라는 조건인데 이는 read로 읽을 때 더 이상 읽을게 없으면 -1을 출력하게 된다. 때문에 -1이 되면 반복문이 거짓이 되어 벗어난다.
- 그래서 -1이 아닌이상 계속 반복하면서 out변수에 배열을 읽고 작성을 하게 된다.
- 다음 close()로 벗어나면 되겠다.
다음 예제는 디렉토리와 디렉토리 내 파일을 함께 복사하는 예제를 보자
- 디렉토리를 복사하기 위하여 파라미터를 2개 선언하였고 dest에 복사를한다.
- 현재 dest가 비어있는 디렉토리이기 때문에 mkdir()로 임시의 디렉토리를 생성한다.
- 현재 존재하는 디렉토리를 불러들이기 위하여 해당 디렉토리의 배열을 생성한다.
- 생성한 배열을 for문으로 반복하고 조건문을 생성한다.
- 만약 sourceFile이 디렉토리라면 복사를 해야하는데 현재 dest는 가상으로 만들어진 디렉토리이고 sourceFile의 디렉토리를 바로 복사하면 source와 이름이 다른 디렉토리가 복사가 된다. 때문에 dest를 새롭게 객체를 만들어 dest와 source.getName을 선언하여 동일화 시켜준 후에 그 변수값을 copy한다.
- 디렉토리가 아니라면 파일일 것이기 때문에 동일한 방법으로 복사를 한다.
물론 파일을 복사하는 예제는 이전 예제와 동일하게 작성하였다.
- Main메소드에서 복사할 디렉토리 객체를 선언하고 출력한다.
2. Thread(스레드)
스레드는?
프로그램의 실행 흐름을 나타낸다.
- 싱글스레드 : 스레드가 하나 뿐이다.
- 멀티스레드 : 스레드가 둘 이상사용
- Runnable은 스레드를 사용할 수 있을 때 사용하고 Not Runnable은 사용할 수 없을 때 사용한다. 주의할 점은 Runnable을 상속하게 되면 Thread를 추가로 생성해야한다.
- Sleep메소드는 예외처리를 꼭 해야한다. 때문에 try, catch문을 사용한다.
- Critical section : 스레드 실행 중 다른 스레드로 제어가 넘어가면 문제를 일으킨다.
그래서 동기화를 진행하여 공유데이터를 사용하지 않게끔 해줘야 한다.
프로세스와 스레드의 차이점은 ?
- 프로세스 : 프로그램의 단위
- 스레드 : 프로그램 내의 실행 흐름
예제를 보면서 실습해보자
- Thread를 상속하는 Main메소드에서 Thread 객체를 생성을 하고 start메소드를 통하여 출력시킨다.
- 그리고 그 출력문은 for문을 이용하여 char 타입으로 A부터 Z까지 출력시킨다.
- Thread1를 상속한 Thread클래스를 만들고 오버라이딩 통하여 run이라는 메소드를 가지고 for문을 통하여 반복하여 출력한다.
- Thread의 특성상 cpu의 간섭을 받아 두개의 출력문 중 마구잡이로 하나가 먼저 출력이 되고 나머지가 출력이 된다.