array와 arraylist의 차이점
둘 다 객체를 인덱스로 관리한다는 점이 비슷하지만 arraylist는 인덱스를 유연하게 추가, 삭제 할 수 있음 = 크기가 정해져있지 않다
하지만 중간에 추가, 삭제를 하게 되면 모든 인덱스들이 당겨지거나 미뤄지게 되니 잦은 이동은 ㄴㄴ
arraylist와 linked list는 같은 list라는 인터페이스를 구현받기 때문에 같은 메서드를 사용한
arraylist와 vector의 차이점
vector는 다중 접속을 막아주는 역할, 다른 누군가가 사용하고 있다면 다른 사람은 기다려야 한다
generic은?
collection framework 사용할 때마다 나옴
이는 데이터 타입을 담아주는데, 특징으로는 여러 데이터를 담을 수 있다는 것이 있음.
또 객체화 할 때마다 데이터타입을 내가 새로 정해줄 수 있음
꼭 이 안엔 클래스형 데이터 타입을 넣어야해, int일때는 Integer라고 넣어주고 나머지는 첫 글자 대문자
arraylist와 linked list의 차이점
linked list는 양 옆 데이터의 주소를 기억하는 구조
단순히 뒤에 데이터를 넣을 때는 속도가 느리지만 중간에 데이터를 넣을 경우에는 array list보다 훨씬 유용함
둘의 속도비교 (이 속도 비교를 할 때 동기방식을 사용함 -> 값을 구할 때까지 브라우저의 로딩바가 계속 돌아가고 아무것도 하면 안)
동기방식?
서버에서 응답이 올 때까지 아무것도 하지않고 대기하는 것 ex) 상담원대기신호
<-> 비동기 방식 : 서버의 응답이 올때까지 다른 할 일을 하고 있어도 됨 ex) 상담원 대기할 때 번호 적고 전화 끊기
set은?
번호를 빼서 확인한 후 다시 넣기 때문에 순서가 유지되지 않는다 그래서 검색기능이 없으며
그로인해 contains()와 get()메서드는 사용이 불가능하다
확인하고 싶다면 Iterator를 활용해서 하나씩 쪼개서 봐야한다
또 중복을 허용하지 않는다는 특징이 있음 ! but 객체화해서 복사본을 여러 개 만들어내면
거기에는 같은 값을 넣어도 다른 곳이라고 인식하기때문에 중복으로 생각하지 않음
set 데이터 출력하는 2가지 방법
1. iterator와 next()를 활용한 정석
package kr.co.web.model;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetModel {
private static Set<String> set = new HashSet<String>(); //다형성 덕분에 set이라고해도 가능한
//Set도 Collection interface를 구현받으므로 List와 사용법이 비슷하다
//add(), remove(), size()로 크기확인, clear()로 비우기 등 비슷하게 사용함
//번호를 확인하고 그걸 다시 주머니 안으로 넣기 때문에 똑같은게 도 뜰 수가 있는거 -> 그래서 검색이 불가능함
//그래서 contains()와 get()메서드 사용 불가능 -> 무조건 하나씩 쪼개서 확인을 해봐야함
public void addData(String val) {
//데이터 추가, 얘는 중복을 허용하지 않음 근데 객체는 같은 클래스라 하더라도 복사하면 일련번호가 달라져서 중복으로 생각하지 않음 !
set.add(val);
System.out.println("set의 데이터 수 : " + set.size());
}
public ArrayList<String> getData() { //데이터를 출력할거임 2가지 방법이있다
/*첫번째 방법
Iterator<String> iter = set.iterator(); //1.꺼내기 좋게 쪼개준다
while(iter.hasNext()) { //2. hasNext를 통해 꺼낼것 있니? 물어봄 약간 isempty같은거인듯 true 를 반환함
System.out.println(iter.next());
}
*/
ArrayList<String> list = new ArrayList<String>();
for (String val : set) {
list.add(val);
}
return list;
}
}
public ArrayList<String> getData() {
//첫번째 방법
Iterator<String> iter = set.iterator(); //1.꺼내기 좋게 쪼개준다
while(iter.hasNext()) { //2. hasNext를 통해 꺼낼것 있니? 물어봄 약간 isempty같은거인듯 true 를 반환함
System.out.println(iter.next());
}
return list;
2. 생성자 활용하는
arraylist인 list를 하나 만들어서 향상된 for문을 통해 val값을 넣어
private static Set<String> set = new HashSet<String>();
public ArrayList<String> getData() {
ArrayList<String> list = new ArrayList<String>();
for (String val : set) {
list.add(val);
}
return list;
}
1. model에서 static을 사용해야하는 이유??
public class VectorModel {
private static Vector<String> vector = new Vector<String>();
//private 걸어서 이제 이 객체의 메서드를 통해서만 접근 가능-> 캡슐화
//private 이유 : 원본영역에 저장하려고 왜? static을 걸지않으면 복사본이 계속 만들어
public void listAdd(String todo) {
vector.add(todo);
}
public Vector<String> getList(){
return vector;
}
model을 객체화할때 복사본이 계속 새로 생기면 같은 내용을 공유하는게 아니라서, 여기선 리스트를 계속 누적하고 거기서 수정하고 거기서 지워야하기 때문에 원본영역에서 쓰는거
write부분만 코드리뷰
게시판 글쓰기 기능
- writeForm.jsp
<body>
<form action="write" method="post">
<table>
<tr>
<th>작성자</th>
<td><input type="text" name="user_name"/></td>
</tr>
<tr>
<th>제목</th>
<td><input type="text" name="subject"/></td>
</tr>
<tr>
<th>내용</th>
<td><textarea name="content"></textarea></td>
</tr>
<tr>
<th colspan="2"><button>작성</button></th>
</tr>
</table>
</form>
</body>
user_name, subject, content라는 이름으로 각가의 파라메터들을 전송합니다 전송할 주소는 write가 되고 post방식으로 보낸다. button 태그는 무조건 submit이기 때문에 누르면 바로 제출이 된다
- BoardController
private void dual(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {
String uri = req.getRequestURI();
String ctx = req.getContextPath();
String addr = uri.substring(ctx.length());
RequestDispatcher dis = null;
req.setCharacterEncoding("UTF-8");
BoardModel model = new BoardModel();
if(addr.equals("/")) {
req.setAttribute("list", model.getList());
dis = req.getRequestDispatcher("list.jsp");
dis.forward(req, resp);
//메인으로 보낼때 model.getList를 갖고와서 그걸 보내줘야하는거잩ㅋㅎ아 근데 만약 send redirect를 안쓰면 저 3줄을 다시 또 써줘야하는거
//업데이트를 하거나할때 이 3줄이 꼬박꼬박 붙는게 너무 코드중복임 그래스 그냥 ctx주소로 보내ㅜ저(
//response만 보내면 값을 실어보낼 수 없어
}
if(addr.equals("/write")) {
String user_name = req.getParameter("user_name");
String subject = req.getParameter("subject");
String content = req.getParameter("content");
System.out.println(user_name+"/"+subject+"/"+content);
model.write(user_name, subject, content);
resp.sendRedirect(ctx);
}
컨트롤러에서 그 write값을 받아줌니다 dual메서드를 쓴 이유는 doGet과 doPost에서 일어날 코드의 중복을 없애기 위함
addr과 write가 일치하면 각각의 파라메터 값을 가져와서 각 변수에 넣어준다. model의 write 메서드에 user_name, subject, content라는 인자값을 넣어서 실행해준다
그리고 ctx로 페이지를 이동한다 (옮길 값이 없어서 그냥 sendRedirect로 가능)
"/"로 이동한 후엔 setAttribute를 통해 model.getList()를 실행하고 return값으로 list를 list라는 이름으로 저장한다
그리고 그걸 list.jsp로 보낸다 req와resp도 함게 보낸다
그리고 list,jsp에선 ${list}를 통해받아주고
<c:if test="${list.size() > 0 }">
<c:forEach items="${list}" var="board" varStatus="stat">
list의 사이즈가 0보다 크면 foreach문을 통해 list의 값들을 다 꺼내서 board에 저장해주고 그 값들의 속성을 varStatus 속성을 통해 접근해준다 stat이라는 거에 접근하면 인덱스 값 등등 속성들을 알 수 있음 -> 몇 번째 글인지 지정해줄 수 있으니까 저장, 삭제 등등이 가능해짐
- BoardModel
private static ArrayList<BoardBean> list = new ArrayList<BoardBean>();
//글쓰기
public void write(String user_name, String subject, String content) {
//값이 3개나돼 이걸 넣기 ㅜ이해 class를 이용했어 class를 만들어서
BoardBean bean = new BoardBean(); //클래스(beans) 객체화하고;
bean.setUser_name(user_name); //받아온 값을 넣고
bean.setSubject(subject);
bean.setContent(content);
list.add(bean); // 해당 객체를 리스트에 넣는다
}
boardbean 클래스를 데이터 타입으로 갖는 arraylist라는 클래스를 객체화를 해줍니다. boardbean이라고 되어있는 제네릭을 씀으로써 arraylist 클래스 안에있는 모든 메서드와 필드들의 데이터 타입이 모두 boardbean이 됩니다.
private 접근제한자를 사용한 이유는 아무나 접근할 수 없도록 하기 위해 (빈규약이기도 함) -> 게터세터를 통해서만 가져와야함
static을 붙임으로써 list를 static에만 저장을 시키는데 이는 객체화하여 update를 한다거나 새로 글을 쓴다거나 하는 새로운 요청들이 들어올 때마다 새로운 복사본이 생기면서 서로 다른 값을 가지게 되는데 이를 방지하기 위함이다.
제네릭과 변수의 차이점 : 데이터 타입