-
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#] 2일차 프로그래밍 #26
Comments
개인 공부를 위함 자주 사용되는 코딩 패턴에 이름을 부여한 것을 디자인 패턴이라 한다. for문이 두개 겹치는 걸 이중포문이라고 하고, 우리는 이중 루프라고 부른다. 이것은 이름이 있기 때문에 개발자 간 편리하고 명확한 의사 소통이 가능하다. 용어 공부, template method가 어떤 코드인지 코드 배우기, 장점, 단점, 어떤 때 활용하는 것인지 관점 배우기 Gangs of Four = 디자인 패턴 책의 저자 네명을 갱이라고 부르며, GoF's 디자인 패턴이 됨 기존에 존재하는 코딩 방식에 이름을 부여한 것임.
[Protected]생성자를 protected로 만드는 이유 ? 소멸자를 protected로 만드는 이유 ? Protected 소멸자를 만들었을때는 객체를 파괴할 때 직접 딜리트하기보다는, 멤버함수를 통해서 delete하라라는 의미가 담겨 있겠죠. => 아주 많이 사용되진 않지만, 의미가 있다'객체를 스택에 만들 수 없게 할 때 주로 사용하는 기법', ' 참조 계수 기반의 객체 수명관리기법에서 주로 사용됨' [Upcasting]C++은 포인터에 대한 타입이 엄격한데, 상속은 동족끼리 묶을때도 많이 쓰고 업캐스팅이란, 자식이 부모를 대체할 수 있었지. 자식으로 생성한 객체를 부모에다가 연결하는 것을 업캐스팅이라고 함. 기반클래스포인터로 파생클래스를 가리킬 때, 가상함수로 만들어야 재정의된 함수가 호출된다. [순수가상함수와 추상클래스] 디자인패턴에선 중요한 문법 중 하나다. C++에서는 가상함수를 만들 때 뒤에다 구현부를 만들지 않고, 추상클래스는 객체를 만들 수 없지만, 포인터변수는 만들 수 있다. => 추상클래스의 특징 추상클래스에서 상속받은 순수가상함수를 구현하면, 추상이 아니다. 구현이 없으면 error인데 구현이 있으면 error가 나지 않고 정상적으로 작동합니다. 추상클래스는 만드는 의도가 있어야 함. 구현부를 물려주겠다는것이 아닌 모든 도형을 만드는 사람들은 그 클래스를 사용할 수 있게 하려면 Draw를 만들어야 한다. 라고 함수에서 약속을 하고 만들도록 시키는 것 '추상 클래스의 의도' => 파생 클래스에게 특정 함수를 반드시 구현하라고 지시하는 것 [interface & coupling] 추상클래스의 활용으로, 인터페이스와 커플링을 알아보자. 제품을 먼저 만들지 말고, **제품의 인터페이스(규칙, 계약)**을 먼저 설계한다. People이 카메라를 사용하면서 take함수에 ICamera에 해당하는 인터페이스를 매개변수로 받음으로써, 새로운 카메라가 등장해도 카메라인터페이스를 따른다면, 코드의 추가가 더 필요 없게 되었죠. 모든 카메라는 아래 인터페이스를 구현해야 한다. = 아래 클래스로부터 파생되어야 한다. [예제로 배우는 객체지향 프로그래밍] 모든 도형을 타입으로 설계하기. Rect, Circle 클래스 만들기 동일한 함수 호출이 상황에 따라 다르게 동작하는 것 : 다형성 = OCP를 만족하는 좋은 코딩 스타일 [Prototype Design Pattern] - Clone()타입코드(멤버변수)를 추가하는 것보다는 가상함수를 만들어서 사용하자. 변하지 않는 코드에서, 변하는 부분은 분리되어야 한다.
[Template Method Pattern] - Draw는 템플릿메소드, DrawImp() (훅메소드)모든 도형에 공통적인 변하지 않는 전체적인 흐름을 기반 클래스에서 제공함 템플릿메소드에서 공통적인 특징을 기반클래스에 넣고, 모든 도형은 그리는 방법은 모두 같잖아? 알고리즘의 구조를 유지하면서, 서브클래스에서 특정 단계를 재정의하는 것 가상함수를 만들 때, Draw를 재정의하면 안되는데, 파생클래스가 재정의하지 마라라는 문법 절대 어떤 메소드를 부르지 못하게 만드려면 어떻게 해야할까? 객체의 생성과정도 OCP를 만족하지 못하는데, 객체의 생성과정을 OCP 만족시키려면 어떻게 해야할까? [변하는 것을 분리하는 방법] validation정책은 변경이 가능해야 되는데, edit 클래스보다는 validation 정책을 변경할 수 있어야 한다. 전체적인 흐름은 변하지 않을때가 많은데, 그 안에서 사용하는 일부 정책은 변경될 때가 있다.
장점과 단점을 생각해봅시다... 상황을 보고, 하는 작업이 뭔가 분리해 내긴 해야겠다. => 그 때 재사용성이 필요하고, 실행시간에 교체가 필요하다면 전략패턴이고, 그게 필요 없다면 템플릿메소드 방법을 사용하면 좋다. [Strategy Pattern] 크게 보면, 템플릿 메소드랑 비슷한 것 / strategy와 비슷한 것. |
이전에 알고가야 할 것 ex) template<typename T> class List{
public:
void push_front(const T& a){
//.....
}
} inline인라인 함수를 사용하면, 함수 내부의 코드를 재사용할 수 있고, 인스턴트 코드보다 함수에서 코드를 변경하거나 업데이트하기가 더 쉽다. 함수 이름을 통해 코드가 무엇을 의미하는지 이해가기 더 쉽고, 함수는 함수 호출 인수가 함수 매개 변수와 일치하는지 확인하기 위해 타입 검사를 한다. => 함수 호출이 함수 자체의 내용 복사본으로 대체되어 함수 오버헤드가 제거된다. [Policy Base Design]단위 전략 디자인 list의 전방 삽입 알고리즘은 변하지 않지만, 동기화 정책은 교체 가능해야지. 변하는 것을 분리하는 방법 : 변하는 것을 가상함수로, 다른클래스로. 가상함수는 조금의 성능 저하를 일으키는데, 첫번째로 인터페이스를 사용하면 가상함수를 사용하게 되는데 성능 저하가 동반됩니다. 정책클래스를 인터페이스 기반으로 놓던가, 템플릿 인자로 놓던가.... 이런 디자인 기법을 단위 전략 디자인이라고 불러요. 전략 패턴은 가상함수기반이기때문에, 정책 교체가 가능하지만 살짝 느려요.하지만 단위 전략디자인은 인라인치환이 가능하고, 빠르지만 실행 시간에 교체할 수 없어요.컴파일하고나면, 이미 Typename으로 지정했기 때문에 변경이 불가능하죠. 클래스 전방선언 - 포인터는 먼저 쓰게 해달라.. CPP 코드가 어떻게 진행되는지 알아? 전역변수가 생성된 이후 -> 기반 클래스 생성자 후 main으로 들어가게 되는데,. 전역변수 생성자가 먼저 실행이 되고나서 main이 실행된다. [함수와 정책] 멤버 함수에서 변하는 것 멤버가 아닌 일반 함수에서 변하는 것 일반 함수에서도 변하지 않는 알고리즘 안에 변해야 하는 부분이 있다면, 분리를 해야 합니다!!! 함수인자로 정책을 담은 코드를 전달하는 방법
|
[State Pattern]상태에 따라 변경되는 동작들을 다른 클래스로 분리한다. 상태 패턴 정리 -- 의도가 다름. 상태 패턴은 동작을 변경 전략패턴은 알고리즘을 다 클래스로 캡슐화하여 알고리즘의 대체가 가능하도록 한다. 변하지 않는 코드에서 변해야 하는 부분은 분리되어야 한다.
|
[Composite Pattern] 기반 클래스인 BaseMenu만들고 기본 멤버변수 추가 객체들을 트리 구조로 구성하여 부분과 전체를 나타내는 계층구조로 만들 수 있다. 메뉴바가 가지고 있는 0,1,2에 해당하는 메뉴를 얻어낼 수 있도록 getSubmenu를 만들어보자. 생성자 상속이 가능해.. => using MenuItem::MenuItem; 을 사용하면, 생성자 상속이 가능하다. 메뉴 선택시 하는 일을 가상 함수로 분리하는 경우에는, 파생 클래스의 개수가 너무 많아진다. 메뉴 선택시 하는 일을 다른 클래스에게 위임하는 것. Listener라는 이름을 사용하는 기술 |
[C++ & C#] 2일차 프로그래밍
The text was updated successfully, but these errors were encountered: