접근변경자 private, protected, public 에 대해서 알아보자.
생성자를 c)public으로 하면 둘다 잘된다.
생성자를 a)private 으로 하면 객체가 호출할 수 없고, 자식도 호출할 수 없기 때문에
1, 2 둘 다 에러이다.
b)protected로 하면 1은 에러이고, 2는 잘 된다.
왜냐하면 protected라서 나는 부를 수 없고,
자식인 d는 Dog class로 갔다가 그 Dog 생성자 내부에서 Animal 생성자를 호출하기 때문에 가능하다.
추상적인 개념으로 만들기 위해 protected 개념을 사용한다.
b)protected로 2를 출력하면,
Animal()
Dog() 로 제대로 나온다.
이번엔 상속시의 접근변경자이다.
위 코드는 상속시 달라지는 접근변경자에 따른 변화를 알아보는 코드이다.
1의 경우는 언제나 가능하다.
der이 int a나 int b은 각각 private, protected이기 때문에 언제나 불가능하다.
그렇다면 나머지 경우를 보자.
a)private 상속이거나, b)protected 상속일 경우에는
Derived가 private혹은 protected를 사용하여 Base를 상속하였기 때문에 c에 엑세스할 수가 없다.
protected로 상속하면 public int c;가 protected int c;가 된다.
c)public 상속일때만 c가 public int c;가 되어 접근이 가능하다.
그렇다면 private 상속은 도대체 왜 사용하는 것일까?
부모로부터 구현은 물려받지만, (자식이 내부적으로 사용하지만)
인터페이스는 물려받지 않겠다. (부모함수를 외부에 노출시키지는 않겠다.)
위 말이 아주 중요하닷
이제 private 상속을 사용한 예를 보겠다.
만약, 사용자가 stack을 요구한다고 하자.
stack을 만들어주자 → list를 한쪽만 사용하면 stack이다 → 그렇다면 list를 재사용하자 !!!
stack_inheritance를 보자.
내부 함수는 public으로 push, pop, top 함수가 있다.
사용자는 이 세 함수를 사용할 수 있지만, 내부의 내용은 알 수가 없다.
private으로 list를 상속받아 내용을 완전이 숨긴 것이다.
stack_composition은 상속을 포함으로만 바꾼 것이다.
재사용의 방법에는 상속과 포함이 있다. 그리고 포함이 더 좋을 때가 많다.
stack_inheritance class는 private으로 상속했음에도 불구하고,
우리가 사용할 수 없는 push_front라는 부모의 함수가 보인다.
포함 구조를 사용하면 부모 함수들의 이름명들을 감출 수 있다.
c++ 표준의 stack을 흔히 "stack adapter"라고 하며, Adapter patten을 사용해 만든 class이다.
Adapter Patten
기존 클래스의 인터페이스(함수 이름)을 변경해서
사용자가 요구하는 새로운 class를 만드는 디자인 패턴
Ex) 220volt를 사용자가 110volt로 쓰길 원할 때 바꿔주는 돼지코가 Adapter
마지막 참고
최고의 디자인이 되려면 사용자가 vector나 list를 선택할 수 있게 해야한다.
위와 같이하면 main내부 처럼 다양한 stack을 사용할 수 있다.
'프로그래밍 > 디자인패턴' 카테고리의 다른 글
[ST교육] Upcasting & Binding (Composite Patten) (0) | 2014.09.09 |
---|---|
[ST교육] 생성자소멸자 (0) | 2014.09.06 |
[ST교육] thiscall 4 (0) | 2014.08.31 |
[ST교육] thiscall 3 (0) | 2014.08.31 |
[ST교육] thiscall 2 (0) | 2014.08.31 |