IT전문교육 의 리더!

로그인 회원가입
HOME>IT전문가>프로그래밍>디자인 패턴

디자인 패턴

20회차 속성과정
전체 : 19시간 52분|회차당 평균 : 59분36초

이용기간 2개월

전문강사 : 장원영

300,000185,000



디자인 패턴 사용법 강좌
디자인 패턴(Design Pattern)은 프로그래밍에서 발생하는 비슷한 문제들을 추상화해서 클래스 간의 관계, 행동양식을 분류해 각각의 비슷한 문제 상황들에 등장할법한 객체들을 설정하고 관계를 정의하는 것을 말합니다. 프로젝트 규모가 클수록 일을 보다 효율적으로 처리할 수 있게 만들어주는 장점이 있습니다. 알지오 디자인패턴 강의를 통해 절차지향과 객체 지향, 캡슐화, 상속과 재사용, 단일 책임 원칙, 개방 폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 역전 원칙 등 디자인 패턴의 모든 부분에 대해 학습하실 수 있습니다.
  • 01.56분 디자인 패턴과 객체지향 part1

    디자인 패턴의 필요성, 스크린UI 추가, 메뉴별 클래스 생성 방법, 모델의 역할, UML 모델링 언어, 구조 다이어그램, 행의 다이어그램, 클래스 다이어그램, 재귀적 연관 관계

    책갈피 : [00:14] 객체지향과 디자인 패턴의 필요성/[01:14] 소프트웨어의 설계가 제대로 되지 않았을 때 발생하는 문제점/[01:36] application클래스 살펴보기/[01:47] 화면구성 확인/[02:30] 코드 리스트 작성/[02:58] 화면 전환을 위한 코드/[03:21] clicked메소드에서 이벤트 처리/[04:00] currentmenu에 각각 해당되는 메뉴명 저장/[04:24] 버튼2 추가/[05:00] clicked메소드 확인/[06:59] 같은 상황을 객체지향 방식으로 처리/[07:15] 메뉴가 선택되면 해당 화면 출력/[07:30] 버튼1을 클릭하면 선택된 메뉴화면에서 적절한 처리 수행/[08:03] screenUI타입 정의/[08:18] show메소드/[08:35] handlebutton1click메소드/[09:07] 메뉴별로 screenUI 인터페이스를 구현한 클래스 작성/[09:35] clicked메소드 확인/[10:01] show메소드 호출/[11:05] button1을 클릭했을 때 처리하는 부분/[11:33] clicked메소드에서 정리해야 할 코딩 부분/[12:03] 두 종류의 버튼처리 코드/[12:58] clickde메소드를 메뉴처리 부분과 버튼처리 부분으로 분리/[13:43] 버튼2 추가/[13:58] 인터페이스에 handlebutton2click추가/[14:22] 버튼2 처리 내용 작성/[16:30] 최종적으로 수정된 코드 내용/[16:56] if/else구문 사용/[17:03] 메뉴3을 추가 할 경우/[18:14] screenUI타입을 추가시키고 메뉴별로 클래스 만드는 방법 구현 완료/[18:33] 필요한 내용을 분리함으로 얻을 수 있는 장점/[19:18] 객체지향 기법/[19:45] 객체지향 모델링/[20:15] 모델의 역할/[21:03] 모델링 언어 UML/[22:18] 다양한 다이어그램의 제공 이유/[22:30] 구조 다이어그램/[23:45] 행위 다이어그램/[25:29] 클래스 다이어그램/[25:48] 주요 구성 요소/[26:03] 클래스 설명/[26:33] 고양이를 만들어내는 설계도/[27:22] 클래스의 속성과 연산을 기술/[27:48] public/private/protected/package/[28:52] 분석 단계/[29:03] 설계 단계/[29:37] 관계 설명/[30:07] 연관 관계(association)/[30:48] 두 클래스 사이의 연관 관계/[31:48] 두번째 다이어그램 확인/[32:30] 두 클래스 사이의 연관 관계를 나타내는 화살표/[33:14] 숫자로 객체 범위를 표현/[33:35] 다중성의 표현/[34:28] 연관 관계의 방향성/[35:19] 클래스 다이어그램을 소스코드로 구현/[35:49] 클래스로 표현/[36:07] 메소드는 public으로 선언/[36:45] 연관 관계가 표현되어 있는 클래스 다이어그램도 소스코드로 구현/[37:51] 속성의 이름이 역할의 이름 활용/[38:13] 단방향 연관 관계/[38:37] 소스코드 구현/[39:05] setter/getter메소드/[39:37] 다중성 구현/[40:00] 소스코드 구현/[40:45] vector이용/[41:37] course객체와 student객체의 관계/[42:15] 다중성 수정/[42:52] 소스코드 구현/[43:12] class student와 class course가 독립적으로 선언/[43:30] course class변화/[44:22] 연관 클래스(association class)/[46:12] 연관 관계에 추가할 속성이나 행위가 있을 때 사용/[46:37] 연관 클래스 구현 방법/[46:52] 예제 확인/[47:22] transcript클래스/[48:36] student클래스와 transcript클래스의 연관 관계의 다중성/[48:57] 일반 클래스로 변환 한 예/[49:05] transcript를 소스에 적용/[50:00] transcript생성 자료/[51:06] 클래스 다이어그램 추가/[51:52] borrowing연관 관계/[52:07] 재귀적 연관 관계/[54:44] 관계의 루프

  • 02.54분 객체지향 part2

    클래스 다이어그램, 일반화 관계, 집합 관계(합성 관계, 집약 관계), 의존 관계, 실체화 관계, 절차지향과 객체지향의 차이점, 객체의 정의, 객체의 책임과 크기

    책갈피 : [00:03] 일반화 관계(generalization)/[00:26] 자식클래스(서브클래스)/부모클래스(슈퍼클래스)/[00:57] is a kind of 관계/[02:52] 추상 메소드/[03:00] 추상 클래스/[03:15] 일반화 관계를 클래스 다이어그램으로 표현/[03:53] 집합 관계(composition, aggregation)/[04:15] 합성 관계(composition)/[04:39] 부분 객체가 전체 객체에 속하는 관계/[05:15] 집약 관계(aggregation)/[06:10] 부분 객체와 전체 객체가 독립적/[06:46] 소스코드 비교/[07:08] 속성은 모두 동일/[08:07] 합성 관계 모델링/[08:52] 집약 관계 모델링/[09:11] 의존 관계(dependency)/[09:37] 클래스의 속성에서 참조할 때/[11:28] 연산의 인자로 사용될 때/[11:50] person과 car의 연관 관계 소스코드 구현/[12:26] gaspump추가/[12:58] 실체화 관계(realization)/[13:11] 인터페이스/[13:43] turn_on/turn_off기능/[14:24] 클래스 다이어그램 확인/[15:58] 스테레오로 interface입력/[16:25] 키워드/[16:59] 인터페이스와 클래스 사이의 실체화 관계/[17:29] can do this 관계/[17:41] 객체지향에 대한 자세한 설명/[18:21] 절차지향/[18:48] 프로시저들이 데이터를 조작/[19:37] 프로시저를 이용한 프로그래밍 기법/[21:33] 여러가지 문제 발생/[22:41] 객체지향/[23:14] 객체들로 구성/[23:45] 프로시저는 자신이 속한 객체의 데이터에만 접근 가능/[24:30] application.java는 절차지향으로 구현/[25:37] 절차지향-프로그램 수정이 어려운 구조/[25:56] 객체지향-프로그램 수정이 쉬운 구조/[26:11] 객체(object)알아보기/[26:41] 객체가 제공해야 할 기능-소리크기 제어 객체/[28:18] signature(기능식별이름, 파라미터, 결과값)/[29:02] 인터페이스/[29:26] 클래스/[29:37] 소리크기 제어 객체/[30:56] 파일 읽기 객체/[31:18] 암호화 처리 객체/[31:48] 메시지/[32:07] 객체의 책임과 크기/[33:04] 객체의 책임을 정의-인터페이스/[33:43] 프로그램을 만들기 위해 필요한 기능의 목록 정리/[34:22] 객체의 구성/[35:30] 규칙/[36:27] 절차지향 방식과 동일한 구조/[36:52] 객체지향의 장점/[37:05] 단일 책임 원칙(single responsibility principle)/[37:59] 의존/[38:28] 다른 객체 이용/[38:49] 흐름제어 객체 소스코드 구현/[39:49] 다른 객체를 생성/다른 객체의 메소드 호출/[40:15] 파라미터 전달/[41:06] 스트링 타입으로 파일 경로를 받도록 수정될 경우/[41:22] 스트링 변수 추가/[41:52] 변경은 의존 관계에 따라 전이/[42:37] 순환 의존의 특성/[43:07] 의존의 양면성을 확인하는 코드/[44:30] authenticator클래스에 의존/[45:22] try/catch문에 exception을 통해 구분/[45:52] authenticate메소드의 변경/[46:30] 의존이 상호간의 영향을 주는 것 의미/[47:19] 캡슐화(encapsulation)/[47:59] 소스코드 확인/[48:15] 절차지향적인 코딩/[48:45] 만료시 처리/[49:15] 만료 여부를 확인하는 규칙의 변경을 코드에 반영/[49:52] 버그 발생 가능성/[50:22] 문제 발생의 이유/[51:04] 객체지향적으로 코드 재 구현/[51:13] 캡슐화 기능/[51:51] 만료 여부 확인 구현을 캡슐화/[52:28] 만료시 처리 부분 확인/[53:13] 만료 여부 규칙의 변경/[54:13] 기능을 사용하는 곳의 영향을 최소화

  • 03.53분 객체지향 part3

    캡슐화 기능 구현, 캡슐화를 위한 규칙, 객체지향 설계과정, 객체지행의 원리

    책갈피 : [00:45] 캡슐화를 위한 2가지 규칙/[00:55] tell, don't ask/[01:59] 만료 일자 데이터를 가진 member객체에게 만료 여부 확인/[02:36] isexpired를 member클래스에서 구현/[02:45] 데미테르의 법칙(law of demeter)/[03:38] 파라미터로 받은 객체의 메소드만 호출/[04:30] 기능 구현의 캡슐화를 향상/[04:40] 예제 코드 확인(신문 배달부 예제)/[04:56] 고객과 지갑에 대한 클래스 확인/[05:15] 신문 배달부 클래스/[06:54] 신문 배달부가 고객의 지갑을 확인하지 않을 경우/[07:46] 데미테르의 법칙을 어기고 있는 코드/[08:39] 데미테르의 법칙을 지키지 않는 증상/[09:22] 객체지향 설계과정/[09:52] 제공해야 할 기능 찾고 알맞은 객체에 할당/[10:20] 객체 간에 어떻게 메시지를 주고 받을 지 결정/[10:37] 파일 데이터 암호화 기능 목록/[11:01] 각 객체의 연결 그림/[11:41] 객체의 크기는 구현을 진행하는 과정에서 명확/[12:13] 객체를 새로 만들어 분리/[13:24] 설계를 할 때 변경되는 부분 고려/[13:37] 객체지향의 원리/[13:56] 추상화/[15:00] 필요로하는 속성이나 행동을 추출하는 작업/[15:16] 추상화의 정의/[16:56] 캡슐화/[17:26] 응집도/결합도/[18:07] 객체지향 설계 원리/[18:18] 정보은닉/[19:11] 일반화 관계/[19:48] 일반화의 개념/[21:25] 예제 소스코드 확인/[21:56] 코드를 수정할 필요가 없도록 작성/[22:52] 서브클래스 캡슐화/[23:11] 일반화 관계와 위임/[23:30] 예제 확인/[24:33] 예제 소스코드 확인/[25:22] 메인 메소드 확인/[25:41] stack에서 사용해서는 안되는 메소드/[25:56] is a kind of 관계의 성립/[26:56] 위임/[27:25] 일반화를 대신해서 위임을 사용하는 방법/[28:33] arlist객체 생성-this로 초기화/[28:52] arlist 객체를 참조할 수 있도록 변경/[29:11] 클래스의 일반화 관계 제거/[29:37] isempty/size메소드의 위임메소드를 서브클래스에 추가/[30:03] 집합론 관점으로 본 일반화 관계/[31:06] disjoint/complete 제약조건 사용/[31:48] 예제 확인/[33:28] 일반화의 역관계 특수화/[34:50] local/non local/[35:58] 다중 분류/[36:45] 분류 가능한 조합에 각각 대응되는 클래스 생성/[37:15] 집합론 관점/[38:06] 다형성/[38:37] 예제 소스코드 확인/[39:00] 다형성의 개념/[40:00] 다형성을 사용하지 않고 작성한 예제 코드/[40:20] 메인코드 확인/[40:52] 다형성을 사용한 코드/[41:52] 피터코드의 상속 규칙/[42:52] 클래스 다이어그램의 예제/[45:15] 연관관계-집약관계 사용/[45:50] 다형성과 추상타입, 재사용/[46:05] 다형성과 상속/[47:14] 자바-정적타입 언어/[47:22] 자바스크립트,루비,그루비-동적타입 언어/[47:45] 예제 소스코드 확인/[49:15] 타입의 상속-인터페이스 상속,구현 상속/[50:36] 상속받은 인터페이스에 정의된 메소드 실제 구현/[51:05] 구현상속

  • 04.51분 다형성과 추상타입, 재사용

    추상 타입과 유연함, 상속과 재사용, 조립을 이용한 재사용

    책갈피 : [00:17] 실제 코드 확인/[00:25] 추상 타입과 실제 구현의 연결/[01:03] 클래스 다이어그램 확인/[01:40] collector/[02:13] collector객체타입의 collect메소드 호출/[03:53] socketlogreader/[04:15] 추상 타입을 이용한 구현 교체의 유연함/[04:43] 각각의 기능에 따라 나눈 클래스/[04:58] flowcontroller의 코드 보기/[05:45] file read부분 수정/[06:30] 생성자 boolean/[07:10] flowcontroller 설명/[07:46] 기존 요구사항과 추가된 요구사항/[08:33] 구현 추상화/[08:50] byteSource.java 인터페이스 추가/[09:26] socketDateReader추가해서 byteSource상속받기/[10:07] flowcontroller코드는 byteSource를 사용하도록 수정 가능/[10:50] source.read메소드 호출/[11:37] byteSource타입의 객체를 생성하는 부분/[12:26] byteSource타입 객체 생성기능 분리/[12:46] 생성자를 이용, byteSource전달받기/[13:07] 문제 해결/[13:20] create메소드 보기/[13:50] singleton pattern적용한 부분/[14:16] flowcontroller 수정/[14:50] http를 이용해 암호화할 데이터를 읽어오라는 요구 발생/[15:20] 변경되는 클래스는 byteSourceFactory에 적용/[16:03] 추상화 과정을 통해 얻은 2가지 유연함/[17:48] 데이터 읽는 부분과 생성하는 부분 추상화/[18:02] 변화되는 부분을 추상화하기/[19:07] 추상타입으로 교체/[20:10] 추상화가 되어있지 않은 코드/[21:21] 인터페이스에 대고 프로그래밍하기/[22:22] 인터페이스는 새롭게 발견된 추상개념을 통해 도출/[23:03] program to interface규칙/[23:37] 인터페이스를 사용해야할 경우/[24:37] 인터페이스는 인터페이스 사용자 입장에서 만들기/[25:22] 소켓을 이용해 데이터를 읽어오는 기능이 필요할 경우/[26:29] ByteSource/[26:52] 인터페이스와 테스트/[27:48] testProcess클래스 작성/[28:21] byteSource인터페이스를 사용하도록 프로그래밍 되어있는 경우/[28:45] mock객체를 이용해 테스트/[30:18] mock객체를 만드는 방법/[30:45] 상속과 재사용/[31:22] 웹 요청을 처리하기 위한 클래스 제공/[31:41] BaseCommandController/[32:45] BaseCommandController가 AbstractController기능 확장/[33:37] 상속의 단점/[34:51] 의존하는 클래스 코드가 변경되면 자식 클래스에 영향/[35:57] 상속을 통한 재사용의 단점/[36:14] 클래스의 불필요한 증가/[37:19] 압축을 먼저 하고 암호화한 저장소가 필요할 경우/[39:15] 상속의 오용/[40:52] 조립을 이용한 재사용/[41:37] 4개의 객체를 조립한 예제/[42:30] Encryptor클래스 재사용/[44:00] 조립을 이용하면 불필요한 클래스 증가 방지/[44:37] 조립방식의 또 다른 장점/[45:36] 상속보다는 객체 조립 사용/[46:06] 조립을 사용할때의 단점/[46:37] 위임(delegation)/[48:05] 상속을 사용할 경우/[49:37] 클래스 계층의 특징/[51:15] 조립으로 전환하는 부분 고려

  • 05.56분 설계 원칙과 DI와 서비스 로케이터 part1

    단일 책임 원칙, 개방 폐쇄 원칙, 리스코프 치환 원칙, 인터페이스 분리 원칙, 의존 역전 원칙, 어플리케티션 영역, 메인 영역

    책갈피 : [00:28] 설계 원칙(SOLID)/[01:25] 단일 책임 원칙(Single responsibility principle)/[02:13] 단일 책임 원칙을 위반했을 경우의 문제/[02:42] updateGui메소드/[03:20] http프로토콜에서 소켓프로토콜로 변경이될 경우/[05:10] 단일 책임 원칙을 위반했을 경우의 또 다른 문제/[05:30] 단일 책임 원칙을 준수할 경우/[06:15] 데이터 읽기, 데이터 보여주기/[07:09] 단일 책임 원칙을 지킬 수 있는 방법/[08:26] 개방 폐쇄 원칙(Open-closed principle)/[09:52] 기능을 확장하면서도 기존코드는 변경되지 않는 것을 의미/[10:22] 변화되는 부분을 추상화해서 표현/[10:58] 개방 폐쇄 원칙을 구현하는 또 다른 방법/[11:16] ResponseSender클래스 예제/[11:48] sendHeader, sendBody/[12:20] ResponseSender를 상속받은 클래스/[13:01] ResponseSender클래스는 확장에는 열려있지만 변경에는 닫혀있는것 의미/[13:46] 개방 폐쇄 원칙이 깨진 것이 아닌지 확인해야할 특징/[14:11] 다운캐스팅/[14:43] 타입확인/[15:18] instanceof 타입확인 연산자/[15:46] drawSpecific메소드/[16:10] 비슷한 if-else블록/[16:48] Enemy클래스에 새로운 경로패턴을 추가할 경우/[17:11] 경로패턴 추상화/[18:48] 리스코프 치환 원칙(Liskov substitution principle)/[20:18] 가장 대표적인 예제(직사각형, 정사각형) 확인/[20:48] square클래스가 rectangle클래스를 상속받도록 구현/[21:22] increseHeight메소드 살펴보기/[22:41] instanceof연산자 사용/[23:55] LSP는 계약과 확장에 대한 것/[25:45] 리스코프 치환 원칙을 어길 경우/[27:07] instanceof연산자를 사용해서 확인/[28:29] 상위타입의 추상화가 되지않아 생긴 문제/[29:15] item클래스와 specialitem클래스 소스코드 확인/[30:03] instanceof연산자를 사용하던 코드를 클래스만 사용하도록 구현/[31:00] 인터페이스 분리 원칙(Interface segregation principle)/[31:17] 클라이언트는 자신이 사용하는 메소드에만 의존/[31:47] 인터페이스 분리 원칙을 지키지 않았을 경우/[33:05] ArticleService의 목록 읽기 기능의 변경 발생/[34:22] 게시글 목록 기능에만 변경이 됐어도 모든 소스를 다시 컴파일/[36:06] 용도에 맞게 인터페이스 분리/[36:52] 인터페이스를 분리하는 기준-클라이언트/[37:14] 의존 역전 원칙(Dependency inversion principle)/[37:44] 고수준 모듈과 저수준 모듈/[38:43] 고수준 모듈과 저수준 모듈의 예제/[40:37] 저수준 모듈이 고수준 모듈을 의존하게 만들어 해결/[41:43] 의존 역전 원칙은 타입의 소유도 역전/[42:30] 배포 기준이 되는 패키지/[43:19] 의존 역전 원칙을 적용하지 않을 경우/[43:50] DI와 서비스 로케이터/[44:07] 어플리케이션 영역 / 메인 영역/[44:43] 비디오 포맷 변환기 예제/[45:34] 요구사항 분석/[46:15] 비디오 포맷 변환기 설계 확인/[47:35] 개방 폐쇄 원칙/[48:19] worker클래스 코드 살펴보기/[49:00] jobQueue를 구현한 객체 구하기/[49:20] Locator객체 사용/[50:22] Locator클래스는 transcoder패키지에 위치/[51:35] Locator객체의 초기화/[51:52] 메인 영역/[53:00] 어플리케이션 영역의 객체들을 생성, 설정, 실행/[55:08] 서비스 locator방식

  • 06.58분 설계 원칙과 DI와 서비스 로케이터 part2

    DI를 이용한 외존객체 사용 방법, 서비스 로케이터를 이용한 의존 객체 사용, 디자인 패턴의 이해, GoF 디자인 패턴, UML과 디자인 패턴, 각 디자인 패턴들

    책갈피 : [00:19] DI를 이용한 의존 객체 사용방법/[00:56] 서비스 로케이터를 사용할 경우/[01:38] worker생성자/[02:15] main클래스 변경/[03:23] DI를 통해 의존 객체를 관리할 경우/[03:38] main클래스가 조립기의 역할/[03:57] Assembler작성/[04:27] getWorker, getJobCLI를 제공/[05:46] DI를 이용한 의존 객체 사용/[06:15] 생성자 방식/[06:42] 설정 메서드 방식/[07:30] 조립기는 생성자와 설정 메서드를 이용해 의존 객체 전달/[07:46] DI와 테스트/[08:20] 클래스 구현이 완료되지 않은 상황/[09:03] springframework살펴보기/[09:33] worker는 생성자 방식, jobCli는 설정 메서드 방식 이용/[10:13] property태그/[11:46] classPathXmlApplicationContext클래스/[12:11] string 조립기의 역할/[13:13] xml설정파일을 사용하는 방식/[14:11] xml을 사용할 때의 문제점을 해결하는 방법/[14:31] xml파일을 java코드 기반으로 교체한 예제/[15:20] 의존 객체를 변경해야 하는 경우/[15:46] 서비스 로케이터를 이용한 의존 객체 사용/[16:45] 실행 환경의 제약때문에 DI패턴을 적용할 수 없는 경우/[17:07] serviceLocator/[17:41] 서비스 로케이터가 올바르게 동작 하려면/[18:26] 서비스 로케이터를 구현하는 방식/[18:52] 객체 등록 방식/[19:15] 서비스 로케이터 접근 위한 static메서드 제공/[19:37] 메인 영역의 코드 확인/[20:00] 어플리케이션 영역 코드 확인/[20:37] 서비스 로케이터가 제공할 객체의 종류/[21:48] 어플리케이션 영역에서 의존 객체 변경 가능/[22:33] 상속/[23:03] abstract를 이용해 구현/[23:33] 의존 객체를 필요로 하는 코드/[24:25] myServiceLocator정의/[25:14] main영역에서 클래스의 객체 생성/[25:59] 지네릭 / 템플릿/[26:07] serviceLocator의 단점/[27:22] jobQueueLocator와 transcoderLocator를 따로 생성/[28:15] 지네릭이나 템플릿을 이용해 서비스 로케이터를 구현할 경우/[28:33] 지네릭 방식의 예제/[28:56] static메서드만으로 구성/[29:41] jobQueue에만 의존/[30:33] 서비스 로케이터의 가장 큰 단점/[31:48] 서비스 로케이터 보다는 DI사용/[32:07] 디자인 패턴/[33:22] 디자인 패턴의 이해/[34:13] 디자인 패턴의 구조/[36:19] GpF 디자인 패턴/[37:04] 생성패턴/[37:35] 구조패턴/[38:15] 행위패턴/[40:30] UML과 디자인 패턴/[40:37] 컬레보레이션(Collaboration)/[41:59] 객체와 역할 사이의 관계/[42:52] 객체들이 특정 상황에서 수행하는 상호작용/[44:05] 구체적인 상황의 콜라보레이션 적용 표현/[45:20] 순차 다이어그램(Sequence diagram)/[46:37] 생명선/[47:19] 객체 사이의 메시지는 화살표로 표시/[47:52] 열려있는 화살표는 비동기 메시지/[48:14] 채워져 있는 화살표는 동기 메시지/[48:50] <>객체생성 메시지/[49:00] <>객체소멸 메시지/[49:21] 메시지를 표현하는 형식/[49:36] 시퀀스 번호/[50:14] 가드/[50:34] 응답 메시지/[51:35] 도서대여 관련 순차 다이어그램 예제/[52:22] ref키워드 사용/[53:07] 객체사이의 상호작용을 효과적으로 나타내는 여러가지 연산 제공/[54:52] 순차 다이어그램과 클래스 다이어그램의 관계/[56:15] 차이점/[57:19] 클래스x와 클래스y의 연관관계 성립

  • 07.50분 디자인 패턴들 part1

    생성 패턴, 구조 패턴, 행위 패턴, Abstract Factory, Builder

    책갈피 : [00:05] 각 디자인 패턴들 알아보기/[00:29] Abstract Factory/[01:03] 예제-엘리베이터 부품 업체 변경/[01:26] 각 제조 업체별로 부품 개발/[02:29] 추상클래스로 Motor와 Door를 정의/[03:30] Motor클래스는 Door클래스의 getDoorStatus메소드 호출/[03:53] Motor클래스의 move메소드 기능/[04:55] 일반적인 흐름은 동일하지만 특정 부분만 다른 동작을 하는 경우/[05:11] 템플릿 메서드 패턴 활용/[05:30] Door클래스의 open메소드 기능/[06:15] lgDoor와 hdDoor의 class코드 작성/[06:30] Door는 추상클래스로 정의/[07:00] Door코드 보기/[07:24] close는 템플릿 메서드/[08:05] 하위 클래스에서 오버라이드 될 부분은 primitive 또는 hook메서드/[08:37] open과 doOpen/[09:18] 추상클래스 Door를 상속받는 lgDoor와 hdDoor코드 보기/[09:37] doClose와 doOpen구현/[09:58] 클래스 다이어그램 확인/[10:11] open의 대표적인 역할/[10:43] 문을 제어하는 클래스가 필요/[11:05] LGMotor와 HDMotor생성 부분 확인/[11:24] MotorFactory클래스의 createMotor메서드/[12:13] MotorFactory코드 보기/[12:35] vendorID에 따라 LGMotor, HDMotor생성/[12:43] DoorFactory코드 보기/[13:33] Client클래스/[14:05] open명령을 사용/[14:20] move메서드 기능/[14:39] 추상팩토리가 필요한 이유/[15:35] 다른 제조업체의 부품을 사용해야 하는 경우/[16:17] 설정 부분 변경/[16:37] 부품별 클래스 보기/[17:33] 총 10개의 Factory객체를 사용해서 엘리베이터를 구성하는 코드/[18:07] 새로운 제조업체의 부품을 사용할 경우/[18:47] DoorFactory클래스 보기/[19:07] enum에 SS업체 추가/[19:41] client에서 HD를 SS로 변경/[21:15] LGElevatorFactory/[21:25] HDElevatorFactory/[22:14] createMotor메서드와 createDoor메서드 제공/[22:37] ElevatorFactory클래스 다이어그램/[23:07] 추상클래스로 정의되는 ElevatorFactory클래스 보기/[23:33] 추상메서드 createMotor와 createDoor선언/[24:36] client코드 보기/[25:22] 새로운 제조업체의 부품을 지원하는 경우/[26:11] SSElevatorFactory생성/[26:41] SSElevatorFactory클래스, SSDoor클래스, SSMotor클래스 보기/[27:37] client수정/[28:18] 해당 제조업체의 부품을 생성하는 factory클래스 추가/[29:14] 클래스 다이어그램 확인/[30:14] Abstract Factory/[31:48] 추상팩토리 패턴의 컬레보레이션 다이어그램/[32:05] 추상팩토리 패턴에서 나타나는 역할/[33:07] AbstractFactory/[33:22] ConcreteFactory1/[33:44] AbstractProductA/[34:00] 추상팩토리 순차 다이어그램/[34:30] client부터 순차적으로 보기/[36:00] LGElevatorFactory와 HDElevatorFactory클래스에 추상팩토리 패턴을 적용한 클래스 다이어그램/[36:30] ElevatorFactory클래스는 AbstractFactory역할/[37:30] 예제-슈팅게임 만들기/[38:20] 클래스 다이어그램 보기/[39:22] Stage클래스 코드 확인/[39:52] 코드의 문제점/[41:05] 추상팩토리 적용 결과 확인/[41:30] EnemyFactory추가/[42:19] EnemyFactory구현/[42:45] 객체 생성을 위한 팩토리 메서드/[43:13] EasyStageEnemyFactory와 HardEnemyFactory정의/[43:43] Factory를 사용하도록 변경된 Stage클래스/[44:00] enemyFactory를 사용해 객체 생성/[45:37] Builder/[46:00] Builder패턴 설명/[46:21] 예제 확인/[47:05] 유연한 자료구조 필요/[47:35] Builder패턴의 클래스 다이어그램/[48:15] client내용 확인

  • 08.57분 디자인 패턴들 part2

    Iterator, Adapter, Template Method

    책갈피 : [00:17] 추상팩토리 패턴에 Factory Method패턴과 Template Method패턴/[00:36] 패턴들의 순서/[01:42] Iterator패턴/[01:59] 배열 arr의 모든 요소를 표시하기 위해 for문 사용/[02:07] i변수 확인/[02:42] i를 하나씩 증가/[03:00] Iterator패턴 설명/[03:21] 예제 확인/[03:43] 클래스 다이어그램 확인/[04:14] 인터페이스 Aggregate/[04:30] Aggregate의 소스 보기/[05:13] 인터페이스 Iterator/[05:30] Iterator에 필요한 메서드/[05:54] hasNext메서드/[06:24] next메서드/[07:00] Book클래스 보기/[07:30] BookShelf클래스/[07:54] BookShelf클래스 소스 보기/[08:31] books필드를 private으로 한 이유/[09:15] BookShelfIterator클래스 소스 보기/[09:56] hasNext메서드/[10:24] next메서드/[11:03] Main클래스 만들기/[11:39] while의 조건/[12:07] Iterator패턴의 4가지 역할/[12:15] Iterator/[12:41] ConcreteIterator/[13:24] Aggregate/[13:56] ConcreteAggregate/[14:43] Iterator패턴을 사용하는 이유/[16:22] 동일 자료형의 여러 객체 순차 접근/[16:48] Adapter패턴/[18:03] wrapper패턴/[18:30] 클래스에 의한 Adapter패턴(상속)/[18:56] 예제 확인/[19:11] Banner클래스/[19:37] 인터페이스 Print/[20:07] PrintBanner가 Adapter의 역할을 담당/[20:52] Banner클래스 보기/[21:14] Print인터페이스 보기/[21:45] PrintBanner클래스 보기/[22:03] printWeak메서드와 printStrong메서드/[22:22] Main보기/[23:48] 인스턴스에 의한 Adapter패턴(위임)/[24:22] 클래스 다이어그램 확인/[25:18] Print와 Print2의 소스 차이/[25:52] printWeak메서드와 printStrong메서드/[27:07] 역할 살펴보기/[27:25] Target의 역할/[27:56] Client의 역할/[28:15] Adaptee의 역할/[28:52] Adapter의 역할/[30:11] 위임을 사용한 경우/[31:37] 만들어진 클래스를 새로운 인터페이스에 맞게 개조 시킬 경우/[33:00] 버전 업/[33:34] Template Method/[34:05] 예제 확인/[34:22] HDMotor클래스/[35:00] enumeration인터페이스 필요/[35:37] HDMotor클래스의 move메소드를 순차 다이어그램으로 표현/[37:00] 소스 코드 구현/[37:22] Door클래스 보기/[37:37] HDMotor클래스 보기/[37:57] move메서드 보기/[38:30] Client클래스 보기/[38:49] LGMotor를 추가할 경우/[39:07] LGMotor를 구현한 예제/[39:30] 코드 중복의 문제/[40:37] Motor클래스 구현/[41:43] HDMotor와 LGMotor의 소스 코드 보기/[42:12] 상속을 활용해 코드 중복 피하기/[43:19] 클래스 다이어그램 확인/[43:36] move메서드를 Motor클래스로 이동시킨 모습/[44:00] HDMotor확인/[44:42] 소스 코드 확인/[45:12] Motor클래스의 move메서드 보기/[45:59] 코드 중복 최소화에 유용/[46:45] move메소드-템플릿 메소드/[47:00] moveMotor메소드-Primitive메소드 또는 hook메소드/[47:28] 콜라보레이션 다이어그램 확인/[48:43] Client는 templateMethod메소드 호출/[49:35] 템플릿 메소드 패턴을 Motor예제에 적용한 경우/[50:07] 템플릿 메소드 패턴의 특징/[52:37] 리스코프 치환 원칙/[53:52] 상위 클래스 입장/[54:37] 추상 클래스 개념/[55:37] 상위 클래스와 하위 클래스의 협조

  • 09.57분 디자인 패턴들 part3

    Factory Method, Singleton

    책갈피 : [00:05] Factory Method패턴/[00:38] 인스턴스를 생성하는 공장을 Template Method로 구현/[00:52] idcard를 만드는 예제/[01:03] framework살펴보기/[01:34] Product클래스 확인/[02:07] 클래스 다이어그램으로 소스 구현/[02:15] Product클래스/[02:46] Factory클래스/[03:15] 제품을 만들고 등록하는 구현작업은 하위클래스에서 수행/[03:36] create메소드/[04:00] 추상메소드로 정의/[04:30] IDCard패키지 살펴보기/[04:46] IDCardFactory클래스/[05:08] createProduct, registerProduct/[05:28] Main클래스/[05:56] Factory Method패턴 상세히 알아보기/[06:10] 여러대의 엘리베이터 예제/[06:46] 스케줄링/[07:29] 복수의 엘리베이터를 스케줄링해서 이동시키는 클래스 다이어그램/[08:45] ElevatorManager클래스 소스/[09:07] 주어진 수만큼의 ElevatorController를 생성함/[09:20] requestElevator메소드/[09:41] ElevatorController클래스/[09:58] ThroughputScheduler클래스/[10:18] 소스 구현의 문제점/[12:18] 동적 스케줄링을 지원할 수 있도록 수정된 ElevatorManager클래스 코드/[12:31] requestElevator의 코드 변화/[13:31] 현재 시간에 따라 적절한 스케줄링 객체 생성/[14:41] 클래스 다이어그램에 적용/[15:37] 새로운 스케줄링 전략이 추가되는 경우/[17:17] 문제점을 해결을 위한 방법/[17:59] SchedulerFactory클래스 추가/[18:37] SchedulerFactory클래스 소스 구현/[19:37] getScheduler메소드 호출/[19:52] SchedulerFactory클래스를 이용할 수 있도록 수정된 ElevatorManager클래스/[20:15] 스케줄링 전략을 설정/[20:47] Client클래스 코드 보기/[22:52] 상황에 따라 적절한 객체를 생성하는 코드 자주 중복/[23:29] Factory Method패턴의 개념을 잘 보여주는 그림/[24:11] Factory Method패턴이 적용된 부분/[25:11] Factory Method패턴을 상속을 이용해 적용한 다이어그램/[26:37] ElevatorManager는 getScheduler메소드를 추상메소드로 정의/[26:59] ElevatorManager클래스의 코드/[27:48] requestElevator메소드는 getScheduler메소드를 추상메소드로 정의/[28:41] 템플릿 메소드에 해당/[29:21] Factory Method Pattern의 콜라보레이션 다이어그램/[30:22] Factory Method Pattern을 엘리베이터 예제에 적용/[32:43] Singleton패턴/[34:30] 요소를 하나만 가지고 있는 집합/[34:44] 간단한 클래스 다이어그램/[35:19] singleton클래스 생성자/[36:07] Singleton클래스 소스 코드/[36:36] Main클래스 소스 코드/[37:07] obj1과 obj2가 동일한 객체인지 확인/[37:37] Printer클래스/[38:15] 외부에서 생성자를 호출할 수 없도록 하기/[38:36] Printer클래스의 생성자를 private로 선언/[39:07] getPrinter메소드/[39:51] getPrinter메소드와 printer변수 static타입으로 선언/[40:45] 정적메소드로 선언/[41:30] 5명의 사용자가 printer를 이용하는 상황으로 코드 작성/[42:30] 다중 쓰레드에서 Printer클래스를 이용할 경우/[43:21] 다중 쓰레드 애플리케이션에 발생하는 문제 해결방법/[43:49] 정적 변수에 인스턴스를 만들어 초기화하는 방법/[45:22] 인스턴스를 만드는 메소드에 동기화하는 방법/[45:59] counter변수 추가/[46:37] print메소드의 counter변수를 변경하는 부분 동기화 필요/[47:20] Singleton패턴의 순차다이어그램/[47:59] Singleton패턴과 정적 클래스의 관계/[48:29] print메소드 동기화/[48:52] UserThread 5개 생성 후 스레드 실행/[49:52] 정적 클래스를 사용할 수 없는 경우/[50:15] Printer 인터페이스를 구현하는 RealPrinter/[50:44] UsePrinter소스 코드 확인/[52:45] Printer 인터페이스 확인/[53:15] 테스트용 가짜 프린터인 FakePrinter확인/[53:37] doSomething메소드로 인터페이스의 단위테스트를 하는 상황 가정/[54:43] 정적 클래스의 문제를 싱글턴 패턴으로 해결/[55:07] 정적 setter메소드 사용/[56:04] DoSomethingTest/[56:36] 가짜 Printer객체 주입/[57:04] Singleton패턴 정리

  • 10.49분 디자인 패턴들 part4

    Singleton, Prototype, Builder, Abstract Factory

    책갈피 : [00:05] Singleton패턴/[00:27] 팩토리메소드 패턴 설계부분 보기/[00:50] SchedylerFactory클래스/[01:11] RESPONSE_TIME, THROUGHPUT, DYNAMIC/[01:55] Client class확인/[02:27] 중복되어 생성/[03:36] Singleton패턴을 적용한 설계부분/[04:14] Singleton패턴을 적용한 SchedylerFactory클래스/[04:46] Singleton패턴으로 구현한 ThroughputScheduler, ResponseTimeScheduler/[05:44] Abstract Factory Pattern에서 Singleton패턴을 적용하는 과정/[07:15] 제품군별 객체 생성/[08:45] Motor클래스 확인/[09:28] 템플릿 메소드 패턴/[10:03] Client3 소스 확인/[10:54] 제조 업체별 Factory객체/[11:30] 제조 업체별 Factory클래스를 Singleton패턴으로 설계/[12:03] 소스 코드 확인/[12:54] Client4 클래스 코드/[13:31] Prototype패턴/[14:03] 클래스 이름을 지정하지 않고 인스턴스를 생성할 때/[14:31] 종류가 너무 많아 클래스로 정리되지 않는 경우/[14:46] 클래스로부터 인스턴스 생성이 어려운 경우/[15:37] framework와 생성할 인스턴스를 분리하고자 할 경우/[17:00] Prototype패턴을 사용한 예제/[17:22] product 인터페이스/[17:41] UnderlinePen클래스와 MessageBox클래스/[19:03] product 인터페이스 소스 코드 확인/[19:37] use메소드/[19:48] createClone메소드/[19:56] Manager클래스/[20:40] proto/[22:06] 하위클래스 살펴보기/[22:30] decochar/[22:45] MessageBox클래스 소스 코드 확인/[23:21] clone메소드로 복사 가능한 것/[24:21] 자신 또는 하위 클래스에서만 호출/[25:21] UnderlinePen클래스의 소스 코드 확인/[26:26] Prototype패턴의 역할을 나타내는 클래스 다이어그램/[27:52] 종류가 너무 많아 클래스로 정리되지 않는 경우/[28:26] 클래스로부터 인스턴스 생성이 어려운 경우/[29:00] framework와 생성할 인스턴스를 분리하고자 할 경우/[30:45] Clone알아보기/[32:12] Clone이 내부적으로 하는 일/[33:19] Cloneable인터페이스/[34:05] Builder패턴의 개념/[34:30] Biilder패턴의 예제/[34:58] 클래스의 구성 확인/[35:30] Builder클래스/[36:06] Builder클래스의 하위 클래스/[36:43] Builder클래스의 소스 코드/[37:15] Director클래스의 소스 코드/[38:22] construct메소드/[39:22] TextBuilder클래스 소스 코드/[40:20] HTMLBuilder클래스 소스 코드/[41:13] Main클래스 소스 코드/[42:00] 동일한 메소드/[43:12] Builder패턴의 역할/[43:45] ConcreteBuilder의 역할/[44:22] Director의 역할/[45:06] Client의 역할/[45:45] 순차다이어그램/[46:05] Director소스 코드 확인/[48:38] Builder클래스를 수정하는 것

  • 11.56분 디자인 패턴들 part5

    Bridge, Strategy, Composite

    책갈피 : [00:02] Bridge패턴의 역할/[00:34] 기능의 클래스 계층/[01:07] 기능을 추가하기 위해 만들어진 계층/[01:57] 구현의 클래스 계층/[02:53] 클래스 계층 등장/[05:12] Bridge패턴의 예제/[05:30] 4개의 클래스/[06:11] Display와 CountDisplay는 기능의 클래스 계층/[06:15] DisplayImpl과 StringDisplayImpl는 구현의 클래스 계층/[06:44] Display클래스의 소스/[07:00] 인수로 전달된 인스턴스/[07:27] open, print, close메소드/[07:46] 메소드를 실행하기 위해 impl필드의 구현 메소드 사용/[08:16] CountDisplay클래스 소스/[08:41] multiDisplay추가/[09:31] DisplayImpl클래스 소스/[09:48] StringDisplayImpl클래스 소스/[10:35] Main클래스 소스/[10:58] 변수 d1, d2, d3/[11:48] d3는 multiDisplay도 호출/[12:18] Abstraction역할/[12:48] RefinedAbstraction역할/[13:03] Implementor역할/[13:22] ConcreteImplementor역할/[14:00] 기능을 추가 할 경우/[15:20] 상속과 위임/[16:15] 예제에서 위임 사용/[18:03] Strategy패턴/[19:02] Strategy패턴을 사용한 게임 예제/[19:56] Hand클래스 소스/[20:30] Hand클래스의 인스턴스 3개 작성/[21:07] 가위바위보의 승패 비교/[21:25] fight메소드/[22:18] 퍼센트 연산자 사용/[23:03] Strategy인터페이스/[23:33] study메소드/[24:18] WinningStrategy클래스/[24:55] random이용/[25:37] ProbStrategy클래스/[25:56] history필드/[27:15] getSum/[28:41] study메소드/[29:02] Player클래스/[29:52] win, lose, even메소드/[30:30] Main클래스/[30:51] player1과 player2/[31:07] for문 사용/[31:55] Robot의 예제/[32:37] Robot클래스 소스/[32:52] RobotA와 RobotB 각각 attack과 move구현/[34:07] 새로운 내용으로 변경을 위해 기존 코드 수정/[34:45] 기능이 중복되는 상황/[35:15] 새로운 Robot을 추가/[36:06] Robot설계의 문제 해결/[37:07] 구체적인 이동방식과 공격방식을 담은 클래스/[39:27] Robot클래스에 setMovingStrategy와 setAttackStrategy메소드 정의/[39:58] 계선된 설계를 코드로 변경/[40:35] MovingStrategy인터페이스 선언/[40:52] AttackStrategy인터페이스 선언/[41:06] Client클래스 소스/[41:37] Strategy Pattern의 각 역할/[42:28] Strategy인터페이스/[42:45] ConcreteStrategy역할/[43:00] Context역할/[43:52] Composite패턴/[46:27] Entry클래스/[46:37] Entry클래스의 소스/[46:52] 하위클래스인 File과 Directory/[47:15] getName메소드 하위클래스에서 구현/[47:29] getSize메소드 하위클래스에서 구현/[48:07] add 구현/[48:29] printList메소드/[49:15] toString메소드/[49:52] File클래스 소스/[51:04] Directory클래스 소스/[51:52] getSize메소드 보기/[53:52] add메소드 보기/[54:29] printList메소드 보기/[55:08] FileTreatmentException클래스

  • 12.56분 디자인 패턴들 part6

    Composite, Decorator

    책갈피 : [00:04] Composite패턴의 Main클래스 소스/[00:15] 디렉토리 계층 확인/[01:07] usr디렉토리에 새로운 디렉토리 생성/[01:49] add메소드 구현 방법/[02:07] Entry클래스에서 구현하고 에러를 넘겨주는 방법/[02:50] Entry클래스에서 구현하고 아무것도 실행하지 않는 방법/[03:07] Entry클래스에서 선언하지만 구현하지 않는 방법/[03:45] Directory클래스에만 add를 넣는 방법/[04:15] Composite패턴의 구조/[05:12] Computer모델링 하는 예제/[05:30] Keyboard, Body, Monitor클래스 정의/[06:00] 컴퓨터클래스 부품을 표현한 클래스 다이어그램/[06:15] 합성관계 표시/[07:15] Keyboard, Body, Monitor클래스의 코드/[07:30] Computer클래스의 코드/[07:56] addBody, addKeyboard, addMonitor메소드/[08:24] Client클래스의 코드/[09:05] 설계의 문제점/[09:28] Speaker객체를 지원할 수 있도록 Computer클래스를 확장하는 방법/[10:26] Speaker클래스 코드/[10:48] Speaker클래스를 지원하는 Computer클래스 코드/[11:41] Computer클래스의 코드를 변경해야만 하는 설계/[12:39] ocp를 준수할 수 있도록 개선한 Computer클래스의 클래스 다이어그램/[12:54] ComputerDevice클래스 정의/[14:16] Computer클래스도 ComputerDevice의 하위클래스로 정의/[14:46] ComputerDevice추상클래스 코드/[15:28] 변경된 Computer클래스 확인/[15:43] addComponent메소드/[16:29] 개선된 Computer클래스를 이용하는 Client클래스 코드/[18:30] Speaker클래스를 ComputerDevice의 하위클래스로 구현/[19:11] Client에 Speaker추가된 것 확인/[20:06] Composite Pattern의 각 역할/[21:33] Decorator패턴/[21:52] 문자열 주변에 장식을 표시하는 예제/[22:30] Display는 문자열 표시용 추상클래스/[23:00] Display클래스의 코드/[23:48] show메소드/[24:26] StringDisplay클래스 코드/[25:40] Border클래스 코드/[27:59] SideBorder클래스/[28:47] getColumns메소드-문자수 계산/[29:48] getRows메소드/[30:03] getRowText메소드/[30:47] FullBorder클래스 코드/[31:02] makeLine메소드/[32:45] Main클래스 코드/[34:07] 인스턴스 b1, b2, b3의 관계 확인/[34:43] 네비게이션 예제/[35:52] RoadDisplay클래스 소스/[36:44] draw메소드 구현/[37:22] 소스 코드의 문제점/[37:52] 도로 표시 기능을 추가로 구현하는 경우/[38:20] RoadDisplayWithTraffic클래스 정의/[38:37] RoadDisplay에서 상속받은 draw메소드 오버라이드/[39:07] RoadDisplayWithTraffic클래스 코드/[39:30] 여러가지 추가기능을 조합해야 하는 경우/[41:15] LaneDecorator와 TrafficDecorator를 이용한 설계/[42:42] Display클래스/[43:07] DisplayDecorator클래스/[43:22] LaneDecorator클래스/[43:52] TrafficDecorator클래스/[44:12] Client클래스 소스 코드 확인/[45:37] 동일한 Display클래스를 통해 도로 정보 표시/[48:30] 교차로를 표시하는 기능을 추가하려면 CrossingDecorator클래스 추가/[49:06] 내용은 다른 Decorator클래스와 유사/[51:30] 추가기능을 동적으로 생성하는 예제/[52:04] Decorator Pattern의 각 역할

  • 13.53분 디자인 패턴들 part7

    Visitor, Chain of Responsibility

    책갈피 : [00:03] Visitor패턴/[00:49] 데이터구조와 처리 분리/[01:23] Visitor패턴의 예제를 위한 클래스다이어그램/[01:53] Visitor클래스/[02:07] Element/[02:22] ListVisitor/[02:44] Entry의 하위 클래스 File과 Directory/[02:58] Visitor클래스 자세히 보기/[03:21] visit라는 동일한 이름의 메소드를 2개 선언/[04:24] Visitor클래스의 소스 코드/[04:46] Element인터페이스/[05:15] Entry클래스/[05:57] accept를 실제로 구현하는 Entry의 하위클래스/[06:15] add메소드는 Entry클래스에서 예외처리/[06:46] iterator메소드 Entry클래스에서 예외처리/[07:00] File클래스/[07:15] accept메소드/[08:16] Directory클래스/[08:35] iterator메소드/[09:24] ListVisitor클래스/[09:43] ListVisitor클래스의 소스 코드/[10:11] visit file 메소드/[10:58] visit directory 메소드/[12:13] File클래스 소스 코드/[12:45] Main클래스 소스 코드/[13:15] ListVisitor의 인스턴스를 사용/[14:01] File클래스와 Directory클래스, ListVisitor의 관계/[14:39] Entry는 Element구현/[15:07] 상호 호출에 관한 내용/[15:35] 한 Directory에 2개의 File이 있을 때의 처리/[18:48] Directory인스턴스나 File인스턴스는 accept메소드 호출/[19:33] Visitor패턴의 각 역할/[20:00] Visitor의 역할/[20:40] ConcreteVisitor의 역할/[21:26] Element의 역할/[21:52] ConcreteElement들의 역할/[22:11] ObjectStructure의 역할/[22:56] Visitor패턴의 메소드 호출/[24:03] 더블 디스패치(double dispatch)/[25:52] OCP/[28:11] 주의할 점/[29:21] 새로운 ConcreteVisitor의 역할 추구/[29:48] ConcreteElement의 역할 추가는 복잡/[30:51] 데이터 구조의 요소에 대한 처리를 따로 분리/[32:07] Visitor패턴에 대한 정리/[34:20] Chain of Responsibility패턴/[35:51] Chain of Responsibility패턴을 사용한 예제/[37:15] Trouble클래스의 소스 코드/[37:37] Support클래스/[38:36] Support클래스의 소스 코드/[39:28] resolve메소드/[40:29] NoSupport클래스/[40:49] LimitSupport클래스/[41:30] OddSupport클래스/[41:45] SpecialSupport클래스/[42:00] Main클래스/[42:45] setNext메소드 사용/[45:22] Chain of Responsibility패턴의 각 역할/[45:37] Handler의 역할/[46:07] ConcreteHandler의 역할/[46:29] Client의 역할/[48:49] Chain of Responsibility패턴을 사용하지 않을 경우/[50:52] Chain of Responsibility패턴을 사용할 때 고려할 점/[52:28] Chain of Responsibility 정리

  • 14.56분 디자인 패턴들 part8

    Facade, Mediator

    책갈피 : [00:05] Facade패턴/[00:46] 상호 관련된 클래스 제어/[01:41] 사용자의 웹페이지를 작성하는 예제/[02:49] Database클래스/[03:07] Database클래스의 소스 코드/[03:57] HtmlWriter클래스의 소스 코드/[04:46] title메소드 제일 먼저 호출/[05:11] PageMaker클래스 소스 코드/[06:15] Main클래스 소스 코드/[06:46] Facade패턴으로 생각한 역할/[07:38] 시스템을 구성하는 역할/[08:43] Facade의 역할/[09:26] 인터페이스의 수가 적은 것/[10:48] 확장시켜서 Facade패턴 적용/[11:52] 추상팩토리 패턴과 관련/[12:33] Facade패턴 정리/[12:56] Mediator패턴/[14:07] Mediator패턴의 예제 클래스 다이어그램/[14:50] 사용자 Login인 경우/[15:18] 게스트 Login인 경우/[17:03] OK나 Cancle버튼은 각각의 다른 클래스로 정의/[18:33] 다수의 오브젝트 사이를 조정해야 할 경우 Mediator패턴 사용/[19:06] 예제의 클래스 살펴보기/[20:33] LoginFrame의 구성/[21:48] Mediator인터페이스/[21:56] createColleagues메소드/[22:15] colleagueChanged메소드/[22:48] Colleague인터페이스/[23:30] setMediator메소드/[24:18] setColleagueEnabled메소드/[25:52] ColleagueButton클래스/[26:33] mediator필드/[26:52] setColleagueEnabled메소드/[27:22] ColleagueTextField클래스/[29:03] textValueChanged메소드/[29:41] ColleagueCheckbox클래스/[30:56] LoginFrame클래스/[32:22] createColleagues메소드/[32:44] colleagueChanged메소드/[33:07] userpassChanged메소드/[33:37] LoginFrame의 생성자 부분/[34:44] 리스너의 설정 수행/[36:00] colleagueChanged메소드 내용 보기/[37:07] Main클래스/[37:30] Mediator패턴을 보고 각 역할 알아보기/[37:57] ConcreteMediator의 역할/[38:27] Colleague인터페이스의 역할/[38:43] ConcreteColleague의 역할/[39:07] Mediator패턴의 예제/[39:30] 미디어플레이어의 주요기능/[40:59] 각 영역을 별도의 클래스로 구현-의존관계 형성/[42:07] 재사용이 어려운 단점/[43:29] 함께 사용되는 클래스가 증가할수록 개별 클래스의 수정이 어려워지는 단점/[45:19] 문제점 해결을 위해 Mediator패턴 사용/[46:57] VideoListUI의 소스 일부분 확인/[47:30] VideoMediator의 소스 일부분 확인/[49:15] MediaController와 VideoMediator의 의존 부분/[51:22] Mediator패턴의 단점/[51:45] 추상 Mediator클래스의 재사용/[53:21] select메소드와 volumeChanged메소드의 구현/[55:15] Mediator패턴 정리

  • 15.55분 디자인 패턴들 part9

    Observer 패턴

    책갈피 : [00:04] Observer패턴/[00:40] 예제를 위한 클래스 다이어그램 확인/[01:59] Observer인터페이스/[02:22] update메소드/[03:00] NumberGenerator클래스/[03:38] addObserver메소드/[03:51] notifyObservers메소드/[04:26] RandomNumberGenerator클래스/[05:29] DigitObserver클래스/[06:13] GraphObserver클래스/[06:40] Main클래스를 보며 Observer사용 확인/[07:26] execute를 할 경우/[08:09] 여러가지 방식으로 성적을 출력하는 예제/[08:31] ScoreRecord클래스와 DataSheetView클래스 필요/[10:50] ScoreRecord클래스의 소스 코드/[11:50] DataSheetView클래스 소스 코드/[12:43] Client클래스 소스 코드/[13:37] addScore메소드 호출/[14:11] 주의점/[15:16] addScore메소드를 호출할 때 dateSheetView의 update메소드 호출/[15:46] 성적을 다른 형태로 출력하고 싶을 경우의 변경 작업/[16:36] 최소, 최대값만 출력/[17:07] ScoreRecord부터 소스 변경/[17:37] MinMaxView클래스 추가/[18:33] displayMinMax메소드는 Collections클래스 이용/[19:21] ocp에 위배가 되는 작업/[20:02] 동시에 또는 순차적으로 성적을 출력하는 경우/[21:30] 적용한 ScoreRecord클래스 소스/[21:48] dataSheetViews필드/[22:15] setMinMaxView메소드/[22:52] Client클래스/[24:11] 출력 변경을 새로운 클래스에 통보할 때마다 반복적으로 발생/[25:33] 공통기능을 상위클래스 및 인스턴스로 일반화 시키고 활용해 ScoreRecord구현/[25:59] 개선한 ScoreRecord클래스 다이어그램/[26:32] Subject클래스 정의/[28:00] ScoreRecord클래스의 소스 구성/[28:29] 추상클래스 Subject/[28:59] attach메소드와 detach메소드/[29:40] ScoreRecord클래스/[30:14] DataSheetView클래스와 MinMaxView클래스는 기존 코드와 동일/[30:30] Client클래스 소스 코드/[31:33] 성적변경에 관심이 있는 대상객체들의 관리는 Subject클래스에서 구현/[32:35] 목록출력과 최소/최대값 출력, 합계와 평균 출력/[33:30] StatisticsView클래스/[33:49] update메소드/[34:15] displayStatistics메소드/[34:27] Client클래스의 소스 코드/[36:19] Observer패턴만볼 수 있도록 구성한 클래스 다이어그램/[38:35] Observer의 역할/[38:59] Subject의 역할/[39:21] ConcreteSubject의 역할/[39:52] ConcreteObserver의 역할/[41:19] Subject클래스의 notifyObservers메소드 호출/[42:12] 다음 예제/[42:42] StatusChecker클래스의 소스 코드/[43:37] 변경된 클래스 다이어그램 확인/[44:21] 상태가 변경될 때 임의의 객체에게 변경사실 통보/[44:45] Observer패턴 적용/[45:49] notifyStatus메소드가 등록된 Observer객체의 omAbnormalStatus메소드 호출/[46:14] StatusSubject클래스/[46:36] notifyStatus메소드/[47:15] StatusChecker클래스/[48:22] StatusObserver인터페이스/[49:07] Observer를 등록하는 부분/[50:37] Observer패턴을 적용할 때의 장점/[51:22] Observer객체에게 상태를 전달하는 방법

  • 16.60분 디자인 패턴들 part10

    Observer, Memento, state

    책갈피 : [00:05] Observer패턴/[00:19] Subject객체 구분/[01:00] OnClickListener인터페이스가 Observer인터페이스/[01:15] onClick했을 때 login할 수 있도록 구현/[01:52] onCreate메소드/[02:57] onClick메소드에서 id값 사용/[04:15] Observer패턴을 구현할 때 고려해야 할 사항/[04:25] 주제 객체의 통지 기능 실행 주체/[05:40] Client에서 여러 StatusChecker를 두고 조건을 만족하는지 확인/[06:24] Subject객체에서 직접 통지기능을 실행하는 것이 구현에 유리/[07:40] 옵저버 인터페이스의 분리/[08:41] EventObserver인터페이스/[09:11] ConcreteObserver클래스는 모든 메소드 구현/[10:37] 통지 시점에서의 주제 객체 상태/[11:01] SomeSubject를 상속받고 있는 AnySubject클래스/[12:22] 옵저버 객체가 올바르지 않은 값을 사용하는 문제 발생/[12:45] 템플릿 메소드 패턴을 적용한 예/[13:07] 상위클래스가 제어의 흐름 결정/[13:54] 옵저버 객체의 실행 제약 조건/[14:26] notifyToObserver메소드/[15:33] 옵저버 인터페이스를 정의할 때는 옵저버 메소드의 실행 제한에 대한 기준 필요/[16:41] Observer패턴의 정리/[17:03] Memento패턴/[18:41] 캡슐화의 파괴에 빠지지 않고 저장과 복원 실행/[19:03] undo, redo, history, snapshot 실행/[19:25] Memento패턴의 예제 클래스 다이어그램/[19:45] 게임규칙 살펴보기/[20:22] 프로그램에서 Memento를 어떻게 사용하는지 확인/[20:56] Memento클래스 보기/[21:30] money필드와 fruits필드 보기/[22:00] Memento클래스의 소스 코드/[22:41] addFruit메소드/[23:22] Gamer클래스 소스 코드/[23:52] 중심이되는 bet메소드/[24:30] createMemento메소드/[25:18] restoreMemento메소드/[26:00] Main클래스 소스 코드/[26:33] Memento패턴 적용/[26:52] createMemento를 통해 현재상태 저장/[27:18] 시퀀스 다이어그램으로 나타내서 학인/[28:03] Memento패턴의 역할/[28:17] Originator의 역할/[28:52] Memento의 역할/[29:26] wide interface: 넓은 인터페이스/[30:00] narrow interface: 좁은 인터페이스/[30:41] Caretaker의 역할/[31:26] Memento역할이 갖는 좁은 인터페이스만 사용/[32:19] 자바의 엑세스 제어 기능 사용/[34:45] Caretaker역할의 Main클래스/[35:07] Main클래스가 할 수 있는 일/[36:30] Memento의 개수와 유효기간/[37:37] Caretaker의 역할과 Originator의 역할을 분리하는 이유/[39:00] Memento패턴의 정리/[39:14] State패턴/[39:52] 상태를 클래스로 표현/[40:30] State패턴을 사용한 예제/[42:43] 예제를 유사코딩으로 작성/[43:36] State패턴을 사용해 유사코딩으로 작성/[44:42] 두 코드의 차이점/[45:44] 예제의 클래스 다이어그램/[46:52] State인터페이스/[47:52] 상태 의존 메소드의 집합/[48:19] DayState클래스/[49:20] DayState클래스의 소스/[49:45] doClock메소드/[51:42] NightState클래스의 소스/[52:15] Context인터페이스/[52:35] 추상메소드들 선언/[53:07] SafeFrame클래스 소스/[53:30] 필드와 메소드 살펴보기/[54:00] SafeFrame생성자 보기/[54:22] Panel생성 후 버튼 저장/[54:45] actionPerformed메소드/[56:13] 리스너 설정 부분 확인/[57:15] 버튼이 클릭되었을 때 호출되는 메소드/[58:22] state패턴을 사용하지 않고 프로그래밍을 했을 경우/[59:13] changeState메소드

  • 17.1시간 1분 디자인 패턴들 part11

    state 패턴

    책갈피 : [00:04] State패턴의 예제/[00:20] doUse메소드의 다른점/[01:03] setClock을 통해 State가 바뀌는 과정 확인/[01:26] Main클래스 소스 코드/[02:06] State패턴의 클래스 다이어그램을 보며 각 클래스의 역할 확인/[02:23] State의 역할/[02:53] ConcreteState의 역할/[03:27] Context의 역할/[04:29] Divide and conquer/[05:26] 상태가 많은 시스템에서 State패턴의 장점 발휘/[06:10] State패턴은 시스템 상태를 클래스로 표현/[06:25] SafeFrame클래스의 setClock메소드와 State인터페이스의 doClock메소드의 관계/[07:53] 상태의 의존한 처리 이해/[08:16] 상태 전환의 관리/[08:54] SafeFrame클래스가 changeState메소드 구현/[09:35] 상태 전환의 장점과 단점/[11:33] 상태 전환은 SafeFrame클래스에 맡기기/[11:50] Context역할이 모든 ConcreteState의 역할을 알아야 하는 단점/[12:16] State패턴을 사용하므로 얻는 장점/[13:05] state필드의 값이 시스템의 상태를 결정/[13:22] 새로운 상태 추가/[13:56] 특정 메소드 추가/[14:20] 클래스의 수정이 많지만 에러를 줄여주는 역할/[15:13] 인스턴스활용 부분 소스 코드/[15:56] this가 addActionListener와 doUse에 전달될 때의 차이/[17:32] State패턴의 다음 예제/[18:06] 선풍기를 표현한 상태 다이어그램/[19:15] 상태의 한 종류 Pseudo state/[19:45] 상태 머신 다이어그램의 시작과 종료/[20:15] 상태진입/[20:37] 특정이벤트 발생 후 조건을 만족할 경우/[21:02] 진입 이후 수행해야 하는 액션/[21:15] 선풍기가 OFF상태일 경우/[21:45] 상태 머신 다이어그램의 해석/[23:21] 선풍기가 ON이나 WORKING상태일 경우/[23:41] Active라는 복합상태 이용/[24:47] 복합상태 안의 ON상태/[25:11] 형광등 예제/[26:11] 상태 머신 다이어그램으로 표현/[26:41] 상태 머신 다이어그램으로 실제 코드 만들기/[27:00] 변수 설정/[27:29] Light클래스 구현/[28:22] Client클래스/[28:48] 새로운 요구사항이 있을 때의 코드 변경/[29:52] 상수 추가/[30:41] 두번째 Light클래스/[31:06] 각 메소드에 SLEEPING상태 추가/[32:13] 변하는 부분을 찾아서 캡슐화/[33:15] 형광등의 상태 머신 다이어그램/[33:37] 구조가 Strategy패턴과 유사/[34:30] 코딩하기/[35:15] State인터페이스/[35:22] ON클래스/[36:15] OFF클래스/[37:22] 상태진입도 각 상태에서 처리/[37:43] Light클래스를 수정한 코드/[38:35] state의 메소드 이용/[39:52] 개선할 점/[41:07] Singleton패턴을 사용해 ON과 OFF클래스 변경/[42:22] State Pattern의 콜라보레이션 다이어그램/[43:57] State인터페이스의 역할/[44:22] 각각의 State확인/[45:22] request메소드/[45:37] State패턴을 적용한 Light클래스/[46:52] state변수의 변경/[47:22] State패턴의 새로운 예제/[47:52] 자판기에 들어갈 소프트웨어의 내용/[49:15] VendingMachine클래스로 구현/[49:35] insertCoin메소드/[50:29] select메소드/[51:37] SOLDOUT추가/[52:36] 각 메소드의 코드/[53:22] 상태 패턴을 적용한 자판기 프로그램의 클래스 다이어그램/[54:30] 상태패턴이 적용된 VendingMachine의 소스 코드/[55:00] insertCoin과 select메소드/[55:22] NoCoinState클래스/[55:59] increaseCoin메소드/[56:27] select메소드/[56:37] SelectableState클래스/[57:22] 상태패턴 적용 전과 비교/[58:57] Context에서 직접 상태 변경하는 코드/[60:36] 상태객체에서 Context의 상태를 변경할 경우/[61:00] State패턴의 정리

  • 18.55분 디자인 패턴들 part12

    Flyweight, Proxy

    책갈피 : [00:05] Flyweight패턴/[00:30] 무게의 개념은 메모리의 사용량/[00:46] new Something문장/[01:30] 이미 만들어져 있는 인스턴스 공유/[01:48] Flyweight패턴을 사용한 예제 클래스 다이어그램/[02:13] BigChar클래스/[03:07] BigCharFactory클래스/[03:53] BigString클래스/[04:10] BigChar클래스의 소스 코드/[04:15] fontdata/[05:14] 복잡한 생성자/[06:30] BigCharFactory클래스의 소스 코드/[06:46] 공유의 방법 실현/[07:00] pool필드는 인스턴스 관리/[07:41] put메소드/[07:55] get메소드/[08:26] singleton패턴을 사용해서 구현/[08:48] getInstance메소드/[09:01] getBigChar메소드/[09:39] pool이용/[10:07] new를 사용해서 BigChar의 인스턴스 생성/[10:52] synchronized/[11:43] BigString클래스의 소스 코드/[12:16] for문을 돌며 factory.getBigChar메소드 호출/[12:35] new연산자를 이용하면 인스턴스 공유 불가능/[12:52] bigchars의 배열 보기/[13:54] Main클래스의 소스 코드/[14:15] BigString인스턴스를 만들고 표시하는 것 구현/[14:28] Flyweight패턴의 각 역할/[14:41] Flyweight의 역할/[15:05] FlyweightFactory의 역할/[15:24] Client의 역할/[16:03] Flyweight패턴은 인스턴스를 공유/[16:11] 주의점/[18:03] BigString에서 색 정보를 제공할 경우/[18:37] Intrinsic, extrinsic/[21:07] 인스턴스와 garbage collection/[23:52] 인스턴스에 대한 참조 제거/[24:26] 메모리 이외의 리소스/[25:03] 인스턴스를 new할 경우/[25:48] Flyweight패턴 정리/[26:03] Proxy패턴/[26:37] Proxy패턴을 사용한 예제/[27:32] setPrinterName, getPrinterName메소드/[27:52] print메소드를 호출해 Printer클래스의 인스턴스 생성/[28:22] Printable인스턴스 정의/[28:55] Printer클래스의 소스 코드/[30:07] heavyJob메소드/[30:25] Printable인터페이스/[30:52] PrinterProxy클래스 소스 코드/[31:45] realize메소드/[32:57] 대리인의 인스턴스 이름 설정/[33:22] 위임 과정/[33:58] 생성되지않는 Printer의 인스턴스/[35:37] synchronized메소드로 하지 않은 경우/[36:22] Main클래스의 소스 코드/[37:44] Printer클래스의 생성자/[38:52] PrinterProxy클래스를 수정하기위한 방법/[39:35] real필드 변경/[40:28] Main에 PrinterProxy생성부분 변경/[41:35] Proxy패턴의 각 역할/[41:57] Subject의 역할/[42:27] Proxy의 역할/[43:15] RealSubject의 역할/[43:45] Client의 역할/[46:30] 분리해서 개별적으로 수정 가능/[48:07] 위임/[48:45] 투과적/[49:28] Proxy패턴의 종류/[49:42] Virtual Proxy(가상 프록시)/[49:52] Remote Proxy(원격 프록시)/[50:19] Access Proxy/[50:44] Proxy패턴의 예제/[52:12] 예제를 Proxy패턴으로 구현한 ProxyImage클래스/[52:30] draw메소드/[53:07] ListUI클래스/[55:14] Proxy패턴의 정리

  • 19.1시간 52분 디자인 패턴들 part13

    Command, Interpreter

    책갈피 : [00:05] Command패턴/[00:37] 명령 표현/[02:07] Command패턴을 사용한 그림그리기 예제/[02:42] 클래스 다이어그램 확인/[03:05] 점을 그리는 명령-DrawCommand클래스의 인스턴스로 생성/[03:19] 3가지 패키지로 구성/[04:30] Command인터페이스의 소스 코드/[04:46] execute메소드 호출/[05:15] MacroCommand클래스의 소스 코드/[05:46] commands필드/[07:00] append메소드/[07:57] undo메소드/[08:22] clear메소드/[08:46] DrawCommand클래스의 소스 코드/[09:52] execute메소드/[10:11] Drawable인터페이스/[10:39] DrawCanvas클래스의 소스 코드/[12:16] paint메소드/[12:48] draw메소드/[13:18] Main클래스의 소스 코드/[14:09] history필드/[14:22] canvas필드/[14:37] clearButton필드/[14:58] 생성자에서 전체화면 구성/[16:07] 이벤트리스너 설정/[16:33] 버튼의 레이아웃/[17:26] actionPerformed메소드/[17:48] mouseMoved와 mouseDragged메소드/[18:29] 윈도우 리스너 인터페이스를 구현하기 위한 메소드/[18:59] 버튼 예제/[19:47] 예제 클래스 다이어그램을 기반으로 소스 코드 작성/[20:18] Button클래스/[21:11] 버튼을 눌렀을 때 다른 기능을 실행하는 경우/[22:21] 버튼을 누르는 동작에 따라 다른 기능 실행/[23:18] Button클래스에 setMode메소드 추가/[23:48] Client클래스 확인/[25:03] 새로운 기능의 추가나 변경을 하더라도 Button클래스를 그대로 사용하기 위한 방법/[25:44] pressed메소드 수정/[25:59] 여러가지 기능을 수행하는 버튼클래스의 설계 예제/[27:30] 예제를 구현한 소스 코드 확인/[28:26] Button클래스/[29:11] LampOnCommand클래스/[29:41] Alarm클래스/[30:18] Client클래스/[31:03] 동일한 pressed메소드 호출/[31:48] Command패턴 적용/[32:07] Button클래스의 pressed메소드/[33:22] 버튼을 한번 눌렀을 때 램프를 켜고 두번 눌렀을 때 램프를 끄는 기능의 구현/[34:15] Lamp클래스에 turnOFF메소드 추가/[34:27] LampOffCommand클래스 추가/[34:51] Client클래스/[35:07] setCommand를 통해 lampOffCommand설정/[35:30] LampOffCommand클래스 새롭게 정의/[36:07] 파일open과 파일close가 있다고 가정/[37:00] Command Pattern을 사용해 메뉴아이템 재사용/[37:37] Command패턴에서 각각의 역할/[37:52] ConcreteCommand의 역할/[38:15] Receiver의 역할/[38:52] 첫번째 예제의 Command패턴 적용부분 확인/[40:30] Main클래스 소스 코드/[41:35] Main클래스와 DrawCanvas클래스가 execute메소드 호출/[41:58] 시퀀스 다이어그램 확인/[43:43] 그림그리기에 색을 설정하는 기능 추가하기/[44:52] ColorCommand클래스 생성/[45:15] Drawable인터페이스 수정/[45:37] DrawCanvas에 적용/[46:22] setColor메소드 추가/[47:00] Main클래스에 3개의 버튼 추가 생성/[47:22] 버튼 버튼박스에 추가/[48:12] redButton이 눌렸을 때의 Command/[48:52] blueButton과 greenButton동일 작업/[49:13] undo기능 추가/[49:49] Main클래스에 undo버튼 추가/[50:30] Command패턴의 정리/[50:52] Interpreter패턴/[51:45] 변화가 생겼을 때 어느 레벨의 프로그램을 수정할 것인지 확인/[53:07] 미니 언어 설명/[54:22] 미니 언어로 기술된 미니 프로그램의 예/[56:00] 미니 언어의 문법/[58:45] 미니 언어를 구분해석하는 예제/[60:00] 예제 프로그램의 클래스 다이어그램/[61:19] Node클래스의 소스 코드/[62:50] ProgramNode클래스/[63:49] Token-구문해석의 처리 단위/[65:15] CommandListNode클래스/[68:09] CommandNode클래스/[69:30] RepeatCommandNode클래스/[70:14] parse메소드/[72:45] PrimitiveCommandNode클래스/[73:56] Context클래스/[76:15] nextToken메소드 호출/[77:15] Main클래스/[78:45] parse를 끝내고 node출력/[79:45] Interpreter패턴의 각 역할/[80:45] TerminalExpression의 역할/[81:00] NonTerminalExpression의 역할/[81:26] Context의 역할/[81:45] Client의 역할/[82:13] 미니 언어의 다른 종류/[83:30] Interpreter를 만들 때의 오류/[84:15] 프로그램을 수정해서 실행/[87:00] InterpreterFacade클래스/[87:45] parse메소드/[88:40] ExecutorFactory인터페이스/[88:54] Context클래스에서 ExecutorFactory구현/[89:45] Node클래스에서 Executor구현/[90:30] ProgramNode클래스/[91:00] CommandNode클래스/[91:30] RepeatCommandNode클래스/[91:58] CommandListNode클래스/[92:15] PrimitiveCommandNode클래스/[93:45] TurtleCanvas클래스/[96:00] TurtleExecutor클래스/[97:41] initialize호출/[99:15] Main클래스/[00:00] actionPerformed메소드/[00:17] parseAndExecute메소드/[00:53] Interpreter패턴 정리/[01:38] Iterator패턴/[02:28] Iterator와 Visitor패턴을 같이 사용할 경우/[02:42] Composite패턴/[03:00] Factory Method/[03:23] Adapter패턴/[04:15] Template Method/[05:00] Factory Method의 연관 패턴/[06:14] Singleton패턴/[06:38] Prototype의 연관 패턴/[07:46] Builder의 연관 패턴/[08:43] Abstract Factory/[09:15] Bridge/[09:35] Strategy패턴/[10:54] Chain of Responsibility/[11:18] Mediator

  • 20.1시간 27분 UML 다이어그램

    다이어그램 종류, 유스케이스, 컴포넌트, 복합구조, 활동, 상태, 시퀀스, 통신, 타이밍, 상호작용 개요, 배치

    책갈피 : [00:05] UML알아보기/[00:47] UML의 다이어그램의 종류와 특성/[01:19] 여러가지 다이어그램을 클래스 다이어그램으로 구성/[02:51] UML2.0을 구성하는 다이어그램/[03:53] 구조 다이어그램/[04:00] Class다이어그램/[04:15] Object다이어그램/[04:28] Deployment다이어그램/[04:58] Package다이어그램/[05:15] Component다이어그램/[05:24] Composite structure다이어그램/[07:00] 행위 다이어그램/[07:46] Use case다이어그램/[08:03] State machine다이어그램/[08:16] Activity다이어그램/[08:26] Interaction다이어그램/[08:41] Sequence와 Communication다이어그램/[09:20] Interaction overview다이어그램/[09:39] Timing다이어그램/[10:13] 요구사항 정의 단계에서 사용되는 다이어그램/[10:50] 분석 단계에서 사용되는 다이어그램/[12:31] 설계 단계에서 사용되는 다이어그램/[14:45] 구현과 테스트 단계에서 사용되는 다이어그램/[16:10] Package다이어그램은 요구사항 정의, 분석, 설계 단계에서 사용/[16:44] 유스케이스 다이어그램의 예제/[17:11] 시스템과 상호작용하는 대상을 액터로 정의/[20:03] 유스케이스로 포함되지 않은 것은 요구사항에서 제외/[21:48] Timer액터의 역할/[22:22] 확장된 유스케이스 다이어그램 확인/[22:48] 액터의 일반화/[24:07] Use case의 일반화/[25:30] Use case의 포함/[26:37] Use case의 확장/[27:36] 액터간의 연관관계/[28:29] 클래스 다이어그램/[28:56] 도서대출 시스템을 구성하고 있는 클래스/[29:33] 능동(actiive)클래스/[30:41] boundary/[30:52] control/[31:06] entity/[31:26] 속성과 연산이 명시된 클래스 다이어그램/[32:52] 설계단계의 클래스 다이어그램 활용방법/[33:37] 파트클래스의 표현/[35:22] 객체 다이어그램/[35:43] 객체의 표현방법 확인/[36:37] 4개의 객체는 교통수단 클래스로 instantiation의존관계/[37:37] 패키지 다이어그램/[38:07] packageElement/[38:57] 클래스를 패키지로 조직화한 예제/[39:45] 컴포넌트 다이어그램/[40:29] 소프트웨어 아키텍쳐를 표현할 때 사용/[41:15] 인터페이스/[41:52] 인터페이스를 구성하는 연산에의해 정의/[42:45] 복합구조 다이어그램/[43:15] 파트, 포트, 연결자의 개념을 이용/[44:52] 포트-파트간의 통신을 위한 연결지점/[46:07] 연결자/[47:50] 활동 다이어그램/[48:07] 활동노드/[48:22] 객체노드/[48:45] 제어노드/[49:27] 판단노드/[50:05] 병합노드/[50:37] 포크노드/[51:13] 조인노드/[51:52] 제어흐름/[52:27] 객체흐름/[53:15] 예외처리가 추가된 활동 다이어그램/[53:37] orderCancelRequest/[54:57] 활동 다이어그램을 파티션과 구획면을 이용하여 나타낸 그림/[55:12] 파티션/[55:52] Invoice/[56:15] 상태 다이어그램/[56:45] 휴대폰의 종료버튼을 눌렀을 경우의 예제/[57:29] 상태/[58:07] 시작상태/[58:37] 종료상태/[59:36] 전이-객체의 상태가 다른 상태로 변경/[60:00] 이벤트/액션/[60:42] 복잡한 상태 다이어그램의 예제/[61:20] 상태 내부 확인/[62:37] 복합 상태(Operating)/[63:00] 상태 내부의 do/액션/[64:00] 상태를 벗어날 때마다 수행되는 Exit/액션/[65:45] 복합 상태 내부/[67:23] 직교복합 상태/[67:58] Motor의 상태와 ArrivalSensor의 상태/[68:45] 히스토리 상태/[70:00] 시퀀스 다이어그램/[70:28] 생명선/[71:15] 메시지/[71:45] 메시지의 전달 순서/[72:15] 동기적 메시지/[72:45] 비동기적 메시지/[73:15] 복잡한 시퀀스 다이어그램 예제/[73:28] 상호작용 이름/[74:12] 발견된 메시지/[74:40] 복합적 부분/[76:27] 통신 다이어그램/[77:44] 메시지 전달 순서는 메시지 앞에 순번을 명시/[78:45] 타이밍 다이어그램/[79:15] 생명선 가로방향으로 표시/[81:00] 상호작용 개요 다이어그램/[82:15] 활동 다이어그램의 일종/[84:10] 배치 다이어그램/[84:44] 노드/[85:15] 통신 경로/[86:04] 수행 환경