Dev 226

[OOP] 싱글톤 패턴(Singleton Pattern)

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 서블리(Servlet)을 예로 들어보겠다. 서블릿은 서버로 들어오는 수많은 클라이언트의 요청에 대응하기 위한 java 클래스이다. 만약 HTTP 요청이 들어올 때마다 서블릿 인스턴스를 생성한다면 메모리는 OOM이 발생한다. @WebServlet("/hello") // 서블릿 매핑 public class JspStudy extends GenericServlet { //초기화 부분 public void init() { System.out.println("서블릿 초기화"); } //실행 부분 public void service(ServletRequest request, ServletResponse respo..

Dev/OOP 2022.11.13

[OOP] 옵저버 패턴(Observer Pattern)

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 데이터를 가진 객체(Score)와 해당 데이터를 참조하는 객체(ScoreView)가 있다. 예를 들면, 점수객체(Score)가 있고 점수를 나타내는 전광판 객체(ScoreView)가 있다. 점수가 변할 때, Score는 ScoreView의 update 메소드를 호출하므로써 이를 통보해야 한다. 그래야 전광판 객체의 점수가 바뀐다. 만약 점수 객체의 데이터를 모니터링하는 객체가 전광판 객체만 있다면 위 구조는 문제되지 않는다. 하지만 만약 데이터를 참조하는 객체가 많아진다면 Score객체는 어떻게 통보를 해야할까? 만약 이와 같이, 점수를 모니터링하는 객체들이랑 모두 강한 결합을 한다면 Score 객체는..

Dev/OOP 2022.11.13

[OOP] 커맨드 패턴(Command Pattern)

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 RemoteController 객체 안 필드변수에 Light 객체의 주소가 담겨진다. 그리고 RemoteController의 버튼이 pressed되면 Light 객체의 turnOn 메소드가 호출되면서 Light의 불이 켜진다. RemoteController와 Light는 연관관계이고 강하게 결합되어 있다. 그렇다면 만약 RemoteController로 다른 장치도 끄고 키려면 어떻게 해야할까? 해결책 RemoteController과 작동명령을 ‘분리’한다. 인터페이스 없이, 객체와 객체가 연결되면 두 객체는 강하게 결합한다. 이 상태에서 다른 장치의 작동 명령도 추가하면 RemoteController는..

Dev/OOP 2022.11.13

[OOP] 상태 패턴(State Pattern)

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 전등(Light)이 하나 있다. 상태는 ON, OFF 두 가지 상태가 있다. 그렇다면 ON버튼이 눌려졌을 때는 두 가지 상황이 있다. onButtonPushed()가 호출되었을 때 -Light가 On 상태라면? (조건문) -Light가 Off 상태라면? (조건문) 반대로 OFF버튼이 눌려졌을 때도 두 가지 상황이 있다. offButtonPushed()가 호출되었을 때 -Light가 On 상태라면? (조건문) -Light가 Off 상태라면? (조건문) 이처럼 상태가 두 가지일 때, 4가지 경우가 생긴단. 여기에 상태가 하나 더 추가되면 어떻게 될까? 대기(Sleeping) 상태를 추가해보자. onButt..

Dev/OOP 2022.11.13

[OOP] 스트래티지 패턴(Strategy Pattern)

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 객체자향설계 중 '상속'은 한 가지 문제가 있다. 로봇 클래스를 상속하는 Atom 클래스와 TakwonV 클래스가 있다. 만약 자식 클래스로 Ironman 클래스가 추가 된다면 어떻게 될까? Ironman 클래스는 부모클래스의 메소드를 Override 한다. 문제는 TakwonV와 Ironman 클래스의 attack() 메소드가 소스 중복이 생기고 Atom클래스와 Ironman 클래스 사이에 move() 메소드에 소스 중복이 생긴다. 이처럼 자식클래스는 부모클래스의 메소드를 Override하면서 소스 중복이 생기고 이로인해, 유지보수가 힘들어 진다. 이와같은 상속의 문제를 해결하기 위해 등장한 디자인 ..

Dev/OOP 2022.11.13

[MODERN JAVA] 동작 파라미터화 - 전략 디자인 패턴 ( Strategy Pattern )

변화에 대처 가능한 코드를 짜려면 어떻게 해야할까? 컴파일에 결정되는 코드가 아닌 런타임에 결정되는 코드를 짜야 한다. 대표적으로 동작 파라미터화(behavior parameterization)가 있다. 많은 데이터 중 원하는 데이터만 필터링 하려한다. 가볍게 데이터를 파라미터로 받아 조건문으로 필터링하면 된다. 하지만 요구사항은 바뀐다. 필터링 조건은 끊임없이 바뀌고 그럴 때마다 필터링하는 메소드도 복잡해진다. 요구사항이 변함에 따라 필터로직도 수없이 바뀐다. 그렇다면 우리는 어떻게 변화에 대응해야할까? 첫 번째 대응 방법은 '전략 디자인 패턴(Strategy Pattern)'이다. 전략 디자인 패턴은 문제해결을 위한 여러가지 전략이 존재할 때, 전략의 패밀리를 인터페이스로 구현하고 런타임시, 상황에 ..

Dev/JAVA 2022.10.24

[OOP] 피터 코드의 상속 규칙

객체지향 소프트웨어 개발의 대가 피터 코드(Peter Coad) 피터 코드는 상속의 오용을 막기 위해 5가지 상속 규칙을 내세웠다. 1. 자식클래스와 부모클래스는 '역할 수행' 관계가 아니어야 한다. 상속은 '추상화'를 구현한다. 추상화란 '공통된 특징'을 파악해 '인식의 대상'으로 삼는 행위이다. 달달하고 상큼한 것을 먹고 싶을 때, 우리는 '과일' 먹고 싶다라고 말한다. 바나나, 딸기, 수박, 파인애플 등등 '과일'이라는 단어가 없다면 무척이나 표현이 힘들어진다. 그러므로 추상화란 어떤 집단이나 집합의 '간판'과 같다. 그리고 객체지향설계에서 추상화는 상속으로 구현된다. 그런데 가끔 상속을 역할과 혼동하는 경우가 생긴다. 민수는 출근하면 회사원이다. 퇴근하면 운전자가 된다. 주말에는 아르바이트생이 된..

Dev/OOP 2022.10.18

[OOP] 특수화

[OOP] 일반화(추상화) 일반화(추상화)는 객체지향 설계의 핵심이다. 일반화와 추상화는 사전적 정의로 구분될 수 있지만 굳이 구분 안 해도 별 탈 없다. 추상화와 일반화를 구분하는 것보다 더 중요한 것이 있다. 바로 lordofkangs.tistory.com 지난 포스팅에서는 일반화를 다루었다. 회원(MEMBER)는 VIP 회원과 일반 회원(Ordinary)의 일반화이다. VIP 클래스나 ORDINARY 클래스의 공통된 데이터에 대한 로직은 MEMBER 클래스에 접근하는 것이 좋다. 반면 VIP 할인과 같이, VIP만 해당되는 영역은 VIP만 따로 접근하는 것이 좋다. 여기서 요구사항이 추가되었다고 가정해보자. 지역(Local) 주민들은 기프티콘을 받는다. VIP이면서 지역주민일 수 있고 일반 회원이면..

Dev/OOP 2022.10.18

[OOP] 일반화(추상화)

일반화(추상화)는 객체지향 설계의 핵심이다. 일반화와 추상화는 사전적 정의로 구분될 수 있지만 굳이 구분 안 해도 별 탈 없다. 추상화와 일반화를 구분하는 것보다 더 중요한 것이 있다. 바로, 일반화와 특수화를 구분하는 것이다. 일반화(추상화)는 공통된 특성이나 공통된 기능으로 묶는 것을 의미한다. 공통된 특성은 상속으로 구현되고 공통된 기능은 인터페이스로 구현된다. 어떤 관점을 가지냐에 따라 설계 방식이 달라진다. 사용자는 '키는' 기능을 하고 싶다. 근데 만약 전등에 직접 접근한다면 오로지 전등만 킬 수 있다. TV, 에어컨 기타 등등은 킬 수 없다. 이는 비효율적인 설계이고 유지보수에 좋지 못하다. 효율적인 설계를 하려면 사용자는 '키는' 기능에 접근해야한다. 예를 들어 리모컨이 있을 수 있다. p..

Dev/OOP 2022.10.17

[OOP] 캡슐화

캡슐화(Encapsulation) 캡슐화는 요구사항 변경을 유연하게 만든다. 그 이유는 높은 응집도와 낮은 결합도를 구현하기 때문이다. 응집도는 모듈 내부의 구성요소가 얼마나 통일성 있는지를 나타낸다. 모듈 내부의 변수나 메소드가 서로 다른 목적과 역할을 가진다면 모듈의 응집도는 떨어지고 여러 요소에 영향을 많이 받는다. 즉 유지보수가 어려워진다. 1) 응집도 public class Computer{ private Mainboard mb; private CPU cpu; private Memory memory; private Phone phone; // 아무 관련 없는 객체 public Computer(){ this.mb = new MainBoard(); this.cpu = new CPU(); this.m..

Dev/OOP 2022.10.17