슬라이드 원본
http://hatemogi.github.com/netty-startup/3.html
프로젝트 소스
https://github.com/hatemogi/netty-startup/
Netty는 JAVA환경에서 고성능 네트워크 서버를 개발할 수 있는 매우 유용한 프레임워크입니다만, 비동기(asynchronous) 이벤트 기반 (event-driven) 처리에 익숙하지 않은 개발자에게는 처음 접근하기 어려운 점이 있습니다. 이 과정에서는 기존 멀티쓰레드와 동기식(synchronous) I/O처리에만 익숙했던 개발자도 차근차근 따라해보며 비동기 I/O처리의 기본 개념을 이해하고, Netty를 본격적으로 활용해 볼 수 있도록 예제 개발을 함께 해보려 합니다.
슬라이드 원본
http://hatemogi.github.com/netty-startup/3.html
프로젝트 소스
https://github.com/hatemogi/netty-startup/
Netty는 JAVA환경에서 고성능 네트워크 서버를 개발할 수 있는 매우 유용한 프레임워크입니다만, 비동기(asynchronous) 이벤트 기반 (event-driven) 처리에 익숙하지 않은 개발자에게는 처음 접근하기 어려운 점이 있습니다. 이 과정에서는 기존 멀티쓰레드와 동기식(synchronous) I/O처리에만 익숙했던 개발자도 차근차근 따라해보며 비동기 I/O처리의 기본 개념을 이해하고, Netty를 본격적으로 활용해 볼 수 있도록 예제 개발을 함께 해보려 합니다.
본문 링크
용과 같이 – 유신 : http://www.slideshare.net/agebreak/141004-cedec-2014-1
MSDN : http://msdn.microsoft.com/en-us/library/ms686749.aspx
WIKI : http://en.wikipedia.org/wiki/Thread-local_storage
Optimizing software in C++ : http://www.agner.org/optimize/optimizing_cpp.pdf
다들 STL 잘 사용하고 계신가요?
오늘도 라태웅(NHN NEXT, NEXON)님의 발표입니다.
STL의 기본 개념부터, 사용 노하우까지 담아보았습니다.
여러분들도 우리 스터디 참여하셔서 Live로 들으시고 발표도 하러 오세요!
관련 문의 : 댓글 or https://www.facebook.com/gpgstudygogo
본문 링크
용과 같이 – 유신 : http://www.slideshare.net/agebreak/141004-cedec-2014-1
MSDN : http://msdn.microsoft.com/en-us/library/ms686749.aspx
WIKI : http://en.wikipedia.org/wiki/Thread-local_storage
Optimizing software in C++ : http://www.agner.org/optimize/optimizing_cpp.pdf
다들 STL 잘 사용하고 계신가요?
오늘도 라태웅(NHN NEXT, NEXON)님의 발표입니다.
STL의 기본 개념부터, 사용 노하우까지 담아보았습니다.
여러분들도 우리 스터디 참여하셔서 Live로 들으시고 발표도 하러 오세요!
관련 문의 : 댓글 or https://www.facebook.com/gpgstudygogo
<실제>
< '#'에 맞춰서 다음 슬라이드로 넘어가시면 됨.>
안녕하세요. NHN NEXT의, 최연소 참가자 19살 남세현입니다.
#저는 일정 공유가 핵심인 달력어플을 만들고있습니다.
#흠… 일정을 공유를 어떻게 해야할까요?
서버에서 처리하는거 말곤 없을까 생각하다가
다음 3가지가 떠올랐습니다.
#아이폰은 사진같은거 말고는 어플끼리 파일공유가 힘듭니다.
사람들이 많이 사용하는게 라인, 카톡인데요
라인 카톡으로 많이하는건 텍스트 보내기, #사진보내기 입니다.
#사진에 데이터를 녹여넣고, 그 사진을 메신저로 전달하면 어떨까요
#사진은 공용 저장소인 사진보관함에 저장되는데, 모든 어플에서 접근이 가능합니다.
기존엔 파일을 다운받아도 관리도 안되고 공유도 힘들고... 그것이 해결할 수 있습니다.
#어떻게 파일을 사진에 녹여내냐면,
모든 데이터는 이진수로 이루어져 있습니다. 그 이진수를 사진의 픽셀 RGB값에 대입하겠다는 겁니다.
#이것이 그렇게 해서 만든 사진데이터입니다. 저는 앞으로 이런걸 "사진데이터" 라고 부르겠습니다.
어떤 데이터가 담겨져 있을까요?
제가 말하기 전까지는 모릅니다.
몇천개의 인트형 정수가 저장되어있습니다.
#이게 어느 어플에서 저장한 데이터인지, 피피티자료인지 음악자료인지 알 수 없습니다.
컴퓨터를 쓸땐 파일에 '이름과 아이콘'을 붙입니다.
#파일 내부의 이진수 데이터는 인간이 읽을 수 없지만, #겉의 파일 이름과 아이콘으로 구분할수있습니다.
#그렇다면 이 사진데이터도 겉으로 봤을땐 사람이 읽을 수 있는 글씨이고, 컴퓨터는 데이터로 인식하게 만들면 되지 않을까요?
#이것이 바로 그렇게 만든 사진데이터입니다.
#밝기가 확실히 밝아졌죠?
#한 픽셀의, RGB값의 뺀 앞부분 #두 비트를 이용해서 사람이 노이즈 속에서도 글씨를 읽어낼 수 있게 할 수 있습니다.
#글씨가 있는 부분은 앞 두개는 무조건 11, 나머지 여섯개는 데이터의 이진수값. 반대로 글씨가 없는부분은 앞에는 00, 나머지는 데이터를 집어넣습니다.
#앞에 두 비트가 차지하는 명암의 비중이 75%나 됩니다. 아무리 뒤에 6비트가 커도, 화면밝기로 절대 따라갈 수 없습니다.
#사람은 명암 구분을 제일 잘합니다. 명암이 75%이나 차이나면 노이즈가 있음에도 글씨를 볼 수 있습니다.
그래서, 사진데이터에 파일의 속성을 글씨로 써줍니다.
#마치 바탕화면 보는것처럼 저게 무슨 사진데이터인지 파악할 수 있습니다.
#압축파일, 게임세이브데이터, 내스케줄, 음악, 에러로그, 초대권, 그 무엇도 다 이런식으로 저장할 수 있습니다. 일종의 QR코드 진화판이죠.
#저는 모든 개발자들이 쉽게 데이터를 사진으로 저장하고,
사진에서 데이터를 불러올 수 있는 api를 라이브러리 형태로 오픈소스 제공합니다.
#이것이 가지는 의미를 찾아봅시다
#파일. 자료는 사용자 자신이 주인이 되어서 스스로 관리할수 있어야 합니다.
#클라우드 시대가 왔다지만, 사용자경험을 고려하지 않은 디자인이 많습니다.
애플의 폐쇄성때문에 어플끼리 파일 옮기는게 힘들어서 대부분 클라우드와 URL을 통해서 작업합니다. 로컬이 단단하지 않은 상태에서 모든걸 클라우드에게 맞기겠다는 건 말이 안됩니다. #그때문에 일어난 불편함을 개발자와 사용자 둘다 느끼고 있습니다. 스마트폰은 특히나 네트워크 단절이 드문 기계잖아요
#그 누구도 파일을 보내기 위해서 클라우드 어플을
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
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의 디자인 패턴