SlideShare uma empresa Scribd logo
1 de 18
Baixar para ler offline
GPG1.1 객체지향적 프로그래밍과 설계기법
P. 44 - 58
NHN NEXT
남현욱
:견고하고 재사용가능한 코드의 작성을 위한 기법들
객체지향적 프로그래밍과 설계기법
•	코딩 스타일
•	클래스 설계
•	클래스 계통 구조의 설계
객체지향적 프로그래밍과 설계기법
코딩 스타일
•	 어떤 스타일이든 하나의 스타일을 결정하고 항상 일관되게 그 스타일을
사용할 것.
- 헝가리안 표기법(Hungarian notation), 카멜 케이스(camel-case) 등
•	 코딩 스타일에 지나치게 집착하지 말 것.
- 1,2페이지 내외로 적당하게. 너무 길고 복잡하면 귀찮아서 아무도 안 지킴.
•	 클래스 이름도 유지보수와 가독성을 고려해서 지을 것.
- ex) C로 시작하면 구체화된 클래스(concrete class), I 로 시작하면 인터페이스 클래스.
객체지향적 프로그래밍과 설계기법
class Sample
{
public:
	 Sample() {Clear();}
	~Sample(){Destroy();}
	 void Clear();
	 bool Create();
	 void Update();
	 void Destroy();
};
•	 생성자는 반환값이 없으므로, 실패할 수 있
는 작업을 생성자 안에서 수행하는 건 좋지
않음.
•	 각 역할에 따른 함수 이름을 통일시키는 것
이 전체 개발 팀에 큰 도움이 됨.
클래스 설계
객체지향적 프로그래밍과 설계기법
가장 기본적인 두 방식은
상속inheritance과 포함layering, containtment
is-a 관계면 상속, has-a 관계면 포함을 쓸 것.
ex)
Class Tico is-a type of Class Car
Class Tico has-a Class Tire
이게 어색하면 뭔가 잘못된 설계
클래스 계통 구조의설계
객체지향적 프로그래밍과 설계기법
:일반적 설계 문제를 해결하기 위한 방법을 체계화한 것.
디자인 패턴
•	단일체 패턴(Singleton Pattern)
•	퍼사드 패턴(Facade Pattern)
•	상태 패턴(State Pattern)
•	팩토리 패턴 (Factory Pattern)
객체지향적 프로그래밍과 설계기법
단일체 패턴singleton pattern
의도
	 해당 클래스의 인스턴스가 오직 하나 뿐임을 보장하고, 이에 대한 전역적인 접근점을 제공하기 위함.
구조
Singleton
static GetInstance()
SingletonOperation()
GetSingletonData()
static uniqueInstance
singletonData
return uniqueInstance
public
private
객체지향적 프로그래밍과 설계기법
단일체 패턴singleton pattern
예시코드
Singleton.h
class Singleton
{
public:
	 static Singleton* GetInstance();
	 static void ReleaseInstance();
protected:
	 Singleton();
	 virtual ~Singleton();
private:
	 static Singleton* m_pInstance;
};
Singleton.cpp
#include “Singleton.h”
Singleton* m_pInstance = nullptr;
Singleton* Singleton::GetInstance()
{
	 if (m_pInstance == nullptr)
	{
		 m_pInstance = new Singleton();
	}
	 return m_pInstance;
}
void Singleton::ReleaseInstance()
{
	 if (m_pInstance != nullptr)
	{
		 delete m_pInstance;
		 m_pInstance = nullptr;
	}
}
객체지향적 프로그래밍과 설계기법
단일체 패턴singleton pattern
장점
•	 접근에 대한 통제가 가능하다
•	 전역변수를 사용하는 것보다 더 편하고 좋다
•	 상속시켜 서브 클래스에서 새로운 인터페이스를 만들 수 있다
객체지향적 프로그래밍과 설계기법
퍼사드 패턴facade pattern
의도
	 하나의 서브 시스템에 대해 획일화된 하나의 인터페이스를 제공하기 위함. → 커플링의 최소화
class
class
class
class
class
class
class
subsystem 1 subsystem 2
객체지향적 프로그래밍과 설계기법
퍼사드 패턴facade pattern
의도
	 하나의 서브 시스템에 대해 획일화된 하나의 인터페이스를 제공하기 위함. → 커플링의 최소화
class
class
class
class
class
class
class
subsystem 1 subsystem 2
facade
class
facade
class
서브 시스템끼리는
퍼사드 클래스를
통해서만 소통
객체지향적 프로그래밍과 설계기법
퍼사드 패턴facade pattern
장점
•	 서브 시스템의 구성요소를 보호할 수 있다
•	 의존성(커플링)을 줄여 재사용성을 높일 수 있다
객체지향적 프로그래밍과 설계기법
상태 패턴state pattern
의도
	 게임 내에 존재하는 수많은 상태들을 적절히 관리하기 위함. 객체 내부 상태에 따라 스스로 행동을 변화시킬 수 있게 함.
구조
StateManager
func1()
func2()
BaseState* m_state
BaseState
func1()
func2()
state1 state2 state3
상속
런타임에 동적으로 상태를 변환.
각 상태 객체들(state)은 모두 단일체(Singleton)
객체지향적 프로그래밍과 설계기법
상태 패턴state pattern
StateManager
func1()
func2()
BaseState* m_state
BaseState
func1()
func2()
state1 state2 state3
상속
m_state가 현재 가리키는 객체가 뭐냐에 따라 각 함수(func1, func2)
가 하는 행동이 달라진다.
객체지향적 프로그래밍과 설계기법
상태 패턴state pattern
장점
•	 각 상태를 서로 다른 객체로 관리하기 때문에 관리하기 편하다.
•	 상태의 전이를 명확하게 만든다.
객체지향적 프로그래밍과 설계기법
팩토리 패턴factory pattern
의도
	 하나의 클래스가 다양한 종류의 객체들을 생성하는 역할을 책임지는 것.
BaseClass* ClassFactory::CreateObject(int id)
{
	 BaseClass* pClass = 0;
	 switch (id)
	{
	 case 1:
		 pClass = new Class1;
		 break;
	 case 2:
		 pClass = new Class2;
		 break;
	 case 3:
		 pClass = new Class3;
		 break;
	 default:
		 assert(!“Error! Inval id class ID passed to factory!”);
	};
	 // 여기서 공통적인 초기화 작업을 수행한다.
	pClass->Init();
	 return pClass;
}
•	 메모리 할당이 일어나
는 것을 통제하기 편함.
•	 각 객체들에 대한 공통
적인 처리를 수행하기 쉬
움.
객체지향적 프로그래밍과 설계기법
요약
•	코드의 모든 부분에 객체지향 기법을 잘 활용
하면 유지보수성과 확장성이 크게 증가한다.
•	참고 자료
	 -effective C++
	 -more effective C++
	 -GoF의 디자인 패턴
객체지향적 프로그래밍과 설계기법
끝
‘ GPG를 공부하자’ 페이스북 페이지
https://www.facebook.com/gpgstudygogo

Mais conteúdo relacionado

Destaque

[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티Sehyeon Nam
 
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self해강
 
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)해강
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Dong Chan Shin
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1현찬 양
 
[기초수학] 미분 적분학
[기초수학] 미분 적분학[기초수학] 미분 적분학
[기초수학] 미분 적분학KyeongWon Koo
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4현찬 양
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자KyeongWon Koo
 
[150523] live2d 그녀들을 움직이게 하는 기술
[150523] live2d 그녀들을 움직이게 하는 기술[150523] live2d 그녀들을 움직이게 하는 기술
[150523] live2d 그녀들을 움직이게 하는 기술MinGeun Park
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리MinGeun Park
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 Sehyeon Nam
 

Destaque (15)

[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티[GPG 스터디] 1.3 자동적인 단일체 유틸리티
[GPG 스터디] 1.3 자동적인 단일체 유틸리티
 
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
[16.04.12] 플레이어의 기억에 남을 인상적인 캐릭터를 제작하는 5가지 주제 - Self
 
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
[14.10.20] 아! 그거...모르겠습니다 - TLS(devrookie)
 
문자열 검색 (1)
문자열 검색 (1)문자열 검색 (1)
문자열 검색 (1)
 
Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본Effective c++ chapter3, 4 요약본
Effective c++ chapter3, 4 요약본
 
5 6 1
5 6 15 6 1
5 6 1
 
Effective c++ 1
Effective c++ 1Effective c++ 1
Effective c++ 1
 
삼각 함수
삼각 함수삼각 함수
삼각 함수
 
Mesh slice 1
Mesh slice 1Mesh slice 1
Mesh slice 1
 
[기초수학] 미분 적분학
[기초수학] 미분 적분학[기초수학] 미분 적분학
[기초수학] 미분 적분학
 
Effective c++ 4
Effective c++ 4Effective c++ 4
Effective c++ 4
 
빌드 속도를 올려보자
빌드 속도를 올려보자빌드 속도를 올려보자
빌드 속도를 올려보자
 
[150523] live2d 그녀들을 움직이게 하는 기술
[150523] live2d 그녀들을 움직이게 하는 기술[150523] live2d 그녀들을 움직이게 하는 기술
[150523] live2d 그녀들을 움직이게 하는 기술
 
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
[데브루키/141206 박민근] 유니티 최적화 테크닉 총정리
 
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용 [GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
[GPG 스터디] 1.4 게임프로그래밍에서의 STL 활용
 

Semelhante a [GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법

GPG 1.1 객체지향적 프로그래밍과 설계기법
GPG 1.1 객체지향적 프로그래밍과 설계기법GPG 1.1 객체지향적 프로그래밍과 설계기법
GPG 1.1 객체지향적 프로그래밍과 설계기법Taeung Ra
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern대영 노
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)중선 곽
 
10장 클래스
10장 클래스10장 클래스
10장 클래스kidoki
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLIDRyan Park
 
[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿해강
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinDong Chan Shin
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018Shengzhe Li
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표재정 이
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...Taekyu Lim
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework경주 전
 
Domain driven design ch3
Domain driven design ch3Domain driven design ch3
Domain driven design ch3HyeonSeok Choi
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성NAVER D2
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13Shin heemin
 

Semelhante a [GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법 (20)

GPG 1.1 객체지향적 프로그래밍과 설계기법
GPG 1.1 객체지향적 프로그래밍과 설계기법GPG 1.1 객체지향적 프로그래밍과 설계기법
GPG 1.1 객체지향적 프로그래밍과 설계기법
 
[Dev rookie]designpattern
[Dev rookie]designpattern[Dev rookie]designpattern
[Dev rookie]designpattern
 
7 8 1
7 8 17 8 1
7 8 1
 
Bridge
BridgeBridge
Bridge
 
자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)자바 직렬화 (Java serialization)
자바 직렬화 (Java serialization)
 
10장 클래스
10장 클래스10장 클래스
10장 클래스
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Uml 세미나
Uml 세미나Uml 세미나
Uml 세미나
 
Oop design principle SOLID
Oop design principle SOLIDOop design principle SOLID
Oop design principle SOLID
 
[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿
 
Effective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshinEffective c++ chapter7_8_9_dcshin
Effective c++ chapter7_8_9_dcshin
 
CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018CUDA 프로그래밍 기초 MODUCON2018
CUDA 프로그래밍 기초 MODUCON2018
 
The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표The c++ programming language 10장 클래스 발표
The c++ programming language 10장 클래스 발표
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
 
Java collections framework
Java collections frameworkJava collections framework
Java collections framework
 
Java the good parts
Java the good partsJava the good parts
Java the good parts
 
C++ api design 품질
C++ api design 품질C++ api design 품질
C++ api design 품질
 
Domain driven design ch3
Domain driven design ch3Domain driven design ch3
Domain driven design ch3
 
[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성[122]네이버의모던웹라이브러리 박재성
[122]네이버의모던웹라이브러리 박재성
 
디자인패턴 1~13
디자인패턴 1~13디자인패턴 1~13
디자인패턴 1~13
 

Mais de Sehyeon Nam

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17Sehyeon Nam
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11Sehyeon Nam
 
Game programing gems 1.11
Game programing gems 1.11Game programing gems 1.11
Game programing gems 1.11Sehyeon Nam
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10Sehyeon Nam
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Sehyeon Nam
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuSehyeon Nam
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획Sehyeon Nam
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 Sehyeon Nam
 
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 Sehyeon Nam
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법Sehyeon Nam
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summarySehyeon Nam
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmarySehyeon Nam
 

Mais de Sehyeon Nam (13)

Game programing gems 4.17
Game programing gems 4.17Game programing gems 4.17
Game programing gems 4.17
 
Game programing gems 4.11
Game programing gems 4.11Game programing gems 4.11
Game programing gems 4.11
 
Game programing gems 1.11
Game programing gems 1.11Game programing gems 1.11
Game programing gems 1.11
 
Game programing gems 1.10
Game programing gems 1.10Game programing gems 1.10
Game programing gems 1.10
 
Game programing gems 3.4 3.6
Game programing gems 3.4 3.6Game programing gems 3.4 3.6
Game programing gems 3.4 3.6
 
Hexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong YuHexagrid Draw by NHN NEXT Seo Dong Yu
Hexagrid Draw by NHN NEXT Seo Dong Yu
 
아르카스톤 기획
아르카스톤 기획아르카스톤 기획
아르카스톤 기획
 
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자 [GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
[GPG 스터디] 1.6 범용 핸들 기반 자원 관리자
 
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산 [GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
[GPG 스터디] 1.2 템플릿 메타프로그래밍을 이용한 빠른 수학 연산
 
[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법[GPG스터디] 1.0 데이터 주도적 설계의 마법
[GPG스터디] 1.0 데이터 주도적 설계의 마법
 
Ec++ 3,4 summary
Ec++ 3,4 summaryEc++ 3,4 summary
Ec++ 3,4 summary
 
Ec++ c 1,2 surmary
Ec++ c 1,2 surmaryEc++ c 1,2 surmary
Ec++ c 1,2 surmary
 
D2 ppt
D2 pptD2 ppt
D2 ppt
 

[GPG 스터디] 1.1 객체지향적 프로그래밍과 설계기법

  • 1. GPG1.1 객체지향적 프로그래밍과 설계기법 P. 44 - 58 NHN NEXT 남현욱
  • 2. :견고하고 재사용가능한 코드의 작성을 위한 기법들 객체지향적 프로그래밍과 설계기법 • 코딩 스타일 • 클래스 설계 • 클래스 계통 구조의 설계
  • 3. 객체지향적 프로그래밍과 설계기법 코딩 스타일 • 어떤 스타일이든 하나의 스타일을 결정하고 항상 일관되게 그 스타일을 사용할 것. - 헝가리안 표기법(Hungarian notation), 카멜 케이스(camel-case) 등 • 코딩 스타일에 지나치게 집착하지 말 것. - 1,2페이지 내외로 적당하게. 너무 길고 복잡하면 귀찮아서 아무도 안 지킴. • 클래스 이름도 유지보수와 가독성을 고려해서 지을 것. - ex) C로 시작하면 구체화된 클래스(concrete class), I 로 시작하면 인터페이스 클래스.
  • 4. 객체지향적 프로그래밍과 설계기법 class Sample { public: Sample() {Clear();} ~Sample(){Destroy();} void Clear(); bool Create(); void Update(); void Destroy(); }; • 생성자는 반환값이 없으므로, 실패할 수 있 는 작업을 생성자 안에서 수행하는 건 좋지 않음. • 각 역할에 따른 함수 이름을 통일시키는 것 이 전체 개발 팀에 큰 도움이 됨. 클래스 설계
  • 5. 객체지향적 프로그래밍과 설계기법 가장 기본적인 두 방식은 상속inheritance과 포함layering, containtment is-a 관계면 상속, has-a 관계면 포함을 쓸 것. ex) Class Tico is-a type of Class Car Class Tico has-a Class Tire 이게 어색하면 뭔가 잘못된 설계 클래스 계통 구조의설계
  • 6. 객체지향적 프로그래밍과 설계기법 :일반적 설계 문제를 해결하기 위한 방법을 체계화한 것. 디자인 패턴 • 단일체 패턴(Singleton Pattern) • 퍼사드 패턴(Facade Pattern) • 상태 패턴(State Pattern) • 팩토리 패턴 (Factory Pattern)
  • 7. 객체지향적 프로그래밍과 설계기법 단일체 패턴singleton pattern 의도 해당 클래스의 인스턴스가 오직 하나 뿐임을 보장하고, 이에 대한 전역적인 접근점을 제공하기 위함. 구조 Singleton static GetInstance() SingletonOperation() GetSingletonData() static uniqueInstance singletonData return uniqueInstance public private
  • 8. 객체지향적 프로그래밍과 설계기법 단일체 패턴singleton pattern 예시코드 Singleton.h class Singleton { public: static Singleton* GetInstance(); static void ReleaseInstance(); protected: Singleton(); virtual ~Singleton(); private: static Singleton* m_pInstance; }; Singleton.cpp #include “Singleton.h” Singleton* m_pInstance = nullptr; Singleton* Singleton::GetInstance() { if (m_pInstance == nullptr) { m_pInstance = new Singleton(); } return m_pInstance; } void Singleton::ReleaseInstance() { if (m_pInstance != nullptr) { delete m_pInstance; m_pInstance = nullptr; } }
  • 9. 객체지향적 프로그래밍과 설계기법 단일체 패턴singleton pattern 장점 • 접근에 대한 통제가 가능하다 • 전역변수를 사용하는 것보다 더 편하고 좋다 • 상속시켜 서브 클래스에서 새로운 인터페이스를 만들 수 있다
  • 10. 객체지향적 프로그래밍과 설계기법 퍼사드 패턴facade pattern 의도 하나의 서브 시스템에 대해 획일화된 하나의 인터페이스를 제공하기 위함. → 커플링의 최소화 class class class class class class class subsystem 1 subsystem 2
  • 11. 객체지향적 프로그래밍과 설계기법 퍼사드 패턴facade pattern 의도 하나의 서브 시스템에 대해 획일화된 하나의 인터페이스를 제공하기 위함. → 커플링의 최소화 class class class class class class class subsystem 1 subsystem 2 facade class facade class 서브 시스템끼리는 퍼사드 클래스를 통해서만 소통
  • 12. 객체지향적 프로그래밍과 설계기법 퍼사드 패턴facade pattern 장점 • 서브 시스템의 구성요소를 보호할 수 있다 • 의존성(커플링)을 줄여 재사용성을 높일 수 있다
  • 13. 객체지향적 프로그래밍과 설계기법 상태 패턴state pattern 의도 게임 내에 존재하는 수많은 상태들을 적절히 관리하기 위함. 객체 내부 상태에 따라 스스로 행동을 변화시킬 수 있게 함. 구조 StateManager func1() func2() BaseState* m_state BaseState func1() func2() state1 state2 state3 상속 런타임에 동적으로 상태를 변환. 각 상태 객체들(state)은 모두 단일체(Singleton)
  • 14. 객체지향적 프로그래밍과 설계기법 상태 패턴state pattern StateManager func1() func2() BaseState* m_state BaseState func1() func2() state1 state2 state3 상속 m_state가 현재 가리키는 객체가 뭐냐에 따라 각 함수(func1, func2) 가 하는 행동이 달라진다.
  • 15. 객체지향적 프로그래밍과 설계기법 상태 패턴state pattern 장점 • 각 상태를 서로 다른 객체로 관리하기 때문에 관리하기 편하다. • 상태의 전이를 명확하게 만든다.
  • 16. 객체지향적 프로그래밍과 설계기법 팩토리 패턴factory pattern 의도 하나의 클래스가 다양한 종류의 객체들을 생성하는 역할을 책임지는 것. BaseClass* ClassFactory::CreateObject(int id) { BaseClass* pClass = 0; switch (id) { case 1: pClass = new Class1; break; case 2: pClass = new Class2; break; case 3: pClass = new Class3; break; default: assert(!“Error! Inval id class ID passed to factory!”); }; // 여기서 공통적인 초기화 작업을 수행한다. pClass->Init(); return pClass; } • 메모리 할당이 일어나 는 것을 통제하기 편함. • 각 객체들에 대한 공통 적인 처리를 수행하기 쉬 움.
  • 17. 객체지향적 프로그래밍과 설계기법 요약 • 코드의 모든 부분에 객체지향 기법을 잘 활용 하면 유지보수성과 확장성이 크게 증가한다. • 참고 자료 -effective C++ -more effective C++ -GoF의 디자인 패턴
  • 18. 객체지향적 프로그래밍과 설계기법 끝 ‘ GPG를 공부하자’ 페이스북 페이지 https://www.facebook.com/gpgstudygogo