StringBuffer
String은 용량이 고정되기 때문에 누적합할 때 객체가 계속 생성되는거임
메모리에 남는 건 걔가 버려주잖아(이름기억안남)
근데 버릴 때 객체의 갯수가 많아지면 이렇게 중간것만 남을 수 있음 -> 메모리 낭비
그래서 누적합이 많아지면 (10개 넘어가면) StringBuffer와 StringBuilder를 사용함(보통 StringBuffer)
이 둘은 객체의 용량이 변화함 그래서 새로운 객체를 생성하지 않는다
StringBuffer은 다수유저가 동시접근하는 것을 허용하지 않음
예외와 오류의 차이점
에러 : 문법이나 메모리가 잘못된거, 프로그램 시작조차 못함 ( 괄호 갯수, 변수명 잘못 쓴거)
예외 : 실행을 해봐야 앎, 사용자의 오조작이나 외부 문제로 발생하는 오류, 프로그램이 돌긴 함
예외는 일반 예외와 실행 예외(runtime exception)로 분리된다
일반예외는 이클립스에서 코딩중에 어떤 예외인지 다 알려두기 때문에
실행해봐야 알 수 있는 실행 예외 중 잘 나오는 것 4개만
NullPointException : 객체가 없는 상태에서 객체를 사용할 경우
ArrayIndexOutOfBoundException : 배열 인덱스 범위를 초과하여 사용한 경우
NumberFormatException : 숫자 변환시 문자가 포함되어 있는 경우(숫자의 형태가 아닌데 숫자화할때)
ClassCastException : 매개값으로 받은 타입의 종류를 알 수 없는 경우
예외처리
Try-catch : 모든 문제 스스로 해결, 예외가 발생한 곳에서 처리하는 방법
try{ 예외가 발생할 수 있는 코드
}catch(Exception e){
예외가 발생하면 실행할 코드
}finally{
항상 실행할 코드
}
throws : 해당 업무를 시킨 method에게 책임 전가
multi-catch :
try multi catch는 2개이상의 오류마다 똑같은 대응을 할 때 사용한다
but 각 오류마다 다른 대응하려면 그냥 catch로 여러개 하는게 낫다
or exception :
try{
ArrayIndexOutOfBoundsException 발생
NumberFormatException 발생
}catch(ArrayIndexOutOfException |
NumberFormatException e){
}
*저렇게 모든 Exception 다 쓸 필요 없이 Exception 이라고만 해도 됨
왜냐? 모든 exception의 부모는 exception class이기때문이다
Custom Exception
기존 예외 외에도 새로운 예외를 만들 수 있다.
이들은 반드시 Exception 혹은 RuntimeException클래스를 상속받아야 한다.
오늘 알아야 할 것
1.
throw? ageCheck를 호출한 doPost한테 던진거임 jvm한테 던짐. 걔넨 해결해주지 않아 그냥 에러뿌리고 끝냄
원래 이렇게 하면안되지만 가장 편한 방법
2. 일반예외 : 이클립스에서 미리 알려준다
실행예외 : 미리알려주지않음, 실행해야 보이는 예외
collection framework
collection interface를 최상위로 하는 자료구조 interface이다.
다양한 자료구조를 가지고 있다
초기 선언시 크기를 지정하지 않아서 유연한 사용이 가능하다 (크기가 거의 무한함)
각 인터페이스를 구현받은 클래스들의 사용법(데이터 추가, 삭제, 검색방법)은 비슷함
장점 : 필수 메서드들을 강제로 쓸 수 있다
자료구조 : 데이터가 담기는 통이 어떻게 생겨먹었냐
ex)변수, 배열, (자바스크립트에선 객체)
list와 set은 컬렉션에 있는 규격을 상속받고 있음
list는 array vector linked가 구현받고 있음
노란색은 많이 쓰는 애들/ 빨간색은 안해도됨
set: 중복을 안받아
arraylist는 배열과 비슷, 제한도 없음, 하나가 삭제되면 땡기고붙고 해야함 -> 100개중에 3번 인덱스에 들어가면 너무 무리가 감
static ArrayList<String> list = new ArrayList<String>();
이런식으로 생김
<>안에 있는건 generic으로 해당 자료구조에 들어갈 데이터 타입을 강제한다, 단 클래스 타입으로 지정해줘야한다
arrylist라면 list만 써도됨 구현하고있기 때문에
static을 넣어놔야 원본에 바로 값을 집어넣어서 여러번 객체화되어 ㅕㅇ러개 복사되는 것을 막을 수 있음
list.add(todo); //리스트의 맨 만지막에 데이터를 추가해줌
/*list.add(0, todo) 몇 번째 인덱스부터 값을 넣을지 정할 수 있음*/
꺼내올 땐 list.get(인덱스 번호)
- list.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://code.jquery.com/jquery-3.6.3.min.js"></script>
<style>
table, th, td{
width: 500px;
border: 1px solid black;
border-collapse: collapse;
padding: 5px 10px;
}
input[type="text"]{
width: 100%;
}
button{
width: 100%;
}
</style>
</head>
<body>
<h3>TO DO LIST</h3>
<form action="add" method="post">
<table class="input">
<colgroup>
<col width="80%"/>
<col width="20%"/>
</colgroup>
<tr>
<td><input type="text" name="todo"/></td>
<td><button>입력</button></td>
</tr>
</table>
</form>
<c:if test="${list.size() == 0}">나만의 할 일을 입력해보세요</c:if>
<c:if test="${list.size() > 0}">
<table>
<colgroup>
<col width="15%"/>
<col width="70%"/>
<col width="15%"/>
</colgroup>
<thead>
<tr>
<th>번호</th>
<th>할일</th>
<th>삭제</th>
</tr>
</thead>
<tbody>
<c:forEach items="${list}" var="todo">
<tr>
<td>1</td>
<td>${todo}</td>
<td>삭제</td>
</tr>
</c:forEach>
</tbody>
</table>
</c:if>
</body>
<script></script>
</html>
input태그의 name태그에 todo라고 설정한다
사용자들이 넣은 값은 여기에 저장된다
-ListController
todo값을 받을거임, view에서 doPost로 보냈으니까 여기서도 doPost로 받아주고
String todo = req.getParameter("todo"); 로 가져옴
model 사용해주기 위해 객체화 하고, 객체화한 모델의 메서드중 목록에 추가해주는 listAdd() 메서드에
매개변수를 todo로 하여 넣어줌
sendRedirect로 이동시켜줌 주소넣는 괄호 안에 contextpath 활용
package kr.co.web.controller;
import java.awt.PageAttributes.OrientationRequestedType;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import kr.co.web.model.ListModel;
@WebServlet(urlPatterns = {"/","/add"})
public class ListController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("root호출");
RequestDispatcher dis = req.getRequestDispatcher("list.jsp");
ListModel model = new ListModel();
ArrayList<String> list = model.getList();
req.setAttribute("list", list);
dis.forward(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
String todo = req.getParameter("todo"); //client에게 받아온 파라메터를
System.out.println(todo); // model에 저장하라고 전달해준다
ListModel model = new ListModel();
model.listAdd(todo);
//전송할 차례, 이번엔 단순하게 이동만 할 경우 또는 서버에 요청을 할 경우는 sendRedirect
resp.sendRedirect(req.getContextPath());
//request는 context 경로까지 포함해서 보내야한다 (21_List이런식으로 문자열로 직접넣어도 되고 context path 넣어도됨)
}
}
-ListModel.java
필요한 메서드들 만들어줌
ArrayList라는 자료구조 타입 이용해서 list만들어줌
여기에 static을 넣어놓은 이유는
객체화를 여러번 하면서 (dopost와 doget을 왔다갔다하면서) 발생하는 여러 복사본 때문에
하나의 객체라고 인식을 못함 -> 목록에 추가가되지 않음 -> 그래서 원본으로 설정해줘서 아예 처음부터 그릇을 만들어놓음
listAdd라는 리스트의 맨 마지막에 추가하는 메서드 만들고 실행문으로는 아까 만든 list 변수에 add 걸어줘
list가져오는 getList 메서드 만들어서 list를 바로 리턴값으로 가져오게 함
package kr.co.web.model;
import java.util.ArrayList;
public class ListModel {
//arraylist는 크기가 무제한, 크기를 지정할 순 있지만 의미는 없음.
//<>는 generic으로 해당 자료구조에 들어갈 데이터 타입을 강제한다.
//단 클래스 타입으로 지정해줘야함 (int 아니고 Integer, long이 아니고 Long)
static ArrayList<String> list = new ArrayList<String>(); //arraylist를 list라고 써도댐 다형성때문에, 단 arrylist에게고유기능이 있다면 ㄴㄴ
//여기에 static을 넣어놔야 원본에 바로 값을 집어넣을 수 있음, 객체화를 여러버하면 할 때마다 새로 생기는 거임
public void listAdd(String todo) {
list.add(todo); //리스트의 매 ㄴ만지막에 데이터를 추가해줌
/*list.add(0, todo) 특정 인덱스에 값을 넣을 수 있음*/
}
public ArrayList<String> getList(){
return list; //getter 메서드랑 비슷하게
}
}
'Spring' 카테고리의 다른 글
국비코딩 Mar08 | collection framework, static을 사용해야 하는 이유, 게시판 글쓰기 기능 (0) | 2023.03.08 |
---|---|
국비코딩 Mar07 | 게시판 만들기, update로 수정하기, dual메서드, (0) | 2023.03.07 |
국비코딩 Mar03 | promotion 시 자식객체의 특성, string 기능들, session에 저장 (0) | 2023.03.03 |
국비코딩 Mar02 | 값이 아니라 주소가 뜰 때, mvc 패턴 흐름 정리 (0) | 2023.03.02 |
국비코딩 Feb28 | MVC 패턴 중 헷갈리는 부분, 추상화 장점, 다형성 (0) | 2023.02.28 |