Uknow's Lab.
article thumbnail

Stack

스택이란 LIFO(Last In Fist Out)를 지원하는 자료구조로써,

가장 나중에 들어간 것이 가장 빨리 나오는 형태입니다. 후입 선출이라고도 하죠.

 

 

이는 접시처럼, 가장 위에 있는 접시(가장 나중에 쌓은 접시) 부터 꺼내야 하는 것과 비슷합니다.

Ctrl + Z나 브라우저 뒤로가기 버튼 등도 대표적인 예시입니다.

 

 

자바의 Stack 클래스

 

실행결과 : 3, 2, 1 (개행문자 생략)

꽤 많이 사용되는 자료구조인 만큼, 자바의 표준 라이브러리에서도 Stack을 이미 지원하고 있습니다.

push로 stack에 데이터를 넣고, pop을 사용해 가장 최근의 데이터부터 꺼낼 수 있습니다.

 

 

Stack은 push를 통해 데이터를 집어넣는구나! 근데 add는 뭐지?

 

 

스택에 데이터를 넣는 메소드는 push와 add 두 가지를 지원합니다.

정확히 말하자면, 스택 자체에서 지원하는 데이터 추가 메소드는 push 입니다.

add는 스택의 부모 클래스인 Vector에서 지원하는 메소드입니다.

둘 모두 스택에서 사용이 가능하지만, stack을 사용하는 걸 더 명확히 알 수 있도록 push 사용을 권장하는 편입니다.

 

 

이와 같이 Stack의 코드를 파고 들어갔을 때,

이와 같이 스택은 Vector를 상속받아 구현되었습니다.

 

 

Vector를 상속받았기에, Vector의 add 메소드를 Stack에서도 사용할 수 있는 것입니다.

 

 

 

어 근데 Vector의 add는 특정 위치에 삽입이 가능한데?

 

 

Vector를 상속받은 Stack이기에,

Vector의 add를 사용할 수 있습니다.

Vector의 add는 오버로딩되어, 특정 위치에 원소를 추가할 수 있는 add 메소드도 있는데,

이걸 사용하면 스택에서도 특정 위치에 원소 삽입이 가능할까요?

 

 

 

실행결과 : 3, 4, 2, 1

네 그렇습니다.

stack에서도 add 메서드를 통해 특정 위치로 원소를 삽입할 수 있었습니다.

 

끝에서만 삽입과 삭제 연산이 일어나는 스택이지만 중간에 원소를 삽입할 수 있습니다.

LIFO 구조가 깨진 것 입니다.

 

 

 

객체지향 상속의 문제점

상속은 부모의 기능을 모두 가져옵니다.

불필요한 기능까지 다요. 결함이 있다면 결함까지 가져옵니다.

Stack의 경우는 부모 클래스의 결함을 가져왔다고 할 수는 없으나,

부모 클래스의 불필요한 기능까지 가지고 오는 바람에

LIFO 구조가 깨져버리는 결함이 발생하였습니다.

특정 위치에 데이터를 삽입함으로써, 의도하지 않은 동작을 할 수 있지요.

 

객체지향 프로그래밍에서의 상속의 문제점 중 하나를 잘 드러내는 예시로 볼 수 있을 것 같네요.

 

 

 

때문에 Stack 클래스를 보면

더 complete 하고 consistent한 LIFO stack을 위해서는

Deque를 사용할 것을 권장하고 있습니다.

profile

Uknow's Lab.

@유노 Uknow

인생은 Byte와 Double 사이 Char다. 아무말이나 해봤습니다.