객체 지향 원리 송치형.

Slides:



Advertisements
Similar presentations
Transaction ㅇ Transaction 을 직접 구현하려면, 까다로운 설계와 복잡한 코드를 필요로 하고 수정에 공수가 많이 들게 된다. ㅇ 스프링에서 제공하는 Transaction Manager 를 사용하여 쉽고 간편하게 어려운 트랜잭션을 해결할 수 있다. xml.
Advertisements

6.1 사용사례 6.2 객체 모델링 6.3 동적 모델링 6.4 시스템 설계 6.5 객체 설계 6.6 디자인 패턴
11장. 프로토콜 핸들러 AI &HC I LAB 김 성 현.
어서와 Java는 처음이지! 제2장 자바 프로그래밍 기초.
10. 예외 처리.
컴퓨터 응용 및 실습 Part1. OOP&Java Programming data type Review
소비자 만족도 설문조사 결과.
소프트웨어시스템설계(6주) 데이터베이스 연동
Programming for the java Virtual machine
제14장 원격 메소드 호출 김 기 환. 조 명 휘.
12장. JSP에서 자바빈 활용 제12장.
Java로 배우는 디자인패턴 입문 Chapter 0. UML 과 Design Pattern
제6장 제어(Control) 6.1 구조적 프로그래밍(Structured Programming)
DB와 WEB 연동(1) [2-Tier] Java Applet 이용
2주 실습강의 Java의 기본문법(1) 인공지능연구실.
Chapter 02 자바 기본구조 자바 프로그래밍의 기초적인 문법을 소개
JAVA 언어로 배우는 디자인 패턴 입문 chap. 1-2.
제7장 제어구조 I – 식과 문장.
[ 단원 08 ] 예외처리와 스레드.
메소드 호출과 힙 원격 메소드 호출 서블릿 엔터프라이즈 자바 빈즈
Java RMI (Remote Method Invocation)
Power Java 제4장 자바 프로그래밍 기초.
소프트웨어공학 UML 학기.
10장 객체-지향 프로그래밍 II ©창병모.
IOC, DI 2015 Web Service Computing.
Department of Computer Software MyongJi University
객체지향 언어와 클래스, 객체 ㅎㅎ 개요 클래스의 선언, 객체의 생성 및 속성 참조 방식 멤버 변수 메소드 한빛미디어(주)
화면(UI) 기반 도메인모델 작성 2014년 8월.
01. 직렬화와 역직렬화에 대하여 객체의 직렬화 직렬화와 역직렬화
이쁜 코드 작성하기 마이에트 레이더즈팀 중원.
AOP 개념 및 Spring의 AOP 기능.
Chapter 07 소스코드의 취약점 분석.
명품 Java Programming.
소프트웨어설계 UML 학기.
10장 다중 스레드 10.1 스레드 개요 10.2 Thread 클래스 10.3 스레드 생성
2장 자바환경과 자바 프로그램 2.1 자바 개발 환경 2.2 자바 통합환경 2.3 자바 응용 프로그램과 애플릿 프로그램
프로그램 분석의 구현.
DataScience Lab. 박사과정 김희찬 (월)
This, static, final 지정 예약어 자바 4대 중첩 클래스
Android Coding Convention
8 데이터베이스 사용하기.
12 데이터베이스 사용하기.
광운 객체지향프로그래밍 부성순 강의목표 강의세부내용
상속과 인터페이스 클래스의 상속에 대하여 인터페이스에 대하여.
자바 5.0 프로그래밍.
JDBC (Java Database Connectivity)
제1장 서론.
2009학년도 1학기 상지대학교 컴퓨터정보공학부 고 광 만
DataScience Lab. 박사과정 김희찬 (월)
03. 안드로이드를 위한 Java 문법 제목. 03. 안드로이드를 위한 Java 문법 제목.
Ch.1 Iterator Pattern <<interface>> Aggregate +iterator
3. Spring 프레임워크의 IoC 컨테이너 개념
Chap10 다중 스레드 Section 1 : 스레드 개요 Section 2 : Thread 클래스와 스레드 생명주기
제 2장 어휘구조와 자료형 토 큰 리 터 럴 주 석 자 료 형 배 열 형.
SpringFramework 중간고사 요약 REST by SpringFramework.
컴퓨터공학실습(I) 3주 인공지능연구실.
Spring DI 이해 및 활용.
Internet Computing KUT Youn-Hee Han
자바 5.0 프로그래밍.
Java 3장. 자바의 기본 구조 I : 변수, 자료형, 연산자 public class SumTest {
Spring Security 2015 Web Service Computing.
5.2 트랜잭션 서비스 추상화.
Barat을 이용한 Code Transformation
Java RMI (Remote Method Invocation)
김희정 Bridge Pattern.
Java 5장. 객체지향 개념 public class SumTest {
캡슐화 (Encapsulation) 두원공과대학 소프트웨어개발과 이 원 주.
Java의 정석 제 7 장 객체지향개념 II-3 Java 정석 남궁성 강의
임베디드 프로그래밍 Lecture #
GB ridge 웹 모바일및 빅데이터 응용과정 3주차: 데이터베이스 프로그래밍 [경기도형 대학생 취업브리지 사업]
Presentation transcript:

객체 지향 원리 송치형

객체 지향 프로그래밍 객체(클래스)들에게 적절히 책임(responsibility)을 분배한 뒤 객체들 간의 의존 관계를 관리(dependency management)하는 작업 객체 지향 원리는 책임 분배와 의존 관계 관리의 가이드 라인 역할

나쁜 디자인의 징후 Rigidity – 변경하기 어렵다. Fragility – 깨지기 쉽다. Immobility – 재사용하기 어렵다. Viscosity – 올바른 일을 하기 어렵다. Needless Complexity – 과도한 디자인 Needless Repetition – Copy&Paste?

단일 책임의 원칙 SRP – Single Responsibility Principle 클래스는 하나의 책임만을 맡아야 한다. ‘책임(responsibility)’ == ‘변경의 원인(reason to change)’ “클래스 변경의 원인은 하나이어야 한다.”

전형적인 예

ActiveRecord와 DataMapper 패턴 DAO 하이버네이트의 Session iBatis의 SqlMapClient HibernateTemplate SqlMapClientTemplate

나쁜 냄새 – 중복 코드 중복 코드는 만악의 근원 DRY : Don’t Repeat Yourself!

나쁜 냄새 – 산탄총 수술 Shotgun surgery 수정을 하려 보니 여러 클래스를 수정해야 하더라. 하나의 책임이 여기저기 흩어져 있는 경우

나쁜 냄새 – 여러 원인에 의한 변경 Divergent Change 한 클래스가 이런 저런 이유로 자주 수정되어야 하더라. 여러 개의 책임을 맡고 있음

Good Example - 레이어

핵심 리팩토링 기법과 책임 분배 Extract Class(6번) Move Method(6번) Extract Method(4번) Move Field(4번) Rename *(N번)

의존 관계 역전의 법칙 DIP : Dependency Injection Principle 인터페이스에 의한 프로그래밍 구체 클래스에 의존하게 되면 변경이 어렵고 재사용성이 떨어진다. Depend on abstractions instead of details

전형적인 예 V.

스프링 프레임워크에서는?

Abstract Factory 패턴 interface Collection { Iterator iterator(); // . . . } interface Iterator { boolean hasNext(); Object next(); class Tree implements Collection { public Iterator iterator() { return new Iterator() { // Tree를탐색할 Iterator 인터페이스를 이곳에 구현 class User // 인터페이스만 사용한다. { public void operation( Collection c ) { Iterator i = c.iterator(); while( i.hasNext() ) doSomethingWith( i.next() ); }

Abstract Factory 패턴 Class.forName(“com.mysql.jdbc.Driver”).newInstance(); Connection con = DriverManager.getConnection(jdbc_url, id, password); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(sql); public JDBCDriver(){   try{     java.sql.DriverManager.registerDriver(new JDBCDriver());   }catch(SQLException e){   } } public boolean acceptsURL(String url) throws SQLException{   return url.startWith(“jdbc:postgresql??); } Abstract Factory 패턴과 Chain of Responsibility 패턴을 함께 사용한 예

인터페이스 분리의 원칙 ISP : Interface Segregation Principle Split Interface to manage dependency. Clients should not be forced to depend on methods that they do not use.

전형적인 예

ATM UI 예제

분리된 ATM UI 예제

스프링의 ApplicationContext

(cf) IoC, 헐리우드 원칙

리스코프 대체 원칙 LSP : Liskov Substitution Principle 기반 타입은 서브 타입으로 대체할 수 있어야 한다.

하이버네이트 버전 업그레이드 … Panic! 패키지 구조 변화 Session 인터페이스의 변화 그리고, HQL 파서의 변화 net.sf.*  org.hibernate.* Session 인터페이스의 변화 그리고, HQL 파서의 변화 … Panic!

이렇게 하면? class InfoHelper{ public static java.util.List addInfo(java.util.List currentInfo){                            String info = “new info”;              currentList.add(info);              return currentInfo; } String[] infoValues = new String[]{“info1”, “info2”, “info3”}; List infoList = Arrays.asList(infoValues); infoList = InfoHelper.addInfo(infoList); Exception in thread "main" java.lang.UnsupportedOperationException         at java.util.AbstractList.add(AbstractList.java:150)         …

예외 없는 규칙은 없다. 상속 구조의 폭주와 Decorator 패턴 void f(){           Collection collection = new HashSet();           // …           modify(collection); } void modify(Collection collection){           collection.add(…);           doSomethingWith(collectoin); Collection list = new LinkedList(); list = Collections.unmodifiableCollection(list);

Decorator 패턴 public class Collections{              public static Collection unmodifiableCollection(final Collection wrapped){                            return new UnmodifiableCollection(wrapped);              }                private static class UnmodifiableCollection implements Collection{                            private Collection unmodifiable;                            public UnmodifiableCollection(Collection modifiable){                                         this.unmodifiable = modifiable;                            }                            public boolean contains(){                                         return unmodifiable.contains();                                         public void remove(Object obj){                                         throw UnSupportedOperationException();                            // 콜렉션을 조회하는 메소드는 contains와 같은 래퍼 메소드 구현하고,                            // 콜렉션을 변경하는 메소드는 예외를 던진다. }

개방-폐쇄 원칙 OCP : Open-Closed Principle Extend function without editing code

전형적인 예

Log4j Appender와 Layout

Strategy 패턴 알고리즘 패밀리를 정의하고 각 알고리즘을 캡슐화하여 서로 바꿔 쓸 수 있도록 한다. 전략패턴은 클라이언트와 상관없이 알고리즘을 바꿀 수 있게 해준다.

State 디자인 패턴 객체 내부 상태가 바뀌면 행동 방식을 바꾸고 싶다. 이때 마치 객체들이 클래스가 바뀌는 것처럼 보인다.

빅 리팩토링 SRP LSP OCP SRP DIP