여튼 아래는 인텔리제이에서 파보다보니까 cursor가 나오게 됐고 "기준점"정도로 이해하면 될 것 같다
1.listIterator(int index) : iterator를 사용할 컬렉션의 해당 인덱스번호부터 값을 가져온다
// 해당 변수의 1번 인덱스부터 받아오기
ListIterator<Student> li2 = al.listIterator(1);
2.hasNext()는 while문으로 한번 돌리고 나면 기준점이 끝으로 가있어 다시 돌려도 의미x
while(li.hasNext()){
System.out.print(li.next()+" "); // a(0점) a(1점) a(2점) a(3점) a(4점)
}
// hasNext() 두번째 돌리면 처음부터 다시 가는게 아니라 이미 끝에 있기에 의미없음
while(li.hasNext()){
System.out.print(li.next()+" "); // 출력x
}
3.출력x던 hasNext()를 hasPrevious()를 쓰면 다시 출력이 된다
// hasNext() 두번째 돌리면 처음부터 다시 가는게 아니라 이미 끝에 있기에 의미없음
while(li.hasNext()){
System.out.print(li.next()+" "); // 출력x
}
System.out.println();
while(li.hasPrevious()){
System.out.print(li.previous()+" "); // a(4점) a(3점) a(2점) a(1점) a(0점)
}
System.out.println();
// hasPrevious()로 앞으로 돌렸기에 기준점이 앞으로 와있어 hasNext() 다시 작동
while(li.hasNext()){
System.out.print(li.next()+" "); // a(0점) a(1점) a(2점) a(3점) a(4점)
}
원데이터인 ArrayList인 al에 add하면 추가값이 잘 나오는데 ListIterator인 li2에 add하면 값이 while+hasNext()에서 안나온다. 근데 디버깅하면 안에 size도 그렇고 값이 추가된 것 같이 나오는데 이것저것 해봤지만 미스테리
package com.kh.run;
import com.kh.view.Menu;
public class Run {
public static void main(String[] args) {
**new Menu().mainMenu();**
}
}
2.뷰의 메뉴 메소드에서 사용자에게 메뉴 번호 입력받아 해당 번호를 실행하기 위해 콘트롤러에게 해당 번호 메소드 요청
public class Menu {
public void mainMenu() {
Employee**Controller ec** = new EmployeeController();
do {
System.out.println("====================");
System.out.println("[Main Menu]");
System.out.println("1.전체 사원 정보 조회");
// ...
switch(user) {
case 1: **ec.selectAll()**; break;
case 2: break;
// ...
default: System.out.println("잘못 입력")
}
} while(user != 0);
3.컨트롤러에서 DAO 메소드를 호출한다.(후에 결과값 받아옴)
목적이 DB(오라클)에서 전체 사원정보 조회이기에 자바랑 sql 오라클을 연결해서 받아 올 수 있게 DAO에서 메소드를 호출한다
DAO(Date Access Object) : 외부 데이터 저장공간과 연결하는 역할
세부설명 : DB의 data에 접근하기 위한 객체로 직접 DB에 접근하여 데이터를 삽입, 삭제, 조회 등 조작할 수 있는 기능을 수행한다.
package com.kh.controller;
public class EmployeeController {
public void selectAll() {
**empDAO.selectAll()**; // DAO에서 메소드를 호출
}
4.DAO에서 jdbc 드라이버 연결 및 받아온 데이터를 리턴함
주의사항 : 리턴할 때 리턴하는 데이터의 타입을 보고 해당 메소드( selectAll() )의 반환타입을 리턴하는 데이터로 수정해준다. 보통은 void로 되어있을 것이다.
package com.kh.model.dao;
public class EmployeeDAO {
public **ArrayList<Employee>** selectAll() {
// jdbc 드라이버 연결 및 자료 받아오기
**return list**;
}
}
5.위의 3번에서 empDAO.selectAll(); 이 코드가 필요에 의해 DAO를 호출했기에 받아온 값을 다시 넣어줘야한다 .
그리고 사용자에게 받아온 데이터의 결과값을 보여주기 위해 뷰의 메소드를 호출한다
package com.kh.controller;
public class EmployeeController {
public void selectAll() {
**ArrayList<Employee> list** = empDAO.selectAll();
// list가 비어있을 때 = 사원이 없을 때
if(list.isEmpty()) {
menu.displayError("조회 결과가 없습니다.");
}else {
// list가 비어있지 않을 때 = 사원 존재할 때
**menu.selectAll(list);** // DAO에서 받아온 list의 값이 존재하니 받아온 데이터를 넘겨줌
}
}
6.DAO에서 받아온 전체사원정보 데이터를 콘트롤러에서 menu.selectAll(list); 코드를 통해 아래의 뷰 selectAll()메소드로 보내주었고, 받아온 데이터의 형식이 리스트에 여러 행이 존재하기에 for문 돌려서 한 줄 씩 받아와서 출력이 되도록 println() 해준다
package com.kh.view;
public class Menu {
public void mainMenu() {
// ...
}
public void **selectAll**(ArrayList<Employee> list) {
for(int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
7.다른 메뉴의 기능 구현할려면 2번으로 돌아가 do while문 안에 switch문의 case에서 컨트롤러를 호출하는 메소드를 기술하고 컨트롤러에 가서 해당 메소드를 생성하는 것으로 이어가면 된다
요약
V → C → M
V ← C ← M
1.run파일에서 뷰 메뉴 메소드 호출
2.실행 할 기능의 컨트롤러 메소드 호출
3.컨트롤러에서 DAO 메소드 호출 for DB연결 및 데이터 가져오기
4.호출된 DAO 메소드에서 jdbc로 db에 연결 및 받아온 데이터를 리턴해준다.
5.컨트롤러에서 필요에 의해 값을 받아오기 위해 DAO 메소드를 호출했으니, 호출요청한 코드에 DAO에서 받아온 데이터를 넣어준다
그리고 사용자에게 받아온 데이터의 결과값을 보여주기 위해 뷰의 메소드를 호출하고 호출하면서 DAO에서 받아온 데이터를 같이 보내준다
6.DAO에서 컨트롤러를 거쳐 받아온 데이터를 사용자에게 보여주기 위해 해당 뷰 메소드에서 받아온 데이터를 출력할 수 있게 데이터처리하고 출력하면 된다