18
GPG 1.1 객체지향적 프로그래밍과 설계기법 P. 44 - 58 NHN NEXT 남현욱

GPG 1.1 객체지향적 프로그래밍과 설계기법

Embed Size (px)

DESCRIPTION

GPG 1.1 객체지향적 프로그래밍과 설계기법

Citation preview

Page 1: GPG 1.1 객체지향적 프로그래밍과 설계기법

GPG1.1 객체지향적 프로그래밍과 설계기법

P. 44 - 58

NHN NEXT남현욱

Page 2: GPG 1.1 객체지향적 프로그래밍과 설계기법

:견고하고 재사용가능한 코드의 작성을 위한 기법들

객체지향적 프로그래밍과 설계기법

• 코딩 스타일

• 클래스 설계

• 클래스 계통 구조의 설계

Page 3: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

코딩 스타일

• 어떤 스타일이든 하나의 스타일을 결정하고 항상 일관되게 그 스타일을 사용할 것.

- 헝가리안 표기법(Hungarian notation), 카멜 케이스(camel-case) 등

• 코딩 스타일에 지나치게 집착하지 말 것. - 1,2페이지 내외로 적당하게. 너무 길고 복잡하면 귀찮아서 아무도 안 지킴.

• 클래스 이름도 유지보수와 가독성을 고려해서 지을 것. - ex) C로 시작하면 구체화된 클래스(concrete class), I 로 시작하면 인터페이스 클래스.

Page 4: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

class Sample{public: Sample() {Clear();} ~Sample(){Destroy();}

void Clear(); bool Create(); void Update(); void Destroy();};

• 생성자는 반환값이 없으므로, 실패할 수 있는 작업을 생성자 안에서 수행하는 건 좋지 않음.

• 각 역할에 따른 함수 이름을 통일시키는 것이 전체 개발 팀에 큰 도움이 됨.

클래스 설계

Page 5: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

가장 기본적인 두 방식은 상속inheritance과 포함layering, containtment

is-a 관계면 상속, has-a 관계면 포함을 쓸 것.

ex)Class Tico is-a type of Class CarClass Tico has-a Class Tire

이게 어색하면 뭔가 잘못된 설계

클래스 계통 구조의설계

Page 6: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

:일반적 설계 문제를 해결하기 위한 방법을 체계화한 것.

디자인 패턴

• 단일체 패턴(Singleton Pattern)

• 퍼사드 패턴(Facade Pattern)

• 상태 패턴(State Pattern)

• 팩토리 패턴 (Factory Pattern)

Page 7: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

단일체 패턴singleton pattern

의도 해당 클래스의 인스턴스가 오직 하나 뿐임을 보장하고, 이에 대한 전역적인 접근점을 제공하기 위함.

구조Singleton

static GetInstance()SingletonOperation()GetSingletonData()

static uniqueInstancesingletonData

return uniqueInstancepublic

private

Page 8: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

단일체 패턴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;

}

}

Page 9: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

단일체 패턴singleton pattern

장점

• 접근에 대한 통제가 가능하다

• 전역변수를 사용하는 것보다 더 편하고 좋다

• 상속시켜 서브 클래스에서 새로운 인터페이스를 만들 수 있다

Page 10: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

퍼사드 패턴facade pattern

의도 하나의 서브 시스템에 대해 획일화된 하나의 인터페이스를 제공하기 위함. → 커플링의 최소화

class

class

class

class

class

class

class

subsystem 1 subsystem 2

Page 11: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

퍼사드 패턴facade pattern

의도 하나의 서브 시스템에 대해 획일화된 하나의 인터페이스를 제공하기 위함. → 커플링의 최소화

class

class

class

class

class

class

class

subsystem 1 subsystem 2

facadeclass

facadeclass

서브 시스템끼리는 퍼사드 클래스를 통해서만 소통

Page 12: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

퍼사드 패턴facade pattern

장점

• 서브 시스템의 구성요소를 보호할 수 있다

• 의존성(커플링)을 줄여 재사용성을 높일 수 있다

Page 13: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

상태 패턴state pattern

의도 게임 내에 존재하는 수많은 상태들을 적절히 관리하기 위함. 객체 내부 상태에 따라 스스로 행동을 변화시킬 수 있게 함.

구조StateManager

func1()func2()

BaseState* m_state

BaseState

func1()func2()

state1 state2 state3

상속

런타임에 동적으로 상태를 변환. 각 상태 객체들(state)은 모두 단일체(Singleton)

Page 14: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

상태 패턴state pattern

StateManager

func1()func2()

BaseState* m_state

BaseState

func1()func2()

state1 state2 state3

상속

m_state가 현재 가리키는 객체가 뭐냐에 따라 각 함수(func1, func2)가 하는 행동이 달라진다.

Page 15: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

상태 패턴state pattern

장점• 각 상태를 서로 다른 객체로 관리하기 때문에 관리하기 편하다.

• 상태의 전이를 명확하게 만든다.

Page 16: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

팩토리 패턴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;}

• 메모리 할당이 일어나는 것을 통제하기 편함.

• 각 객체들에 대한 공통적인 처리를 수행하기 쉬움.

Page 17: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

요약

• 코드의 모든 부분에 객체지향 기법을 잘 활용하면 유지보수성과 확장성이 크게 증가한다.

• 참고 자료 -effective C++

-more effective C++

-GoF의 디자인 패턴

Page 18: GPG 1.1 객체지향적 프로그래밍과 설계기법

객체지향적 프로그래밍과 설계기법

‘ GPG를 공부하자’ 페이스북 페이지https://www.facebook.com/gpgstudygogo