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 인터페이스를 간접적으로 구현
상속 받은 메서드 = 서브 클래스에서 사용할 수 있는 수퍼클래스의 메서드 (서브로 끌고 오는게 아님)
object의 위치 ,,!
**상속과 인스턴스 필드들
**Stack 인스턴스
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
'[네이버클라우드] 클라우드 기반의 개발자 과정 7기 > 웹프로그래밍' 카테고리의 다른 글
[NC7기-41일차(6월22일)] - 웹프로그래밍 22일차 (0) | 2023.06.22 |
---|---|
[NC7기-40일차(6월21일)] - 웹프로그래밍 21일차 (0) | 2023.06.21 |
[NC7기-38일차(6월19일)] - 웹프로그래밍 19일차 (0) | 2023.06.19 |
[NC7기-37일차(6월16일)] - 웹프로그래밍 18일차 (0) | 2023.06.16 |
[NC7기-36일차(6월15일)] - 웹프로그래밍 17일차 (0) | 2023.06.15 |