인프런 커뮤니티 질문&답변

DG Y님의 프로필 이미지
DG Y

작성한 질문수

김영한의 실전 자바 - 중급 2편

컬렉션프레임워크 Stack 관련질문

작성

·

13

0

package collection.deque.test.stack;

import java.util.ArrayDeque;
import java.util.Deque;

public class BrowserHistory {
    private  Deque<String> history = new ArrayDeque<>();
    private String currentPage = null;

    public void visitPage(String s) {
        if(currentPage != null){
            history.push(currentPage);
        }
        currentPage = s;
        System.out.println("방문 : "+s);
    }

    @Override
    public String toString() {
        return "BrowserHistory{" +
                "stack=" + history +
                '}';
    }

    public String goBack() {

        if(!history.isEmpty()){
            currentPage = history.pop();
            System.out.println("뒤로가기 : "+currentPage);
            return currentPage;
        }
        return null;
    }
}
//////////////////////

package collection.deque.test.stack;

public class BrowserHistoryTest {

    public static void main(String[] args) {
        BrowserHistory browser = new BrowserHistory();
        
        // 사용자가 웹페이지를 방문하는 시나리오
        browser.visitPage("youtube.com");
        browser.visitPage("google.com");
        browser.visitPage("facebook.com");

        // 뒤로 가기 기능을 사용하는 시나리오
        String currentPage1 = browser.goBack();
        System.out.println("currentPage1 = " + currentPage1);

        String currentPage2 = browser.goBack();
        System.out.println("currentPage2 = " + currentPage2);

        System.out.println(browser);


    }

}
위의 goBack 메서드 실행코드가
Pop()인데 
currentPage1 에서 
facebook이 출력이되지않고 google이 출력되는 이유가 궁금합니다
스택구조는  마지막에 입력한것이 나오게 되어있는데 그 전에 입력한것이 왜 나오는 이유가 궁금합니다

답변 1

0

안녕하세요, 인프런 AI 인턴입니다. DG Y님.

여러분의 코드를 보면, visitPage 메서드에서는 currentPage를 업데이트하고, 이전 페이지를 history 스택에 push 하고 있습니다. 이 과정에서 실제로는 currentPage에 이미 있는 페이지를 스택에 넣는 구조입니다. 여기서의 핵심은 visitPage 메서드가 호출될 때마다 currentPage의 값이 업데이트되고, 이전 currentPage 값은 스택에 push 된다는 것입니다.

기본적으로 스택의 특성인 LIFO(Last In, First Out) 방식으로 동작하기 때문에, goBack 메서드를 호출할 때마다 가장 최근에 저장된 페이지가 pop 되어 currentPage로 설정됩니다. 따라서, 스택에 저장된 순서는 youtube.com, google.com이고, facebook.comcurrentPage로만 존재합니다. goBack 호출 시 처음으로 facebook.com이 아니라 google.comcurrentPage로 설정되는 이유는 visitPage 메서드가 currentPage만 새로 방문한 페이지로 업데이트하기 때문입니다.

  • visitPage("youtube.com")으로 처음 방문 시:

    • 현재 페이지: youtube.com
    • 스택: 비어있음
  • visitPage("google.com")으로 방문 시, currentPageyoutube.com이 스택에 추가됨:

    • 현재 페이지: google.com
    • 스택: youtube.com
  • visitPage("facebook.com")으로 방문 시, currentPagegoogle.com이 스택에 추가됨:

    • 현재 페이지: facebook.com
    • 스택: youtube.com, google.com

따라서 goBack()가 호출되면 google.com이 pop되어 currentPage로 설정됩니다.

위 내용에 대한 더 자세한 설명이나 코드를 통한 실험의 결과를 원하신다면, 다음 관련 링크를 참고하시면 좋을 것 같습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.

현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

DG Y님의 프로필 이미지
DG Y

작성한 질문수

질문하기