-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[C++ & C#] 3일차 프로그래밍 & 지식 #27
Comments
Adapter 패턴. 그게 뭐야?도형편집기에서 Text를 추가하려면, Shape로부터 파생되어야 하고, Draw()함수에서 글자를 출력해야 한다. 한 클래스의 인터페이스를 클라이언트가 사용하고자 하는 다른 인터페이스로 변환한다. 호환성때문에 사용할 수 없었던 클래스들을 연결해서 사용한다. 어답터에 종류에는 클래스 어답터 / 객체 어답터가 있다. 클래스 어댑터, 객체 어댑터클래스 어댑터TextView 클래스의 인터페이스를 도형편집기에 맞도록 수정 근데 만약, tv를 넣고 싶다면? 이것은 클래스의 변환이 아닌, 객체 형체의 어댑터가 필요합니다.. ObjectAdapter : public TextView, public Shape가 아닌, public Shape만 받고 안에 TextView의 포인터를 넣는게 핵심입니다. 기존에 있던 객체를 변경할 순 없고, 새로운 객체를 만들 때 써야죠. 기존에 객체가 존재했던 인터페이스를 교체하고 싶은거라면 객체 어댑터를 써야겠죠.
|
어댑터패턴의 실전 STL) int main(){ } 링크드리스트를 한쪽으로만 쓰면 스택이 되잖아요. 함수 이름만 스택에 맞게 바꿔주면 되겠죠? 두번째 방법은, list를 stack의 멤버변수로 놔두면 되잖아요! 그러면, 리스트를 참조로 불러서 써먹으면 되니까. 훨씬 깔끔하겠죠. 여기서 알 수 있는게 상속을 이용하는 어댑터 / 포함을 시키는 어댑터 차이점을 알면 좋겠죠. Container Adapter -> Sequence Container의 인터페이스를 수정해, stack queue, priority_queue등 을 제공한다. iterator Adapter reverse_iterator<?> p3(p2); // --p2로 초기화
reverse_iterator<?> p4(p1); // --p1으로 초기화
cout << *p3 << endl;
++p3;
cout << *p3 << endl; 하면, 4, 3이 찍히죠. auto를 자주 쓰다 보면 타입을 잊어버리는데, list::iterator를 사용하면 된다. reverse_iterator기존 반복자의 동작을 거꾸로 하는 어댑터 proxy 패턴어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴 Proxy 는 원격지의 서버를 대신 하는 클래스. Proxy <-> Stub
서버클래스와 프록시 클래스 동일한 이름이 있으면 안된다. client와 동적 모듈 사이의 약속 Proxy 객체의 수명관리 인터페이스와 참조계수 오픈소스들은 스마트포인터를 제공해주는 이유가, addref나 release함수를 자동으로 호출하기 위한거다. 프록시패턴에 대한 정리 facade(퍼사드) 패턴 TCP 서버를 만드는것은 소켓 관련함수를 클래스화하자. N/W, 라이브러리 초기화 클린업 - NetworkInit 클래스 설계... 퍼사드는 서브 시스템을 합성하는 다수의 객체들이 인터페이스 집합에 대해 일관된 하나의 인터페이스를 제공할 수 있게 한다. 약간 SDK개발이 퍼사드패턴을 되게 많이 이용하지 않을까 싶다... :) |
브릿지 패턴 새로운 MP3가 나오면, 확장성이 있게 만드려면 제품을 만들 때 그냥 만들면 안되고, 인터페이스를 먼저 설계해야죠. 모든 MP3제품을 만들 땐, MP3부터 파생되는것. PIMPL( Pointer to IMPlementation )의 장점 뒤에 있는걸 사용하기 위한 껍질.. 즉 간접층을 도입. |
CPP 생성자에서 콜론은 왜 쓰는거야? (초기화 리스트)
https://hashcode.co.kr/questions/629/%EC%83%9D%EC%84%B1%EC%9E%90%EC%97%90%EC%84%9C-%EC%BD%9C%EB%A1%A0%EC%9D%80-%EC%99%9C-%EC%93%B0%EB%8A%94-%EA%B1%B4%EA%B0%80%EC%9A%94
https://treeroad.tistory.com/entry/%EC%83%9D%EC%84%B1%EC%9E%90%EC%97%90-%EC%BD%9C%EB%A1%A0-%EB%A5%BC-%EC%93%B0%EB%8A%94-%EC%9D%B4%EC%9C%A0
default 생성자
http://tcpschool.com/cpp/cpp_conDestructor_defaultConstructor
깊은 복사, 얕은 복사 그게 뭐야?
https://blueshw.github.io/2016/01/20/shallow-copy-deep-copy/
Listener패턴과 Observer패턴, 차이가 있을까?
그게 그거인 것 같은데.. 리스너가 곧 옵저버이다.
이부분이 좀 어려운데, 함수 포인터에 대한 개념이 완벽해야 할 듯..
인턴첨부자료 폴더에 따로 넣어놓았으니 나중에 확인할 것
또한 이해하면 좋을 듯
함수 템플릿은 컴파일러가 함수 인자를 통해 타입을 추론합니다.
클래스템플릿을 생성하는 함수 템플릿을 도움 함수를 만들면 편리하다.
일반 함수 포인터와 멤버 함수 포인터는 절대 같은 타입에 담을 수 없다.
일반함수포인터와 멤버함수포인터를 바로 사용하지 말고, 클래스를 만들자. Action이라는 클래스를 만들어 일반 함수 포인터를 가지게 하고, MemberAction으로 멤버함수 포인터를 사용하는 클래스를 만들자.
이 둘을 묶어서 사용하려고 하면, 공통의 기반 Action클래스가 있으면 좋겠네?
IAction포인터는 둘 다 담을 수 있겠지, execute() = 0 라는 순수가상함수 만들고,
함수에 대한 정보는 인터페이스에 넣어놓아야 함.
객체만 선택해서 안에서 어떤 메뉴를 선택했는지 조사하여야 함.
Menu Event#2부터 리뷰
cpp에선 hpp로 헤더플플도 있다.. :)
command에서는, 메뉴가 눌려졌다는 사실을 알려주기만 하면 되고 커맨드는 눌린거만 생각해야지.
변하는 부분은 가상함수로 뽑아냈었잖아. 어떤 일을 직접 하지 말고 함수를 부르는거지.
=> 메뉴 이벤트를 처리할 때 가장 널리 사용되는 방법은?
파생클래스에서가상함수 재정의 => 너무 많이 써먹어야해..
변하는 것을 다른 클래스로 빼먹으면 Strategy패턴인데, 교체 가능해서 Interface가 필요하겠지.
따로 인터페이스를 짜서 메뉴 메세지를 처리하는거야.
함수 타입
C++11부터는,
function<void()> f;
처럼 일반화된 함수 포인터 역할을 지원하는 템플릿이 생겼다. 헤더는 functional을 이용하여야 한다.
리턴 값은 보이드고, 파라미터가 없는것을 위처럼 나타내고
있는것을 나타내려면
function<void(int)> 식으로 사용하면 된다. 이것은 함수 포인터가 아닌 함수 타입이라고 생각하면 된다. 장점은, 멤버함수도 받을 수 있고 멤버함수는 실행하려면 객체가 있어야 하는데, bind를 이용해서
f = bind(&Dialog::Close, &dlg);`코드로 사용할 수 있다. 그 후 f();로 실행할 수 있다.f = bind(&goo, 5); 등으로 인자를 고정해버릴 수 있다. bind는 인자 고정 가능. 표준이라서 기능이 상당히 많다.
디자인관점때문에 본 것이고, 실제 활용시 function을 사용하는게 좋다. c++11을 사용하지 않는 환경이라면 함수포인터로 만들어 사용해야 한다.
하지만 객체가 아닌 클래스에 기능을 추가하는 것으로 실행 시간이 아닌 코드 작성시에 기능이 추가된다.
상속말고, 다른 방법 없을까?
구성을 통한 기능의 추가
상속은 클래스에 코드 작성시 기능 추가가 가능하고, 구성은 객체에 실행 시간에 기능 추가가 가능하다.
상속은 경직되고, 유연성이 부족하지만, 구성은 유연성이 뛰어나다.
기능 추가 된 객체에, 다시 기능 추가하려면? 기반클래스가 있어야겠지..
우주선과 기능추가 객체는 동일한 기반 클래스를 가져야 한다.
Decorator
IDecorator라는 기능추가에 대한 공통 기반 클래스를 만들어서, 이 기반클래스를 이용합니다.
의도 : 객체에 동적으로 새로운 서비스를 추가할 수 있게 한다.
기능 추가를 위해 서브 클래스를 사용하는 것보다 융통성 있는 방법을 제공한다.
The text was updated successfully, but these errors were encountered: