。゚(*´□`)゚。

코딩의 즐거움과 도전, 그리고 일상의 소소한 순간들이 어우러진 블로그

[네이버클라우드] 클라우드 기반의 개발자 과정 7기/웹프로그래밍

[NC7기-39일차(6월20일)] - 웹프로그래밍 20일차

quarrrter 2023. 6. 20. 15:57

Stack, Queue 자료구조 구현 

 

breadcrumb (지나온 흔적) - 헨젤과그레텔에서 나온 말 

오늘의 목표

 

Stack 구동원리 

LIFO : Last In First Out

응용 : *방문하는 메뉴 이름 저장 & 방문하는 폴더 이름 저장 & 방문하는 웹페이지 저장 

예) c:/ 사용자 / bitcamp / git / bitcamp-study

뒤로가면 마지막 방문 순서대로 나오는 거 

 

 

Stack 구현

점선화살표: implement

실선화살표: 상속

 

List obj;

obj = new ArrayList();

obj = new LinkedList();

obj = new Stack();

sub 클래스는 super클래스가 구현한 메서드를 사용할 수 있다. = super 클래스가 인터페이스를 구현했으면 sub클래스도 구현한 것으로 간주한다.

 

직접적으로 List 인터페이스 구현

List 인터페이스를 간접적으로 구현

 

Stack은 LinkedList의기능을 본인 것처럼 쓸 수 있다.

상속 받은 메서드 = 서브 클래스에서 사용할 수 있는 수퍼클래스의 메서드 (서브로 끌고 오는게 아님)

 

 

 

 

 

 

 

 

 

 

 

object의 위치 ,,! 

object가 사실은 ,, 저기 있음

 

 

**상속과 인스턴스 필드들 

상속받은 수퍼클래스의 인스턴스들에 이어서 본인 인스턴스 생성됨

 

**Stack 인스턴스

head, tail, size는 필드

public boolean add(Object value) {
		
		Node node = new Node(); //1. 새 노드를 생성한다. 
	
		node.value= value; 	// 2. 새노드에 value 값 추가 
		
		if(head == null) {
			head = node;
		} else if(this.tail !=null) { 	//3. 리스트의 마지막 노드에 새 노드를 연결 
			tail.next = node;
		}
		
		this.tail = node;
		this.size++;
		return true;
	}

push

public void push(Object value) {

//목록 맨 끝에 추가한다.

// 따로 만들 필요가 없다.

// 수퍼 클래스에 있는 메서드를 이용하여 기능을 구현한다.

this.add(value); // 상속 받은 메서드 = 서브 클래스에서 사용할 수 있는 수퍼클래스 메서드

}

pop

 

출력

출력값

 

 

 

StringBuilder

Stack 기능

	public void push(Object value) {
		//목록 맨 끝에 추가한다. 
		// 따로 만들 필요가 없다.
		// 수퍼 클래스에 있는 메서드를 이용하여 기능을 구현한다. 
		this.add(value); // 상속 받은 메서드 = 서브 클래스에서 사용할 수 있는 수퍼클래스 메서드 
	}
	
	public Object pop() { // 제거
		if(this.size() == 0) {
			return null;
		}
		
		return this.remove(this.size()-1); // 목록에서 제거한 걸 return
	}
	
	public Object peek() { //꺼내기
		if (this.size() ==0) {
			return null;
		}
		return this.get(this.size()-1);
	}
	
	public boolean empty() {
		return this.size() == 0; //true
	}
}

Queue 구동원리

FIFO : First In First Out

=> 명령어 입력 history 기능에 적용

=> 예약/주문 받을 때 

SI 기존의 제품을 커스터마이징 , 신규로 프로젝트 만드는 것돋 

SM 유지보수

 

Queue 적용

menuprompt 클래스에 메뉴 출력기능 추가 

package bitcamp.util;

public class MenuPrompt extends Prompt{
	
	private Stack menus = new Stack();
	private Stack breadcrumbs = new Stack();
	
	public void appendBreadcrumb(String title, String menu) {
		this.breadcrumbs.push(title);
		this.menus.push(menu);
	}
	
	public void removeBreadcrumb() {
		this.breadcrumbs.pop();
	}
	
	public void printMenu() {
		System.out.println(menus.peek());
		this.menus.pop();
	}
	
	public String inputMenu() {
		StringBuilder titleBuilder = new StringBuilder(); // 예) 메인 / 회원 >
		for(int i = 0; i < this.breadcrumbs.size(); i++) {//기존 타이틀이 있다면 새로 붙일 타이틀과 구분하기 위해 / 추가
			if(titleBuilder.length() > 0) { 
				titleBuilder.append("/");
			}
			titleBuilder.append(this.breadcrumbs.get(i));
		}
		titleBuilder.append(" >");
		return this.inputString(titleBuilder.toString());
	}

}

app, boardhanlder, memberhandler 변경 

package bitcamp.myapp;

import bitcamp.myapp.handler.BoardHandler;
import bitcamp.myapp.handler.Handler;
import bitcamp.myapp.handler.MemberHandler;
import bitcamp.util.ArrayList;
import bitcamp.util.LinkedList;
import bitcamp.util.MenuPrompt;
 
public class App {

  public static void main(String[] args) {

	  //기본 생성자를 이용해 Prompt 인스턴스를 준비한다.
	  //=> 기본 생성자는 Scanner를 키보드와 연결한다. 
	  MenuPrompt prompt = new MenuPrompt();
	  prompt.appendBreadcrumb("메인", getMenu()); ---------------
	  
	//모든 핸들러는 핸들러 규칙에 따라 정의되었기 때문에 
	// Handler 레퍼런스에 그 주소를 담을 수 있다. 
	Handler memberHanlder = new MemberHandler(prompt, "회원", new ArrayList());
    Handler boardHandler = new BoardHandler(prompt, "게시글", new LinkedList());
    Handler readingHandler = new BoardHandler(prompt, "독서록", new LinkedList());
    
      
	  
	printTitle();
	
	prompt.printMenu();-------------
    
     
 
    while (true) {
      String menuNo = prompt.inputMenu();
      if (menuNo.equals("0")) {
        break;
      } else if (menuNo.equals("menu")) {
    	  prompt.printMenu();
      } else if (menuNo.equals("1")) {
    	  memberHanlder.excute();
      } else if (menuNo.equals("2")) {
    	  boardHandler.excute();
      } else if (menuNo.equals("3")) {
    	  readingHandler.excute();
      } else {
     System.out.println("메뉴 번호가 옳지 않습니다.");
    }
    } 

    prompt.close();
  }

  static String getMenu() {
	  StringBuilder menu = new StringBuilder(); -----------
	  menu.append("1. 회원\n");
	  menu.append("2. 게시글\n");
	  menu.append("3. 독서록\n");
	  menu.append("0. 종료\n");
	  return menu.toString();------------------------------
  }

  static void printTitle() {
    System.out.println("나의 목록 관리 시스템");
    System.out.println("--------------------------------------");
  }
}

queue 10개 꽉차면 맨 앞지우기 poll

맨 뒤에 올 때 offer