onnnzeoz
article thumbnail

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 메서드랑 비슷하게 
	}

}
profile

onnnzeoz

@onnnzeoz

비전공자의 개발 공부 일지입니다 💦 국비 풀스택 과정 수강중