file, folder 관계와 컴포시트 패턴(Composite pattern)?
파일들을 모아놓은 디렉토리가 폴더다. 파일은 이름을 정하거나 수정할 수 있어야 하고, 크기를 입력받고 불러올 수 있어야한다. 폴더는 파일들을 추가하거나, 폴더 안에 폴더를 추가할 수 있다. 또 폴더의 크기를 불러오거나, 파일 삭제, 폴더 삭제 등의 기능이있다. 이렇게 파일과 폴더의 관계를 컴포시트 패턴(compostite pattern)이라고 한다. 단일 객체(Single Instance)든 객체들의 집합(Group of Instances)든 같은 방법으로 취급하는 것이다. 다시 말해, 객체들과 객체들 간의 집합 처리 방법의 차이가 없을 경우 사용하면 된다. 여기서 컴포시트의 의미는 일부 또는 그룹을 표현하는 객체들을 트리 구조로 구성한다는 것이다. (출처 https://jdm.kr/blog/228)
간단하게 파일과 폴더의 관계를 클래스들로 표현해 보았다.
package my.examples.javaexam.FolderExam; public class File { private String name; private long length; public File(String name){ this.name = name; } public void rename(String name){ this.name = name; } public String getName(){ return name; } public void setLength(long length){ this.length = length; } public long getLength(){ return length; } }
package my.examples.javaexam.FolderExam; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Folder { private String name; private List<File> files; private List<Folder> folders; public Folder(String name){ this.name = name; files = new ArrayList<>(); folders = new ArrayList<>(); } public void rename(String name){ this.name = name; } public String getName(){ return name; } //파일 추가, 폴더 추가 오버로딩 public void add(File file){ files.add(file); } public void add(Folder folder){ folders.add(folder); } public void deleteFile(String fileName){ Iterator<File> iterator = files.iterator(); while(iterator.hasNext()){ File file = iterator.next(); if(file.getName().equals(fileName)){ iterator.remove(); break; } } } public void deleteFolder(String folderName){ Iterator<Folder> iterator = folders.iterator(); while(iterator.hasNext()){ Folder folder = iterator.next(); if(folder.getName().equals(folderName)){ iterator.remove(); break; } } } public long getLength(){ long length = 0; for(File file : files){ length = length + file.getLength(); } for(Folder folder : folders){ length = length + folder.getLength(); } return length; } public Iterator<File> fileIterator(){ return files.iterator(); } public Iterator<Folder> folderIterator(){ return folders.iterator(); } }
package my.examples.javaexam.FolderExam; public class FolderFileExam { public static void main(String[] args){ File java1 = new File("java1.txt"); File java2 = new File("java2.txt"); File readme = new File("readme.txt"); File hello = new File("hello"); Folder mywork = new Folder("C:\\mywork"); Folder java = new Folder("java"); Folder doc = new Folder("doc"); mywork.add(java); mywork.add(doc); java.add(java1); java.add(java2); doc.add(readme); mywork.add(hello); java1.setLength(100); java2.setLength(200); readme.setLength(400); hello.setLength(500); System.out.println(mywork.getLength()); System.out.println(java.getLength()); System.out.println(doc.getLength()); } }
'Java' 카테고리의 다른 글
Day 7. 과제 (0) | 2018.12.12 |
---|---|
Day 6. Java 로또 프로그램(객체지향) (0) | 2018.12.12 |
Day 5. Collection framework(자료구조) (0) | 2018.12.10 |
Day 4. 과제 (0) | 2018.12.10 |
Day 4. 콜바이 레퍼런스 (0) | 2018.12.09 |