OOP 16

[OOP] 빌더 패턴 ( Builder Pattern )

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 필드변수가 많은 객체는 상황에 따라 세팅이 필요한 변수도 있고 필요하지 않은 변수도 있다. 그러므로 필드변수가 많은 객체는 여러 상황을 지원할 수 있도록 유연한 데이터 세팅이 필요하다. 예를 들어, 문장 객체를 생각해보자. 문장 하나가 만들어지는 데에는 많은 요소가 필요하다. 1. 주어 ( 명사 ) 2. 서술어 ( 동사 ) 3. 목적어 ( 명사 ) 4. 수식어 ( 부사, 형용사 ) 등등 문장은 다양한 형태가 있기에 각 요소가 필요할 수도, 필요 없을 수도 있다. 그러므로 문장 객체는 최대한 유연하게 데이터를 세팅해야 한다. 그러나 기존의 생성자, 수정자 방식의 데이터 세팅은 유연함과는 거리가 멀다. 생..

OOP/Design Pattern 2023.07.27

[OOP] 데커레이터 패턴( Decorator Pattern )

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 기본 기능이 있고 옵션 기능이 여러 개일 때, 기본 기능 + 옵션 기능의 조합은 여러 가지이다. 예를 들어, 내비게이션이 있다. 내비게이션의 기본기능은 도로표시이다. 옵션 기능으로 교통량 표시, 날씨 표시, 메시먼지 표시가 있다고 해보자. 메인 기능 1가지에 옵션 기능 3가지가 있으므로, 총 9가지 조합이 생긴다. 문제는 이를 단순 상속으로 구현하려고 하면 9가지를 전부 클래스로 만들어야 한다는 것이다. 단순하게 부모로부터 기능을 상속받는 구조는 조합의 개수에 따라 구현해야하는 클래스 개수를 기하급수적으로 증가시킨다. 그래서 이런 문제를 해결하기 위한 디자인 패턴이 있으니, 그것이 데코레이터 패턴이다...

OOP/Design Pattern 2023.03.11

[OOP] 추상 팩토리 패턴(Abstract Factory Pattern)

디자인 패턴이란? 객체지향설계 과정에서 발생하는 문제들을 해결하기 위한 패턴(Pattern) 문제 상황 결합도를 낮추기 위해 인터페이스를 사용하지만 구현객체를 생성(new)하는 과정에서 결합이 발생할 수 밖에 없다. 이때 new 객체 생성 권한을 Factory 클래스에게 넘겨주므로써 객체 간 결합도를 낮출 수 있다. 서버에 특정 파일을 배포, 백업, 삭제하는 프로그램을 만든다고 가정해보자. Deploy, Backup, Remove는 모두 각각의 Machine 객체와 결합되어진다. 이같은 구조는 소스중복으로 이어지고 기능이 추가될 경우 유지보수에도 좋지 못하다. 그래서 도입된게 바로, 인터페이스이다. Machine 인터페이스로 인하여 결합도는 낮아졌지만 아직도 조금의 결합도가 있다. public class..

OOP/Design Pattern 2022.11.13

[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..

OOP/Design Pattern 2022.11.13

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

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

OOP/Design Pattern 2022.11.13

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

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

OOP/Design Pattern 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..

OOP/Design Pattern 2022.11.13

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

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

OOP/Design Pattern 2022.11.13

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

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

OOP/OOP Basic 2022.10.18

[OOP] 특수화

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

OOP/OOP Basic 2022.10.18