SlideShare a Scribd company logo
1 of 31
Download to read offline
OOP 설계의 법칙
                박일
         parkpd.egloos.com
            AnDStudy.com
http://cafe.naver.com/architect1.cafe
대원칙 - 높은 응집도, 낮은 결합도
• 응집도 : 하나의 클래스가 하나의 기능
  (책임)을 온젂히 순도 높게 담당하는 정도
 – 기능적 응집, 순차적 응집, 교홖적 응집
 – 젃차적 응집, 시갂적 응집, 논리적 응집
• 결합도 : 클래스갂의 서로 다른 책임들이
  얽혀 있어서 상호의졲도가 높은 정도
 – 자료 결합, 스탬프 결합, 제어 결합
S.O.L.I.D.
• S : SRP(Single Responsibility)
  – 단일 책임 원칙
• O : OCP(Open Close)
  – 개방-폐쇄 원칙
• L : LSP(Liskov Substitution)
  – 리스코프 교체 원칙
• I : ISP(Interface Segregation)
  – 인터페이스 격리 원칙
• D : DIP(Dependency Inversion)
  – 의졲 관계 역젂 원칙
하지만 발표는 S.I.O.L.D. 순서로
• S : SRP(Single Responsibility)
  – 단일 책임 원칙
• I : ISP(Interface Segregation)
  – 인터페이스 격리 원칙
• O : OCP(Open Close)
  – 개방-폐쇄 원칙
• L : LSP(Liskov Substitution)
  – 리스코프 교체 원칙
• D : DIP(Dependency Inversion)
  – 의졲 관계 역젂 원칙
SRP(Single Responsibility)

SRP : 단일 책임 원칙
SRP : 단일 책임 원칙
• 한 클래스는 하나의 역할만 맡는다.
• 책임 : „변경을 위한 이유‟
• 실제로 변경이 일어낼 때 적용한다
좋아지는 점?
Modem 인터페이스 분리
• 인터페이스는 분리, 구현은 그대로(ISP)
 – COM 에서 많이 하던 거
• 불필요한 복잡성에 주의
GOD 클래스는 항상 나쁜가?
• 응집도를 높혀준다
  – 모듞 작업을 한 눈에 확인할 수 있다
  – 데이터 연관성을 알기 쉽다
• 결합도를 낮춘다
  – GOD 클래스가 decorator 역할을 한다
  – 각 part 를 연결하는 whole 의 역할
• player
  – inventory -> item
  – skill
  – party…
• 그래서 ISP 가 필요하다
ISP(Interface Segregation)

ISP - 인터페이스 격리 원칙
ISP - 인터페이스 격리 원칙
SRP vs ISP
• SRP : Extract Class, Extract Subclass
• ISP : Extract Interface
   – 클라이언트가 클래스의 특정 기능만 이용한다면 그런
     기능의 부분 집합을 별도의 인터페이스로 추출하라
• ISP 는 한 클래스에서 여러 기능을 통합 제공할 수
  있음을 인정하되(façade), 각 서비스를 별도로 제
  공하는 인터페이스를 노출
• javax.swing.JTable
   – extends JComponent
   – implements TableModelListener, Scrollable,
     TableColumnModelListener, ListSelectionListener,
     CellEditorListener, Accessible
OCP(Open Close)

OCP : 개방-폐쇄 원칙
OCP : 개방-폐쇄 원칙
• 결국에는 약속(표준안)을 만드는 것
    – interface, protocol, standard
•   HTTP 표준을 rendering 하는 각종 browser 들
•   TCP/UDP 로 통싞하는 여러 OS 들
•   C++ 0x 를 지원하는 일부 컴파일러
•   확장에 대해 열려있고 수정에 대해 닫혀있다.
관련 패턴 : strategy pattern
interface(표준)의 문제점
• 변경 비용이 비싸다
 – interface 가 변경되면 모듞 구현 클래스에서
   컴파일 에러 발생
 – concrete class 이 뭔지 알기 어렵다
 – BlueRay vs HD-DVD
• 충분히 안정될 후 interface 로 뺀다
 – 미리 바꾸지 않는다. 첫 번째 총알 맞기
 – 어쩌면 게임 하나가 완성된 다음에야?
 – EPIC 의 Unreal Tounament?
LSP(Liskov Substitution)

LSP - 리스코프 교체(치환) 원칙
LSP - 리스코프 교체(치홖) 원칙
• 하위타입(subtype) 은 그것의 기반 타입
  (base type) 에 대해 치홖 가능해야 한다
• is-a 관계를 만족하는가?
• S형의 각 객체 o1 에 대해 T형 객체 o2가
  있고, T에 의해 정의된 모듞 프로그램 P 에
  서 T 가 S 로 치홖될 때, P 의 동작이 변하
  지 않으면 S 는 T 의 하위타입이다
 – 바바라 리스코프(Barbara Liskov). 1988
„하위 호홖성‟ - DirectX
• dll 이 바뀌어도 문제가 없다
직사각형을 상속받은 정사각형
문제는 어떻게 쓰느냐…
• 부모클래스를 받는 함수는 원칙적으로 어떤
  concrete 클래스를 받았는지 모른다
• concrete 클래스 자체에는 논리적 결함이 없어 보
  이더라도, 잘못 쓸 가능성이 있다면 문제가 있다
• 같이 로직이 반복되면 up-class 하고 싶겠지만
  욕심을 참아야 한다
 – 코드 재사용은 상속이 아닌 포함으로
 – LSP 에 문제 없거나 composite pattern 이 필요하면
   상속으로 해결
 – 실보다 득이 많다면, LSP 가 깨지더라도 협약
   (convention) 으로 해결할 때도 있다고 저자가 소개함
LSP vs OCP
• OCP
  – 인터페이스만 같으면 어떤 객체듞 들어올 수
    있다
• LSP
  – 인터페이스도 같아야 하고, 의미적으로도 동
    일해야 한다
stack
• java.lang.Object
  – extended byjava.util.AbstractCollection
     • extended byjava.util.AbstractList
        – extended byjava.util.Vector
            » extended byjava.util.Stack
DIP(Dependency Inversion)

DIP - 의존 관계 역전 원칙
왜 의졲 관계 역젂인가?




Button 은 Lamp 에
의졲관계다
DIP - 의졲 관계 역젂 원칙
• 게임 엔짂의 문제
 – 한참 개발하던 도중, 엔짂에 엄청 좋은 기능이
   추가되었다는 소식을 들었다면?
• interface 를 누가 결정하고 관리하는가?
 – OS 업체?
 – Printer 같은 주변기기 업체?
관련 패턴 - Template Method
결론
• 구조를 잡을때는 싞중하게
• 실제로 써 본 뒤에 구조를 잡는다
• 안정화 단계란 영원히 오지 않을지도?
 – 안정된 코드는 오래된 코드가 되어 버린다
 – 언제가 “적당”한가?
• 라이브러리보다는 라이브러리를 사용하는
  layer 에 초점을 맞춘다
• 젃대적인 법칙은 없다
Reference
• 실젂 코드로 배우는 실용주의 디자인 패턴
• 소프트웨어 개발의 지혜 - 야스미디어
• zdnet - 객체지향 SW 설계의 원칙
 – http://www.zdnet.co.kr/ArticleView.asp?artice_id
   =00000039134727
 – http://www.zdnet.co.kr/ArticleView.asp?artice_id
   =00000039135552
 – http://www.zdnet.co.kr/ArticleView.asp?artice_id
   =00000039139151
 – http://www.zdnet.co.kr/ArticleView.asp?artice_id
   =00000039137043

More Related Content

What's hot

자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴Sungchul Park
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부JiHyung Lee
 
자바8 나머지 공개
자바8 나머지 공개자바8 나머지 공개
자바8 나머지 공개Sungchul Park
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guideSungchul Park
 
Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수Yeon Soo Kim
 
2. lambda expression
2. lambda expression2. lambda expression
2. lambda expression흥래 김
 
Patterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksPatterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksSunuk Park
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드중선 곽
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈Seo YoungHoon
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍CWMin
 
아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까Sunghyun Roh
 
C++api디자인 1장
C++api디자인 1장C++api디자인 1장
C++api디자인 1장Jihoon Park
 
Clean code
Clean codeClean code
Clean codebbongcsu
 

What's hot (19)

자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴자바 서버 애플리케이션 아키텍처 안티 패턴
자바 서버 애플리케이션 아키텍처 안티 패턴
 
Programming skills 1부
Programming skills 1부Programming skills 1부
Programming skills 1부
 
자바8 나머지 공개
자바8 나머지 공개자바8 나머지 공개
자바8 나머지 공개
 
Java null survival guide
Java null survival guideJava null survival guide
Java null survival guide
 
Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수Spring3 발표자료 - 김연수
Spring3 발표자료 - 김연수
 
팀장 잔소리
팀장 잔소리팀장 잔소리
팀장 잔소리
 
2. lambda expression
2. lambda expression2. lambda expression
2. lambda expression
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
 
Patterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworksPatterns for effectviely documenting frameworks
Patterns for effectviely documenting frameworks
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
간단하게 알아보는 좋은 코드 서영훈
간단하게 알아보는 좋은 코드   서영훈간단하게 알아보는 좋은 코드   서영훈
간단하게 알아보는 좋은 코드 서영훈
 
함수형 프로그래밍
함수형 프로그래밍함수형 프로그래밍
함수형 프로그래밍
 
아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까아해팀 스터디 Orm은 어떻게 객체를 매핑할까
아해팀 스터디 Orm은 어떻게 객체를 매핑할까
 
Kotlin
KotlinKotlin
Kotlin
 
15 swift 클래스
15 swift 클래스15 swift 클래스
15 swift 클래스
 
17 swift 프로토콜
17 swift 프로토콜17 swift 프로토콜
17 swift 프로토콜
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
C++api디자인 1장
C++api디자인 1장C++api디자인 1장
C++api디자인 1장
 
Clean code
Clean codeClean code
Clean code
 

Viewers also liked

Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4Daniel Lim
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법hyun soomyung
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴예림 임
 
Proxy pattern
Proxy patternProxy pattern
Proxy patternscor7910
 
Responding to change
Responding to changeResponding to change
Responding to change기룡 남
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8Ryan Park
 
즉흥연기와프로그래밍
즉흥연기와프로그래밍즉흥연기와프로그래밍
즉흥연기와프로그래밍Ryan Park
 
Programming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. RavenProgramming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. RavenRyan Park
 
나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅Ryan Park
 
나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까Ryan Park
 
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기Ryan Park
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10Ryan Park
 
Decorator pattern
Decorator patternDecorator pattern
Decorator patternkidoki
 
Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴Hyunho-Cho
 

Viewers also liked (20)

Design pattern 4
Design pattern 4Design pattern 4
Design pattern 4
 
예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법예제로 보는 Pattern 연상법
예제로 보는 Pattern 연상법
 
게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴게임 개발에 자주 사용되는 디자인 패턴
게임 개발에 자주 사용되는 디자인 패턴
 
Proxy pattern
Proxy patternProxy pattern
Proxy pattern
 
Responding to change
Responding to changeResponding to change
Responding to change
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
Unicode
UnicodeUnicode
Unicode
 
Unicode
UnicodeUnicode
Unicode
 
AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8AIbyExample - Ch7 raven. version 0.8
AIbyExample - Ch7 raven. version 0.8
 
즉흥연기와프로그래밍
즉흥연기와프로그래밍즉흥연기와프로그래밍
즉흥연기와프로그래밍
 
Programming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. RavenProgramming Game AI by Example. Ch7. Raven
Programming Game AI by Example. Ch7. Raven
 
Taocp1 2 4
Taocp1 2 4Taocp1 2 4
Taocp1 2 4
 
나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10나도기술서번역한번해볼까 in NDC10
나도기술서번역한번해볼까 in NDC10
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
온라인 게임에서 사례로 살펴보는 디버깅 in NDC2010
 
온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅온라인 게임에서 사례로 살펴보는 디버깅
온라인 게임에서 사례로 살펴보는 디버깅
 
나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까나도(기술서)번역한번해볼까
나도(기술서)번역한번해볼까
 
Unicode 이해하기
Unicode 이해하기Unicode 이해하기
Unicode 이해하기
 
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
온라인 게임에서 사례로 살펴보는 디버깅 in NDC10
 
Decorator pattern
Decorator patternDecorator pattern
Decorator pattern
 
Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴Design patterns 스터디 -Decorator 패턴
Design patterns 스터디 -Decorator 패턴
 

Similar to Oop design principle

Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1Daniel Lim
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012devCAT Studio, NEXON
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)중선 곽
 
DeepWalk: Online Learning of Social Representations
DeepWalk: Online Learning of Social RepresentationsDeepWalk: Online Learning of Social Representations
DeepWalk: Online Learning of Social RepresentationsSOYEON KIM
 
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106SangHoon Lee
 
파이콘 한국 2019 튜토리얼 - LRP (Part 2)
파이콘 한국 2019 튜토리얼 - LRP (Part 2)파이콘 한국 2019 튜토리얼 - LRP (Part 2)
파이콘 한국 2019 튜토리얼 - LRP (Part 2)XAIC
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java유리 하
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)DK Lee
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계AnselmKim
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
Things Happend between JDBC and MySQL
Things Happend between JDBC and MySQLThings Happend between JDBC and MySQL
Things Happend between JDBC and MySQLDataya Nolja
 
자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들cho hyun jong
 
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infraJe Hun Kim
 
Hot Trend Lambda Expressions, Compare C# With Java
Hot Trend Lambda Expressions, Compare C# With JavaHot Trend Lambda Expressions, Compare C# With Java
Hot Trend Lambda Expressions, Compare C# With JavaDexter Jung
 
Slipp clojure-1212
Slipp clojure-1212Slipp clojure-1212
Slipp clojure-1212완수 양
 
클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)Sang-Kyu Park
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013devCAT Studio, NEXON
 
OOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingOOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingChangHyeon Bae
 

Similar to Oop design principle (20)

Learn design pattern-1
Learn design pattern-1Learn design pattern-1
Learn design pattern-1
 
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
조정훈, 게임 프로그래머를 위한 클래스 설계, NDC2012
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)
 
DeepWalk: Online Learning of Social Representations
DeepWalk: Online Learning of Social RepresentationsDeepWalk: Online Learning of Social Representations
DeepWalk: Online Learning of Social Representations
 
Server
ServerServer
Server
 
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
Spark overview 이상훈(SK C&C)_스파크 사용자 모임_20141106
 
파이콘 한국 2019 튜토리얼 - LRP (Part 2)
파이콘 한국 2019 튜토리얼 - LRP (Part 2)파이콘 한국 2019 튜토리얼 - LRP (Part 2)
파이콘 한국 2019 튜토리얼 - LRP (Part 2)
 
[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java[HaU] 신입 기술 면접 준비 java
[HaU] 신입 기술 면접 준비 java
 
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
자바 웹 개발 시작하기 (5주차 : 스프링 프래임워크)
 
[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계[스프링 스터디 1일차] 오브젝트와 의존관계
[스프링 스터디 1일차] 오브젝트와 의존관계
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Things Happend between JDBC and MySQL
Things Happend between JDBC and MySQLThings Happend between JDBC and MySQL
Things Happend between JDBC and MySQL
 
자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들자바가 디비와 사귀기 까지 벌어지는 일들
자바가 디비와 사귀기 까지 벌어지는 일들
 
MSA와 infra
MSA와 infraMSA와 infra
MSA와 infra
 
Hot Trend Lambda Expressions, Compare C# With Java
Hot Trend Lambda Expressions, Compare C# With JavaHot Trend Lambda Expressions, Compare C# With Java
Hot Trend Lambda Expressions, Compare C# With Java
 
Slipp clojure-1212
Slipp clojure-1212Slipp clojure-1212
Slipp clojure-1212
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
 
클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)클로져 소개 강의 (한국정보통신산업노동조합)
클로져 소개 강의 (한국정보통신산업노동조합)
 
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
이승재, M2 AI코드 개발 생산성 향상 사례, NDC2013
 
OOP - Object Oriendted Programing
OOP - Object Oriendted ProgramingOOP - Object Oriendted Programing
OOP - Object Oriendted Programing
 

More from Ryan Park

위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점Ryan Park
 
Domain Driven Design Ch7
Domain Driven Design Ch7Domain Driven Design Ch7
Domain Driven Design Ch7Ryan Park
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기Ryan Park
 
프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장Ryan Park
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
UnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDUnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDRyan Park
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowRyan Park
 
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...Ryan Park
 

More from Ryan Park (10)

위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점위대한 게임개발팀의 공통점
위대한 게임개발팀의 공통점
 
Domain Driven Design Ch7
Domain Driven Design Ch7Domain Driven Design Ch7
Domain Driven Design Ch7
 
KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기KGC2010 - 낡은 코드에 단위테스트 넣기
KGC2010 - 낡은 코드에 단위테스트 넣기
 
Unicode100
Unicode100Unicode100
Unicode100
 
Unicode
UnicodeUnicode
Unicode
 
프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장프로그램은 왜 실패하는가 1장
프로그램은 왜 실패하는가 1장
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
UnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPDUnitTest, Tdd For Games Kgc2007 ParkPD
UnitTest, Tdd For Games Kgc2007 ParkPD
 
Agile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And HowAgile Test Driven Development For Games What, Why, And How
Agile Test Driven Development For Games What, Why, And How
 
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...Agd   Test Driven Development For Games What, Why, And How)(Game Connect 2006...
Agd Test Driven Development For Games What, Why, And How)(Game Connect 2006...
 

Oop design principle

  • 1. OOP 설계의 법칙 박일 parkpd.egloos.com AnDStudy.com http://cafe.naver.com/architect1.cafe
  • 2. 대원칙 - 높은 응집도, 낮은 결합도 • 응집도 : 하나의 클래스가 하나의 기능 (책임)을 온젂히 순도 높게 담당하는 정도 – 기능적 응집, 순차적 응집, 교홖적 응집 – 젃차적 응집, 시갂적 응집, 논리적 응집 • 결합도 : 클래스갂의 서로 다른 책임들이 얽혀 있어서 상호의졲도가 높은 정도 – 자료 결합, 스탬프 결합, 제어 결합
  • 3. S.O.L.I.D. • S : SRP(Single Responsibility) – 단일 책임 원칙 • O : OCP(Open Close) – 개방-폐쇄 원칙 • L : LSP(Liskov Substitution) – 리스코프 교체 원칙 • I : ISP(Interface Segregation) – 인터페이스 격리 원칙 • D : DIP(Dependency Inversion) – 의졲 관계 역젂 원칙
  • 4. 하지만 발표는 S.I.O.L.D. 순서로 • S : SRP(Single Responsibility) – 단일 책임 원칙 • I : ISP(Interface Segregation) – 인터페이스 격리 원칙 • O : OCP(Open Close) – 개방-폐쇄 원칙 • L : LSP(Liskov Substitution) – 리스코프 교체 원칙 • D : DIP(Dependency Inversion) – 의졲 관계 역젂 원칙
  • 5. SRP(Single Responsibility) SRP : 단일 책임 원칙
  • 6. SRP : 단일 책임 원칙 • 한 클래스는 하나의 역할만 맡는다. • 책임 : „변경을 위한 이유‟ • 실제로 변경이 일어낼 때 적용한다
  • 8. Modem 인터페이스 분리 • 인터페이스는 분리, 구현은 그대로(ISP) – COM 에서 많이 하던 거 • 불필요한 복잡성에 주의
  • 9. GOD 클래스는 항상 나쁜가? • 응집도를 높혀준다 – 모듞 작업을 한 눈에 확인할 수 있다 – 데이터 연관성을 알기 쉽다 • 결합도를 낮춘다 – GOD 클래스가 decorator 역할을 한다 – 각 part 를 연결하는 whole 의 역할 • player – inventory -> item – skill – party… • 그래서 ISP 가 필요하다
  • 10. ISP(Interface Segregation) ISP - 인터페이스 격리 원칙
  • 11. ISP - 인터페이스 격리 원칙
  • 12.
  • 13. SRP vs ISP • SRP : Extract Class, Extract Subclass • ISP : Extract Interface – 클라이언트가 클래스의 특정 기능만 이용한다면 그런 기능의 부분 집합을 별도의 인터페이스로 추출하라 • ISP 는 한 클래스에서 여러 기능을 통합 제공할 수 있음을 인정하되(façade), 각 서비스를 별도로 제 공하는 인터페이스를 노출 • javax.swing.JTable – extends JComponent – implements TableModelListener, Scrollable, TableColumnModelListener, ListSelectionListener, CellEditorListener, Accessible
  • 14. OCP(Open Close) OCP : 개방-폐쇄 원칙
  • 15. OCP : 개방-폐쇄 원칙 • 결국에는 약속(표준안)을 만드는 것 – interface, protocol, standard • HTTP 표준을 rendering 하는 각종 browser 들 • TCP/UDP 로 통싞하는 여러 OS 들 • C++ 0x 를 지원하는 일부 컴파일러 • 확장에 대해 열려있고 수정에 대해 닫혀있다.
  • 16.
  • 17. 관련 패턴 : strategy pattern
  • 18. interface(표준)의 문제점 • 변경 비용이 비싸다 – interface 가 변경되면 모듞 구현 클래스에서 컴파일 에러 발생 – concrete class 이 뭔지 알기 어렵다 – BlueRay vs HD-DVD • 충분히 안정될 후 interface 로 뺀다 – 미리 바꾸지 않는다. 첫 번째 총알 맞기 – 어쩌면 게임 하나가 완성된 다음에야? – EPIC 의 Unreal Tounament?
  • 19. LSP(Liskov Substitution) LSP - 리스코프 교체(치환) 원칙
  • 20. LSP - 리스코프 교체(치홖) 원칙 • 하위타입(subtype) 은 그것의 기반 타입 (base type) 에 대해 치홖 가능해야 한다 • is-a 관계를 만족하는가? • S형의 각 객체 o1 에 대해 T형 객체 o2가 있고, T에 의해 정의된 모듞 프로그램 P 에 서 T 가 S 로 치홖될 때, P 의 동작이 변하 지 않으면 S 는 T 의 하위타입이다 – 바바라 리스코프(Barbara Liskov). 1988
  • 21. „하위 호홖성‟ - DirectX • dll 이 바뀌어도 문제가 없다
  • 23. 문제는 어떻게 쓰느냐… • 부모클래스를 받는 함수는 원칙적으로 어떤 concrete 클래스를 받았는지 모른다 • concrete 클래스 자체에는 논리적 결함이 없어 보 이더라도, 잘못 쓸 가능성이 있다면 문제가 있다 • 같이 로직이 반복되면 up-class 하고 싶겠지만 욕심을 참아야 한다 – 코드 재사용은 상속이 아닌 포함으로 – LSP 에 문제 없거나 composite pattern 이 필요하면 상속으로 해결 – 실보다 득이 많다면, LSP 가 깨지더라도 협약 (convention) 으로 해결할 때도 있다고 저자가 소개함
  • 24. LSP vs OCP • OCP – 인터페이스만 같으면 어떤 객체듞 들어올 수 있다 • LSP – 인터페이스도 같아야 하고, 의미적으로도 동 일해야 한다
  • 25. stack • java.lang.Object – extended byjava.util.AbstractCollection • extended byjava.util.AbstractList – extended byjava.util.Vector » extended byjava.util.Stack
  • 26. DIP(Dependency Inversion) DIP - 의존 관계 역전 원칙
  • 27. 왜 의졲 관계 역젂인가? Button 은 Lamp 에 의졲관계다
  • 28. DIP - 의졲 관계 역젂 원칙 • 게임 엔짂의 문제 – 한참 개발하던 도중, 엔짂에 엄청 좋은 기능이 추가되었다는 소식을 들었다면? • interface 를 누가 결정하고 관리하는가? – OS 업체? – Printer 같은 주변기기 업체?
  • 29. 관련 패턴 - Template Method
  • 30. 결론 • 구조를 잡을때는 싞중하게 • 실제로 써 본 뒤에 구조를 잡는다 • 안정화 단계란 영원히 오지 않을지도? – 안정된 코드는 오래된 코드가 되어 버린다 – 언제가 “적당”한가? • 라이브러리보다는 라이브러리를 사용하는 layer 에 초점을 맞춘다 • 젃대적인 법칙은 없다
  • 31. Reference • 실젂 코드로 배우는 실용주의 디자인 패턴 • 소프트웨어 개발의 지혜 - 야스미디어 • zdnet - 객체지향 SW 설계의 원칙 – http://www.zdnet.co.kr/ArticleView.asp?artice_id =00000039134727 – http://www.zdnet.co.kr/ArticleView.asp?artice_id =00000039135552 – http://www.zdnet.co.kr/ArticleView.asp?artice_id =00000039139151 – http://www.zdnet.co.kr/ArticleView.asp?artice_id =00000039137043