1. 객체 지향의 원칙 중 3가지
1.1 SRP (단일 책임 단일 원칙, Single Responsibility Principle)
클래스가 하나의 기능만을 수행하고, 그 기능에 대한 모든 것을 해당 클래스가 책임진다.
SRP를 사용하면 코드의 응집도가 높아지고, 결합도가 낮아지며, 유지보수와 확장이 쉬워진다.
1.2 OCP (개방-폐쇄 원칙, Open-Closed Principle)
토끼를 고양이로 수정하는 대신 죄인이라는 추상 클래스를 만들어 추상 클래스에 매개변수로 값을 넣는다.
소프트웨어 엔티티(클래스, 모듈, 함수 등)는 확장에는 열려 있어야 하고, 수정에는 닫혀 있어야 한다는 원칙이다. 즉, 새로운 기능을 추가할 때 기존 코드를 수정하지 않고 확장할 수 있어야 한다.
1.3 DIP (의존성 역전 원칙, Dependency Inversion Principle)
고수준 모듈이 저수준 모듈에 의존하는 전통적인 의존 관계를 역전시켜, 두 모듈 모두 추상화에 의존하도록 만드는 원칙이다. 고수준 모듈은 로직을 포함하는 모듈로, 시스템의 주요 기능을 구현하며, 저수준 모듈은 세부적인 기능을 제공하는 모듈로, 고수준 모듈에 의해 사용된다.
즉 DIP 는 구체화된 자식 클래스에 의존하지 않고, 추상화된 부모 클래스이 의존해 코드의 유연성을 높이는 것이다.
2. 전략 패턴(Strategy Pattern)
전략 패턴(Strategy Pattern)은 객체 지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 특정 행동을 수행하는 알고리즘들을 각각 캡슐화하여 필요할 때마다 서로 교체할 수 있도록 하는 패턴이다. 이 패턴을 사용하면 클라이언트 코드에서 알고리즘을 변경하지 않고도 다양한 알고리즘을 사용할 수 있다. 전략 패턴은 행동(Behavioral) 패턴에 속함.
package ex01; //쥐 public class Mouse{ private String name = "쥐"; public String getName() { return name; } }
package ex01; //문지기 public class Doorman { public void 쫓아내(Mounse mouse){ System.out.println(mouse.getName()+ " 을 쫓아내"); } }
package ex01; public class App { public static void main(String[] args) { Mouse mouse = new Mouse(); Doorman doorman = new Doorman(); doorman.쫓아내(mouse); } }
문지기는 쥐를 쫓아낸다.
만약 문지기가 쥐 뿐만 아니라 호랑이도 쫓아내야 한다면?
package ex01; //쥐 public class Tiger extends Animal { private String name = "호랑이"; public String getName() { return name; } }
package ex01; //문지기 public class Doorman { public void 쫓아내(Mouse mouse,Tiger tiger){ if(mouse!=null){ System.out.println(mouse.getName()+ " 을 쫓아내"); }else { System.out.println(tiger.getName()+ " 을 쫓아내"); } } }
문지기는 새로운 매개변수를 추가해야 한다. 이때문에 전략 패턴을 사용한다.
동물이라는 추상 클래스를 만든다.
package ex01; public abstract class Animal { public abstract String getName(); }
package ex01; //문지기 public class Doorman { public void 쫓아내(Animal animal){ System.out.println(animal.getName()+ " 을 쫓아내"); } }
도어맨은 매개변수로 animal 을 받으면 된다.
package ex01; public class App { public static void main(String[] args) { Animal mouse = new Mouse(); Animal tiger = new Tiger(); Doorman doorman = new Doorman(); doorman.쫓아내(mouse); doorman.쫓아내(tiger); } }
Share article