조건에 맞는 목록만 필요할 때는 아래의 예에 있는 DirFilter클래스를 사용한다.
실행 결과로 얻은 목록을 알파벳순으로 정렬할 때는 java.util.Arrays.sort()메소드와 com.hkp.util.AlphabeticComparator클래스를 함께 사용한다.
DirFilter에서는 FilenameFilter인터페이스를 implements한다. FilenameFileter인터페이스는 java.io 패키지에 있으며, 여기에는 추상 메소드인 accept()가 정의되어 있다. 위의 예에서는 DirFilter클래스에서 이 인터페이스를 implements하여 accept()메소드를 구현하고 있다. File클래스의 list()메소드에서는 이 인터페이스 타입의 객체를 인자로 받으므로, list()메소드를 호출할 수 있으며, 결과적으로는 DirFilter에 정의된 accept()메소드를 실행하여 선택할 파일명을 결정하게 된다. 이와 같은 기법을 콜백(callback)이나 functor 또는 커맨드 패턴(command pattern)이라 한다. 여기서는 DirFilter가 functor이다.콜백되어 호출되는 메소드를 가지고 있는 역할만을 하기 때문이다.) list() 메소드에서는 FilenameFilter 객체를 인자로 받는다. 즉, FilenameFilter 인터페이스를 implements하는 클래스의 객체라면 어느 것이든 인자로 전달할 수 있다는 의미이다. 이와 같이 콜백을 이용하면 객체의 타입에 따라 서로 다른 내용의 accept() 메소드를 실행할 수 있으므로, 유연한 코드를 작성할 수 있다.
우리가 필요한 것은 파일명이므로, 인자로 받은 String으로 File객체를 생성한 다음에 getName()메소드를 호출하여 경로(path)정보를 떼어내면 된다. 그 다음에 이 경로 정보에 우리가 명령행 인자로 준 문자열이 있는지를 검사하면 된다. 이때는 String클래스의indexOf() 메소드를 호출하여 멤버 변수 afn의 값과 일치하는 문자열이 경로 정보에 있는지를 검사한다. 만일 있으면, 그 문자열이 있는 위치의 인덱스 값이 리턴되지만, 없으면 -1이 리턴된다.
list()메소드는 배열을 리턴하므로, 리턴된 결과를 우리가 쉽게 처리할 수 있다. 메소드의 인자나 리턴값으로 이와 같이 배열을 쉽게 주고받을 수 있다는 것은 C 나 C++에 비해 매우 향상된 것이다.
>> DirList를 익명 내부 클래스를 사용하여 고침 <<
[발췌] 정석으로 배우는 Thinking in JAVA 개정판 11장 p.464
'Dev. 자바 > 참고소스' 카테고리의 다른 글
[JAVA] 코딩 표준에 맞는지 검사하기(HashMap, Iterator, Properties,StreamTokenizer) (0) | 2013.01.23 |
---|---|
[JAVA] GZIP 포맷으로 데이터 압축/해제하기 (0) | 2013.01.23 |
[자바 소스] PL/SQL 자바에서 이용하기 예제 소스 (0) | 2012.09.10 |
[자바 소스] JDBC를 이용한 sqlplus 구현하기! 이름하여 sqlminus~!!! (0) | 2012.09.06 |
[자바 소스] JDBC를 이용한 회원관리 프로그램 (6) | 2012.09.05 |