비 와서 10분 늦고 앞부분 놓침 😢 넘나리 힘들다
이하 구디아카데미 김지훈 강사님의 수업자료와 강의 내용 정리, 실습한 내용을 정리함!
Custom Exception
- 기존 예외 이외에도 새로운 예외를 만들 수도 있다.
- 한 가지 규칙이 있다면 반드시 [Exception | RuntimeException] 클래스를 상속받아야 한다.
- 또한 테스트를 위해서 강제로 특정 예외를 발생시킬 수 있다.
index
1. action 속성이 join 이고 method 가 post 인 폼 생성
2. name 이 id 인 ID 입력창 생성
3. name 이 age 이고 placeholder 로 "20세 이상만 가입 가능"이라고 적힌 입력 창 생성
4. 서버에 form 전송하는 가입 버튼 생성
5. EL 태그를 가져와서 변수 msg에 담음
6. 만약 msg가 공백이 아니면 alert 창으로 msg 출력
controller
1. /join 경로로 들어온 것을 처리한다.
2. 이름이 id인 것의 파라메터를 가져와서 변수 id에 담음
3. 이름이 age인 것의 파라메터를 가져와서 변수 age에 담음
4. JoinModel 이라는 클래스를 model 로 객체화 해옴
5. page 변수에 result.jsp 를 담음
JoinModel 로 이동
model
- String id 를 매개변수로 한 reservedCheck 메서드를 실행하면(이때 throws 를 넣어야 하지만 runtime 예외라(발생할지 알 수 없기 때문에 넣지 않아도 동작된다)
String 배열인 변수 list 에 "admin","tester","member" 가 담김
변수 str 에 list 배열을 하나씩 넣고
만약 id 가 str 과 같다면 ReserveException을 객체화한 것으로 throw 해서 id+"는 예약어라 사용할 수 없습니다." 라고 개발자용으로 보여 준다.
- String age 를 매개변수로 받는 adultCheck 메서드를 실행하면 예외가 발생했을 때 AdultException, NumberFormatException 로 던진다.
age 를 숫자로 변환해서 변수 n 에 담는다.
만약 n이 20보다 작으면 객체화한 AdultException 을 throw 해서 "20세 미만은 가입 불가" 라고 개발자용으로 보여 준다.
ReserveException
1. ReserveException 클래스는 RuntimeException 을 상속받음
2. 매개변수 message를 받는 메서드이며 message 를 반환한다.
AdultException
1. AdultException 는 Exception 을 상속받음
2. 매개변수 message를 받는 메서드이며 message 를 반환한다.
다시 controller
-
try / catch 문을 사용하여 만약 model의 reservedCheck 메서드에 id 를 매개변수로 넣어 실행
-
"id" 라는 이름에 id 값을 넣어줌
-
ReserveException 예외가 캐치되면 간단한 예외 메시지를 출력
-
"msg" 라는 이름으로 id+"는 예약어입니다." 를 담음
-
index.jsp 를 page 변수에 담음
-
try / catch 문을 사용
-
model 의 adultCheck 메서드에 age 매개변수 넣음
-
"age" 이름에 age 값 담음
-
NumberFormatException 캐치 시 예외 메시지 보여줌
-
index.jsp 를 page 변수에 담음
-
"msg" 이름에 "숫자 외의 문자를 넣지 마세요." 담음
-
AdultException 캐치 시 예외 메시지 보여줌
-
index.jsp 를 page 변수에 담음
-
"msg" 이름에 "20세 미만은 가입할 수 없습니다." 담음
-
변수 dis 에 page 를 담고 dis 를 forward 해줌
Collection Framework
- Collection Framework 는 Collection interface 를 최상위 로 하는 자료구조 interface 이다.
- List, Set, Map interface 를 implements 하여 각 collection 으로 사용한다.
- Collection Framework 에서 데이터 추가, 삭제, 검색 방법은 거의 비슷하다.
- collection interface 에서 같은 메서드를 오버라이드 받기 때문에
요약
- Collection framework 자료구조 최상위 interface 이다.
- 크게 list, set, map interface 로 나눌 수 있다.
- 이들은 선언 시 크기를 지정하지 않는다. (크기가 거의 무한하다)
- 각 interface 를 구현 받은 class 들의 사용법은 비슷하다.
List Collection
ArrayList
- Array List 는 index 로 객체를 관리한다는 점에서는 Array 와 유사하다.
- 차이점은 Array 와 달리 index 가 유연하다는 점이다.
- Array List 는 객체 삭제 추가 시 인덱스가 1 씩 당겨지거나 미뤄지게 된다.
- 때문에 빈번한 객체의 추가, 삭제가 일어날 때 다소 무리가 간다.
index
-
TO DO LIST 라는 테이블 생성
class 는 list 이고 colgroup 으로 width 를 먼저 설정해 준다.
colgroup 태그는 사용되는 테이블의 컬럼(td 태그)에 적용할 스타일 width와 bakcground를 해당 태그에서 미리 적용할 수 있게 한다. 특히 각 컬럼의 길이를 설정하는 데 가장 많이 쓰인다.
-
들어갈 내용은 순서대로 순서/해야 할 일/ 삭제
-
forEach 문을 이용하여 EL 태그로 가져온 list 덩어리를 todo 라는 이름을 설정하고 안의 값을 stat 라는 이름으로 설정한다.
-
2행의 1열에는 stat의 index 를
-
2행의 2열에는 todo 값을( 아래 form 태그 내의 name 속성의 "todo")
-
2행의 3열에는 delete 경로의 idx 파라미터로 stat의 index를 가져온다.
-
action 이름이 add 이고 method 가 post 인 form 생성
-
테이블 생성, class 이름은 input
-
input type 이 text 이고 name 속성이 todo 인 col 생성 button 생성
controller
- url 패턴이 /add 와 /delete 인 경로를 처리하는 controller
- 변수 addr 에 URI 값을 가져와서 contextPath의 길이만큼부터 자른 값을 넣음
- ListModel 을 객체화
ListModel
-
String 데이터 타입만 받는 ArrayList 를 list 라는 변수로 객체화해옴
-
getList 메서드는 변수 list 를 반환값으로 뱉음
-
addList 라는 메서드는 todo 를 매개변수로 받아 실행됨
-
list의 가장 뒤에 todo 를 넣음
-
delList 메서드는 idx 를 매개변수로 받아서 실행됨
-
idx 를 int 타입으로 변환해 변수 index에 넣음
-
list 에서 index 를 지운 값을 변수 val 에 넣음
다시 controller
-
만약 addr 이 /delete 와 같다면
-
idx 의 파라메터를 변수 idx 에 담음
-
model의 delList 메서드에 idx 를 넣고 실행 > 해당 인덱스의 val 을 반환함
-
"list" 이름으로 model 의 getList 메서드 실행 값을 넣음
-
결과를 index.jsp 로 보냄
-
"todo" 의 파라메터를 변수 todo 에 담음
-
변수 addr 에 URI 값을 가져와서 contextPath의 길이만큼부터 자른 값을 넣음
-
만약 addr 이 "/add" 와 같다면
-
ListModel 을 객체화해서 model 변수에 담음
-
model의 addList 메서드를 매개변수 todo 를 넣고 실행
-
model 의 getList 메서드 실행 결과를 list 변수에 넣음
-
그 값을 "list"라는 이름으로 index.jsp 로 보냄
Vector
- Vector 와 Array List 와의 차이점은 하나이다.
- 바로 특정 Thread 가 접근 시 다른 Thread 가 접근할 수 없다는 점이다.
- 쉽게 말해 누군가가 사용하고 있다면 다른 사람은 기다려야 한다는 것이다.
index
body
- action 이름이 add 인 post 타입 form 생성
- 텍스트를 입력할 수 있는 입력창 name 속성은 todo / 입력 버튼
c:if
문 사용 : EL 태그로 가져온 list의 size 가 0일 때는 "나만의 할 일을 입력하세요." 출력
- 만약 list size 가 0보다 크다면 clear 라는 이름을 가진 '모두 삭제' 링크 출력
- 그리고 테이블 출력 : 각 컬럼의 width % 설정해 주고 컬럼 이름 지정
c:if
문 사용하여 EL 태그로 가져온 list 덩어리를 이름은 todo, 값은 stat 라고 굴려줌
- 1열에 stat 의 인덱스 넘버 출력
2열에 text 타입의 name 속성이 val 이고 값은 EL 태그로 가져온 todo 가 출력됨
3열에 onclick 이벤트가 걸려 있는 수정 버튼 출력함. 이벤트가 벌어지면 update 라는 함수가 실행됨. 매개변수는 el 태그로 자겨온 stat의 인덱스 넘버이며 this(이벤트 당사자 객체) 에 적용됨
4열에 삭제가 출력. 링크된 위치는 remove 라는 이름이며 파라메터는 idx 라는 이름인데 값에 stat의 index 를 넣을 것임(즉 stat 의 index 삭제할 거)
script
- 함수 update 는 매개변수 idx 와 당사자 객체를 받아서 실행됨
- 당사자 객체의 tr의 자손 중 input 타입이고 name이 val 인 녀석의 값을 변수 val 에 담는다.
- 콘솔에 인덱스와 값을 찍어준다.
- 세팅된 인덱스 값에 인덱스를 넣고 세팅된 val 값을 val에 넣어서 링크로 보낸다.
controller
1. url "/"(다 받음), "/add", "/remove", "/clear", "/set" 경로를 처리하는 컨트롤러
2. doGet 메서드와 doPost 메서드를 오버라이드 받아서 둘 다 dual 이라는 메서드에 리퀘스트 리스폰스 매개변수로 넣어 실행시킴
- dual 메서드 실행(get, post 모두 이 메서드에서 처리)
uri 변수에 uri 를 요청해서 넣고, ctx 변수에 contextPath 를 넣음
ContextPath는 특정 웹 애플리케이션을 가리키는 URL의 일부를 말함. 클라이언트에서 URL을 요청할 때 어떤 애플리케이션에 요청을 할지에 대한 구분이 된다. 예를 들어, http://www.velog.com/ritina21 라는 URL에서 ContextPath는 ritina21가 된다.
addr 변수에 uri 에서 ctx 의 길이 이후를 잘라 넣음
RequestDispatcher 변수 dis 에는 우선 값을 비워놓고
VectorModel 클래스를 model 로 객체화 해옴
- 만약 addr 이 "/"와 같다면 "list"라는 이름으로 model 객체의 getList 라는 메서드를 실행해서 list.jsp 로 보냄
- 만약 addr이 "/add"와 같다면 todo의 파라메터를 가져와서 todo 변수에 담고 model 객체의 addList 메서드를 실행함.
그리고 ctx로 값이 전송됨(투두 리스트에 목록이 추가된 후에 다시 ctx 경로로 돌아가는 것)
- 만약 addr 이 "/remove" 와 같다면 idx 파라메터를 변수 idx 에 넣음
int로 변경된 idx에 model 객체의 delList 메서드를 실행해 준 후 ctx 로 값이 전송됨(지운 후에 지워진 화면 표시)
VectorModel
- 타입을 String 으로 지정한 Vector 라는 클래스를 list 라는 이름으로 객체화 해옴
- addList 라는 메서드에 매개변수 todo 를 넣으면 todo를 매개변수로 받는 list의 add 메서드가 실행됨(todo가 마지막으로 붙음)
- getList 메서드는 list를 반환값으로 뱉음
- delList 라는 메서드는 매개변수를 int idx 로 받아서 list 객체의 remove 메서드를 실행시킴
- clearList 라는 메서드는 만약 list 가 비워져 있지 않으면 list 를 비움
- setList 라는 메서드는 매개변수로 int idx 와 String val 로 받아서 list에 set 메서드를 실행함(idx 인덱스의 값을 val 로 덮어씌우기)
- Collection Framework 에서 데이터 추가, 삭제, 검색 방법이 비슷한 이유는 ?
- Collection 이라는 같은 interface를 최상위로 하고 있기 때문
- 각 interface 를 구현받은 class 들의 사용법은 비슷함(오버라이드 하는 메서드가 같기 때문)
- Collection Framework 의 자료구조를 크게 세 가지로 나누면 ?
- Array List 와 Array가 유사한 부분은 ?
- Array List 와 Array의 차이점은 ?
- Array List 는 index 가 유연함
- 객체 삭제/ 추가 시 인덱스가 1씩 당겨지거나 미뤄짐
- 빈번한 객체 추가 삭제가 일어날 때는 다소 무리가 간다.
- Vector 와 Array List 의 차이점은 ?
- vector 는 특정 Thread 가 접근 시 다른 Thread 가 접근할 수 없다.
- Hash Map 의 method 가 기존과 조금 다른 이유는 ? - 정지원
- 중간에 데이터를 추가 또는 삭제 시 Array List 보다 Linked List의 효율이 높은 이유
는?
- 좌우 데이터의 주소를 기억하는 구조를 갖기 때문
- Set 에만 제공되는 기능과 역할은?
- 중복을 허용하지 않음
- 검색기능이 없는 대신 하나씩 꺼낼 수 있는 Iterator 를 제공
- Set 이 get(index) 를 사용 할 수 없는 이유는 ?
- 중복 값에 대한 Set 과 Map 의 차이점은 ?
- set 은 아예 입력이 안 됨 map 은 값을 덮어씌움
- 리스트에 동일한 클래스를 여러 개 넣을 수 있는 이유는 ?
- 한 개의 파일 내 다수의 클래스가 가질 수 없는 접근 제한자는?
- Map 에서 데이터를 꺼내는 두 가지 방법은 ?
- 키만 Set 으로 가져와 key 를 따로 추출해 값을 찾는 방식
- 키:값 을 한 쌍으로 Set 으로 가져와 각각 추출하는 방식
- Generic 의 역할과 장점은 ?
- 여러 타입을 저장할 수 있다.
- 클래스를 객체화할 때마다 유연하게 클래스 내 데이터 타입을 지정할 수 있다.