두 구현에 같은 호출을 차례로 실행한다
호출 하나를 두 구현에 적용해도 단계마다 반환값과 외부 상태는 같다.
빈 스택에서 시작
스택으로 관찰한 상태 · 반환값
EndStack · 리스트 뒤쪽이 맨 위
FrontStack · 리스트 앞쪽이 맨 위
내부 리스트를 비교하면 순서가 다르지만, 스택으로 관찰한 맨 아래부터 맨 위까지의 순서와 pop 반환값은 같다. 클라이언트 코드 observe()는 두 구현 모두에서 ("dog", 4)를 얻는다.
같은 스택 연산을 서로 다른 리스트 메서드에 대응시킨다
구현의 차이는 경계 안의 메서드 대응이며 클라이언트 코드의 호출은 바뀌지 않는다.
| 스택 연산 | EndStack 내부 | FrontStack 내부 | 외부 의미 |
|---|---|---|---|
| push(item) | append(item) | insert(0, item) | item을 새 맨 위 원소로 둔다 |
| pop() | pop() | pop(0) | 맨 위 원소를 삭제해 반환한다 |
클라이언트 코드는 내부 list의 방향이 아니라 push와 pop의 결과에 의존한다. 내부 list 메서드를 직접 호출하면 구현을 바꿀 때 함께 고쳐야 한다.