ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JAVA]객체 지향 디자인 패턴 - Composite Pattern(컴포지트 패턴)
    프로그래밍/Java 2022. 3. 29. 16:31
    반응형

    Composite Pattern이란?

    • Composite는 '합성물', '혼합', '혼성' 등 이라는 뜻을 가지고 있음 
    • 합성한 객체들의 집합이라는 개념으로 이해하면 됨
    • 컴포지트 패턴은 트리구조를 작성하고 싶을 때 사용하며, 전체- 부분 관계를 표현하는 것이다.
    • 폴더 시스템과 같다고 보면 된다. 폴더를 하나에 두고 이 폴더는 다른 폴더 안에 들어갈 수도 있고, 하위 계층의 객체들도 가지고 있을 수 있다.

    Composite Pattern Structure(장식자 패턴 구조)이란?

    • 상위 클래스(Component)를 두고 하위에 Leaf들을 둔다.
    • 하위 Leaf들은 Composite형태로 Leaf들을 담아두는 복합체 일 수도 있고, 그냥 단순 하나의 Leaft일 수도 있다.
    • 하위 Leaf들은 동작하는 메소드를 상속받아 재정의 하여 사용한다.
    • 위와 같은 구조가 depth를 가진다면 아래와 같은 구조를 가질 수 있다.

    Composite Pattern Example

    출처. 얄팍한 코딩사전

    • FileSystem을 Composite 패턴으로 정의 해 보자.
    • Folder가 2개 있고 한 폴더는 상위 폴더 한에 있으며, 상위 폴더는 하나의 파일도 가지고 있다.
    • 하위 폴더에는 2개의 파일을 가지고 있다.
    • 위와 같은 경우를 코딩하여 작성해 보고 삭제까지 하는 프로그래밍을 해보자.

     

    FileSystem 인터페이스

    public interface FileSystem {
    	public int getSize();
    	public void remove();
    }

    File 객체 클래스

    public class File implements FileSystem{
    	private String name;
    	private int size;
    	
    	public File(String name, int size) {
    		
    	}
    	
    	@Override
    	public int getSize() {
    		System.out.println(name + "파일 크기 : " + size);
    		return size;
    	}
    	
    	@Override
    	public void remove() {
    		System.out.println(name + "파일 삭제");
    	}
    }

    Folder 객체 클래스

    public class Folder implements FileSystem{
    	private String name;
    	private ArrayList<FileSystem> includeds = new ArrayList<>();
    
    	public Folder (String name) {
    		name = name;
    	}
    	public void add(FileSystem fileSystem) {
    		includeds.add(fileSystem);
    	}
    	
    	@Override
    	public int getSize() {
    		int total = 0;
    		for(FileSystem included : includeds) {
    			total += included.getSize();
    		}
    		System.out.println(name + "폴더 크기 : " + total);
    		System.out.println("-- - - - -");
    		return total;
    	}
    
    	@Override
    	public void remove() {
    		for(FileSystem included: includeds) {
    			included.remove();
    		}
    		System.out.println(name + "폴더 삭제");
    		System.out.println("------------");
    	}
    	
    }
    • Folder에는 ArrayList를 이용하여 파일들이나 폴더들을 관리 할수 있도록 작성되어져 있는걸 볼 수 있다.(다형성 원리)
    • 이 ArrayList를 이용하여 리스트안에 객체들의 합을 구해 size를 반환해 줄 수 있으며, 제거도 할 수 있다. 
    • 상위 폴더를 삭제한다고 가정해 볼 때, 하위에 폴더가 3개가 있다고 가정해 보아도 included.remove라는 메소드를 호출하게 되어 똑같이 for문을 돌리게 되므로 하위 폴더를 삭제하는 로직이 똑같이 사용가능하게 되어져있다.
    public class CompositeTest {
    
    	public static void main(String[] args) {
    		Folder schoolFolder = new Folder("학교");
    		
    		Folder grade1Folder = new Folder("1학년");
    		Folder grade2Folder = new Folder("2학년");
    		
    		schoolFolder.add(grade1Folder);
    		schoolFolder.add(grade2Folder);
    		
    		File enterPhoto = new File("입학사진", 256);
    		grade1Folder.add(enterPhoto);
    		
    		Folder sem1Folder = new Folder("1학기");
    		Folder sem2Folder = new Folder("1학기");
    		
    		grade2Folder.add(sem1Folder);
    		grade2Folder.add(sem2Folder);
    		
    		File lecturePlan = new File("강의계획서", 120);
    		sem1Folder.add(lecturePlan);
    		
    		Folder projFolder = new Folder("프로젝트");
    		sem2Folder.add(projFolder);
    		
    		File draft = new File("드래프트", 488);
    		File finalResult = new File("결과물", 560);
    		
    		projFolder.add(draft);
    		projFolder.add(finalResult);
    		
    		schoolFolder.getSize();
    		schoolFolder.remove();
    	}
    }

    Composite Pattern 사용 이유

    • 내부파일들을 검색하는 로직을 만들 때 사용 가능하다.
    • 하나의 묶음으로 객체를 관리하고 싶을 때 사용한다.
    반응형

    댓글

Designed by Tistory.