ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] λ””μžμΈ νŒ¨ν„΄(Composite νŒ¨ν„΄)
    μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ 2021. 5. 18. 00:45
    λ°˜μ‘ν˜•
    • 이 글은 "μ–„νŒν•œ 코딩사전 객체지ν–₯ λ””μžμΈνŒ¨ν„΄ Youtube μ˜μƒ"을 보고 μ°Έκ³ ν•˜μ—¬ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

    Composite νŒ¨ν„΄μ΄λž€?

    • Composite νŒ¨ν„΄μ€ λ³΅μž‘ν•œ 섀계λ₯Ό ν•  λ•Œ 주둜 μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄μœΌλ‘œ 컴퓨터 파일 μ‹œμŠ€ν…œμ„ μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.

    • 컴퓨터 파일 μ‹œμŠ€ν…œμ—μ„œλŠ” 폴더 내뢀에 νŒŒμΌλ„ λ“€μ–΄κ°ˆ 수 μžˆμ§€λ§Œ, 폴더 μžμ²΄λ„ λ“€μ–΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€. λ˜ν•œ, 파일과 ν΄λ”λŠ” λ‹€λ₯Έ μ‘΄μž¬μ§€λ§Œ 각각 크기가 μ‘΄μž¬ν•˜κ³  이름 λ°”κΎΈκΈ°, μ‚­μ œν•˜κΈ° λ“±κ³Ό 같은 λͺ…λ Ήμ–΄λŠ” κ³΅ν†΅μ μœΌλ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€.

    • 이처럼 Composite νŒ¨ν„΄μ€ ν¬ν•¨λ˜λŠ” 객체와 ν¬ν•¨ν•˜λŠ” 객체가 λ™μΌν•˜κ²Œ λ‹€λ€„μ§ˆ λ•Œ μ‚¬μš©ν•˜λŠ” νŒ¨ν„΄μž…λ‹ˆλ‹€.


    Composite μ‚¬μš©

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

    FileSystem μΈν„°νŽ˜μ΄μŠ€μ—μ„œλŠ” μš©λŸ‰μ„ κ΅¬ν•˜λŠ” ν•¨μˆ˜μΈ getSize와 FileSystem을 κ΅¬ν˜„ν•œ 클래슀의 정보λ₯Ό λ°˜ν™˜ν•˜λŠ” printInfo λ©”μ†Œλ“œλ₯Ό κ΅¬ν˜„ν•˜λ„λ‘ κ°•μ œν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

    public class File implements FileSystem{
        private String name;
        private int size;
    
        public File(String name, int size) {
            this.name = name;
            this.size = size;
        }
    
        @Override
        public int getSize() {
            return size;
        }
    
        @Override
        public void printInfo() {
            System.out.println("File name : "+name + "size : "+size);
        }
    }

    File ν΄λž˜μŠ€λŠ” FileSystem μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ 클래슀둜 μƒμ„±μžλ₯Ό 톡해 파일의 이름과 크기λ₯Ό 받을 수 μžˆμŠ΅λ‹ˆλ‹€.

    public class Folder implements FileSystem{
        private String name;
        private ArrayList<FileSystem> includes = new ArrayList<>();
    
        public void add(FileSystem fileSystem){
            includes.add(fileSystem);
        }
    
        @Override
        public int getSize() {
            int total = 0;
            for(FileSystem file : includes){
                total+=file.getSize();
            }
            return total;
        }
    
        @Override
        public void printInfo() {
            System.out.println("Folder name : "+name+" size : "+getSize());
        }
    }
    • Folder ν΄λž˜μŠ€λ„ Fileκ³Ό λ§ˆμ°¬κ°€μ§€λ‘œ FileSystem μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•œ ν΄λž˜μŠ€μ§€λ§Œ λ©€λ²„λ³€μˆ˜λ‘œ FileSystem을 λ‹΄λŠ” 배열을 가지고 μžˆμŠ΅λ‹ˆλ‹€. Folder 내뢀에 File ν΄λž˜μŠ€κ°€ λ“€μ–΄κ°ˆ 수 있고 Folder 클래슀 μžμ²΄κ°€ λ“€μ–΄κ°ˆ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • 이 ν΄λž˜μŠ€μ—μ„œ 내뢀에 ν¬ν•¨λ˜λŠ” FileSystem을 λͺ¨λ‘ μΆ”κ°€ν•˜λŠ” ν•¨μˆ˜μΈ add λ©”μ†Œλ“œκ°€ κ΅¬ν˜„λ˜μ–΄ 있고, λͺ¨λ“  μš©λŸ‰μ„ ν•©ν•˜μ—¬ κ³„μ‚°ν•˜λŠ” getSize λ©”μ†Œλ“œκ°€ μ˜€λ²„λΌμ΄λ”© λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. printInfo도 λ§ˆμ°¬κ°€μ§€λ‘œ μ˜€λ²„λΌμ΄λ”©ν•˜μ—¬ Folder의 이름과 내뢀에 λ“€μ–΄μžˆλŠ” FileSystem의 μš©λŸ‰λ“€μ„ ν•©ν•˜μ—¬ 좜λ ₯ν•˜λ„λ‘ κ΅¬ν˜„λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

    κ²°κ³Ό

    public class Main{
        public static void main(String[] args) {
            Folder folder1 = new Folder("Folder 1");
            folder1.add(new File("File 1-1",10));
            folder1.add(new File("File 1_2",20));
            folder1.printInfo();
    
            Folder folder2 = new Folder("Folder 2");
            folder2.add(new File("File 2",10));
            folder2.add(folder1);
            folder2.printInfo();
    
            Folder folder3 = new Folder("Folder 3");
            folder3.add(folder2);
            folder3.printInfo();
    
            /**
             *                 Folder 3
             *                    |
             *                 Folder 2
             *                /     \
             *            File2     Folder 1
             *                      /       \
             *                  File1-1    File1-2
             * 
             * Folder name : Folder 1, size : 30
             * Folder name : Folder 2, size : 40
             * Folder name : Folder 3, size : 40
             */
        }
    }

    FileSystem μΈν„°νŽ˜μ΄μŠ€λ₯Ό κ΅¬ν˜„ν•˜λŠ” 클래슀 Fileκ³Ό Folder 클래슀만으둜 λ‹€μŒκ³Ό 같이 λ³΅μž‘ν•œ 섀계λ₯Ό ν•  λ•Œ μš©μ΄ν•˜κ²Œ ν•  수 μžˆλŠ” νŒ¨ν„΄μ΄ λ°”λ‘œ Composite νŒ¨ν„΄μž…λ‹ˆλ‹€.

    λ°˜μ‘ν˜•
Designed by Tistory.