ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SOLID 원칙 (객체지향 5대원칙)
    CS/프로그래밍 공통 2021. 4. 5. 00:59

    1. SRP, Single Reponsibility Principle (단일 책임 원칙)

    • 소프트웨어의 설계 부품(클래스, 함수 등)은 단 하나의 책임(기능)만을 가져야 한다.
    • 프로그램 변경에 영향을 받는 부분이 적어야 함 -> 응집도는 높고, 결합도는 낮은 프로그램

     

    2. OCP, Open-Close Principle (개방-패쇄 원칙)

    • 기존의 코드를 변경하지 않고(Close) 기능을 수정하거나 추가할 수 있도록(Open) 설계해야 한다.
    public class SoundPlayer {
    	public void play() {
        	System.out.println("play was");
        }
    }
    
    public class Client {
    	public static void main(String[] args) {
        	SoundPlayer sp = new SoundPlayer();
            sp.play();
        }
    }
    • MP3 파일을 재생하도록 요구사항이 변경되면 SoundPlayer의 play() 메소드를 수정해야 한다. -> OCP 원칙 위배
    • 수정을 위해서는 우선 변해야 하는 것이 무엇인지 정의 -> play() 메소드가 변해야 하는 부분이고 이 메소드를 인터페이스로 분리
    public interface PlayAlgorithm {
    	public void play();
    }
    
    public class Wav implements PlayAlgorithm {
        @Override
        public void play() {
        	System.out.println("Play Wav");
        }
    }
    
    public class Mp3 implements PlayAlgorithm {
        @Override
        public void play() {
        	System.out.println("Play Mp3");
        }
    }
    
    public class SoundPlayer {
        private PlayAlgorithm file;
        
        public void setFile(PlayAlgorithm file) {
            this.file = file;
        }
    
        public void play() {
        	file.play();
        }
    }
    
    public class Client {
    	public static void main(String[] args) {
        	SoundPlayer sp = new SoundPlayer();
            sp.setFile(new Wav());
            sp.setFile(new Mp3());
            sp.play();
        }
    }

     

    3. LSP, Liskov Substitution Principle (리스코프 치환 원칙)

    • 자식 클래스는 부모 클래스에서 정의한 행위를 수행할 수 있어야 한다.
    • 자식 클래스와 부모 클래스 사이의 행위에는 일관성이 있어야 한다.

     

    4. ISP, Interface Segregation Principle (인터페이스 분리 원칙)

    • 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야 한다.
    • 하나의 일반적인 인터페이스보다는 여러 개의 구체적인 인터페이스가 낫다.

    5. DIP, Dependency Inversion Priciple (의존 역전 원칙)

    • 의존 관계를 맺을 때, 변화하기 쉬운것 보다는 변화하기 어려운 것에 의존해야 한다는 원칙이다.
      • 변화하기 쉬운 것 -> 구체화된 클래스
      • 변화하기 어려운 것 -> 추상 클래스나 인터페이스

    댓글

Designed by Tistory.