벌써 구디아카데미에서의 두번째 주가 지났다.
오늘은 어제에 이어 리스트를 만들었는데 앞으로 가장 많이 만들게 되는 것이 리스트라고 하셨다.
아직 배열과 ArrayList가 익숙하지 않지만;; 곧 익숙해지겠지!
// 기본타입간에 형변환 가능 (boolean 제외)
// 참조타입간에 형변환 가능
// 기본타입과 참조타입간에는 형변환 불가 (메모리의 모양이 같아야 함)
// ex) int x = Integer.parseInt("14"); <-- 형변환 아님!
int x = 10;
double dx = (double)x; // 데이터손실X -> 형변환 연산자 생략가능(자동형변환)
double dy = 3.0;
int y = (int)dy; // 데이터손실O -> 형변환 연산자 생략불가(명시적형변환)
float fz = 3.14F;
long z = (long)fz; // 10L (long)10
// 자동형변환X -> float가 long보다 물리적크기는 작지만 값을 표현하는 범위가 크다
// float 값표현방식에 오차를 허용하는 "부동소주점 방식"을 사용하기 때문
// ()는 형변환연산자 -> 앞에 위치하고 데이터타입이 들어온다
// Math.random()에서 ()는 호출연산자 -> 뒤에 위치하고 값이 들어온다
// 랩퍼타입 8개
Byte a = new Byte((byte)1);
Short b = new Short((short)2);
Integer c = new Integer(3);
Long d = new Long(4L);
Character e = new Character('가');
Float f = new Float(3.14);
Double g = new Double(3.12);
Boolean h = new Boolean(true);
Integer c2 = 3; // auto boxing 기본타입을 참조타입으로 자동 변환
int x = c2; // auto unboxing 참조타입으로 기본타입으로 자동 변환
int y = Integer.parseInt("777");
// String- (참조타입형변환) -> Integer -(언박싱)-> int
package onepiece;
import java.util.ArrayList;
public class Pirate {
public String name;
public String nickName;
public char gender; // 'M'/'F' 출력시 남여이미지
public String birth;
public int age;
public int height;
public ArrayList<String> hobby; // ★★★★★
public String blood;
public String country;
public long money;
public String group; // 해적(소속)
public boolean isDevilFruit; // 악마의열매 섭취유무, 출력시 이미지
// ArrayList<int> a ; 불가능
// ArrayList<Integer> a; 가능
}
/*
ArrayList<Pirate> list = new ArrayList<Pirate>();
Pirate p = new Pirate();
p.name = "홍길동";
p.hobby = new ArrayList<String>();
p.hobby.add("야구");
p.hobby.add("클라이밍");
list.add(p);
// 읽기
System.out.println(list.get(0).name);
System.out.println(list.get(0).hobyy[1]);
for(Pirate e : list) {
System.out.println(e.name);
for(String h : e.hobby) {
System.out.println(h);
}
}
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.ArrayList" %>
<%@ page import="onepiece.Pirate" %>
<%
// 원칙은 RDBMS(오라클, MySQL(MariaDB), MSSQL)에서 데이터를 불러와서
// 코드상에서 사용가능한 형태(ArrayList<Pirate>)로 변경
// ArrayList 생성
ArrayList<Pirate> list = new ArrayList<Pirate>();
// Pirate 객체를 20개 생성
// 해적1
Pirate p1 = new Pirate();
p1.name ="몽키 D. 루피";
p1.nickName = "밀짚모자";
p1.gender = 'M';
p1.birth = "5월 5일";
p1.age = 19;
p1.height = 174;
p1.hobby = new ArrayList<String>(); // hobby도 ArrayList이기 때문에 초기화 후 값 입력
p1.hobby.add("모험");
p1.hobby.add("잔치");
p1.blood = "F형 (B형)";
p1.country = "이스트 블루 고아 왕국 후샤 마을";
p1.money = 3000000000L;
p1.group = "밀짚모자 일당";
p1.isDevilFruit = true;
list.add(p1);
// 해적2
Pirate p2 = new Pirate();
p2.name = "롤로노아 조로";
p2.nickName = "해적 사냥꾼";
p2.gender = 'M';
p2.birth = "11월 11일";
p2.age = 21;
p2.height = 181;
p2.hobby = new ArrayList<String>();
p2.hobby.add("음주");
p2.hobby.add("수행");
p2.blood = "XF형 (AB형)";
p2.country = "이스트 블루 시모츠키 마을";
p2.money = 1111000000L;
p2.group = "밀짚모자 일당";
p2.isDevilFruit = false;
list.add(p2);
// 해적3
Pirate p3 = new Pirate();
p3.name = "나미";
p3.nickName = "도둑고양이";
p3.gender = 'F';
p3.birth = "7월 3일";
p3.age = 20;
p3.height = 170;
p3.hobby = null;
p3.blood = "X형 (A형)";
p3.country = "이스트 블루 오이코트 왕국";
p3.money = 360000000L;
p3.group = "밀짚모자 일당";
p3.isDevilFruit = false;
list.add(p3);
// 해적4
Pirate p4 = new Pirate();
p4.name = "우솝";
p4.nickName = "저격의 제왕";
p4.gender = 'M';
p4.birth = "4월 1일";
p4.age = 19;
p4.height = 176;
p4.hobby = null;
p4.blood = "S형 (O형)";
p4.country = "이스트 블루 시롭 마을";
p4.money = 500000000L;
p4.group = "밀짚모자 일당";
p4.isDevilFruit = false;
list.add(p4);
// 해적5
Pirate p5 = new Pirate();
p5.name = "빈스모크 상디";
p5.nickName = "검은 다리";
p5.gender = 'M';
p5.birth = "3월 2일";
p5.age = 21;
p5.height = 180;
p5.hobby = null;
p5.blood = "Rh-S형 (Rh-O형)";
p5.country = "노스 블루 제르마 왕국";
p5.money = 1032000000L;
p5.group = "밀짚모자 일당";
p5.isDevilFruit = false;
list.add(p5);
// 해적6
Pirate p6 = new Pirate();
p6.name = "토니토니 쵸파";
p6.nickName = "솜사탕광";
p6.gender = 'M';
p6.birth = "12월 24일";
p6.age = 17;
p6.height = 90;
p6.hobby = null;
p6.blood = "X형 (A형)";
p6.country = "위대한 항로 사쿠라 왕국(구 드럼 왕국)";
p6.money = 1000L;
p6.group = "밀짚모자 일당";
p6.isDevilFruit = true;
list.add(p6);
// 해적7
Pirate p7 = new Pirate();
p7.name = "니코 로빈";
p7.nickName = "악마의 아이";
p7.gender = 'F';
p7.birth = "2월 6일";
p7.age = 30;
p7.height = 188;
p7.hobby = null;
p7.blood = "S형 (O형)";
p7.country = "웨스트 블루 오하라";
p7.money = 930000000L;
p7.group = "밀짚모자 일당";
p7.isDevilFruit = true;
list.add(p7);
// 해적8
Pirate p8 = new Pirate();
p8.name = "커티 프람";
p8.nickName = "프랑키";
p8.gender = 'M';
p8.birth = "3월 9일";
p8.age = 36;
p8.height = 240;
p8.hobby = null;
p8.blood = "XF형 (AB형)";
p8.country = "사우스 블루";
p8.money = 390000000L;
p8.group = "밀짚모자 일당";
p8.isDevilFruit = false;
list.add(p8);
// 해적9
Pirate p9 = new Pirate();
p9.name = "브룩";
p9.nickName = "소울 킹";
p9.gender = 'M';
p9.birth = "4월 3일";
p9.age = 90;
p9.height = 277;
p9.hobby = null;
p9.blood = "X형 (A형)";
p9.country = "웨스트 블루";
p9.money = 383000000L;
p9.group = "밀짚모자 일당";
p9.isDevilFruit = true;
list.add(p9);
// 해적10
Pirate p10 = new Pirate();
p10.name = "징베";
p10.nickName = "바다의 협객";
p10.gender = 'M';
p10.birth = "4월 2일";
p10.age = 46;
p10.height = 301;
p10.hobby = null;
p10.blood = "F형 (B형)";
p10.country = "용국 왕국 어인가";
p10.money = 1100000000L;
p10.group = "밀짚모자 일당";
p10.isDevilFruit = false;
list.add(p10);
// 해적11
Pirate p11 = new Pirate();
p11.name = "샹크스";
p11.nickName = "빨간 머리";
p11.gender = 'M';
p11.birth = "3월 9일";
p11.age = 39;
p11.height = 199;
p11.hobby = new ArrayList<String>();
p11.hobby.add("방랑");
p11.blood = "XF형";
p11.country = "웨스트 블루 갓 밸리";
p11.money = 4048900000L;
p11.group = "사황";
p11.isDevilFruit = false;
list.add(p11);
// 해적12
Pirate p12 = new Pirate();
p12.name = "마샬 D.티치";
p12.nickName = "검은 수염";
p12.gender = 'M';
p12.birth = "8월 3일";
p12.age = 40;
p12.height = 344;
p12.hobby = new ArrayList<String>();
p12.hobby.add("도박(겜블링)");
p12.hobby.add("역사 탐구");
p12.blood = "F형";
p12.country = "위대한 항로";
p12.money = 3996000000L;
p12.group = "사황";
p12.isDevilFruit = true;
list.add(p12);
// 해적13
Pirate p13 = new Pirate();
p13.name = "마르코";
p13.nickName = "불사조";
p13.gender = 'M';
p13.birth = "10월 5일";
p13.age = 45;
p13.height = 203;
p13.hobby = new ArrayList<String>();
p13.hobby.add("바의 코스터 수집");
p13.blood = "X형";
p13.country = "위대한 항로";
p13.money = 1374000000L;
p13.group = "흰 수염 해적단";
p13.isDevilFruit = true;
list.add(p13);
// 해적14
Pirate p14 = new Pirate();
p14.name = "카타리나 데본";
p14.nickName = "초승달 헌터";
p14.gender = 'F';
p14.birth = "3월 29일";
p14.age = 36;
p14.height = 361;
p14.hobby = null;
p14.blood = "F형";
p14.country = "사우스 블루";
p14.money = 0L;
p14.group = "검은 수염 해적단";
p14.isDevilFruit = true;
list.add(p14);
// 해적15
Pirate p15 = new Pirate();
p15.name = "샬롯 링링";
p15.nickName = "빅맘 ";
p15.gender = 'F';
p15.birth = "2월 15일";
p15.age = 68;
p15.height = 880;
p15.hobby = new ArrayList<String>();
p15.hobby.add("다과회, 진귀한 동물수집");
p15.blood = "X형";
p15.country = "위대한 항로";
p15.money = 4388000000L;
p15.group = "빅 맘 해적단";
p15.isDevilFruit = true;
list.add(p15);
// 해적16
Pirate p16 = new Pirate();
p16.name = "크로커다일";
p16.nickName = "사막의 왕";
p16.gender = 'M';
p16.birth = "9월 5일";
p16.age = 46;
p16.height = 253;
p16.hobby = null;
p16.blood = "S";
p16.country = "위대한 항로";
p16.money = 1965000000L;
p16.group = "크로스 길드";
p16.isDevilFruit = true;
list.add(p16);
// 해적17
Pirate p17 = new Pirate();
p17.name = "카이도";
p17.nickName = "백수";
p17.gender = 'M';
p17.birth = "5월 1일";
p17.age = 59;
p17.height = 710;
p17.hobby = null;
p17.blood = "F형";
p17.country = "위대한 항로 보드카 왕국";
p17.money = 4611100000L;
p17.group = "백수 해적단";
p17.isDevilFruit = true;
list.add(p17);
// 해적18
Pirate p18 = new Pirate();
p18.name = "보아 행콕";
p18.nickName = "해적여제";
p18.gender = 'F';
p18.birth = "9월 2일";
p18.age = 31;
p18.height = 191;
p18.hobby = null;
p18.blood = "S형";
p18.country = "캄벨트 여인섬 아마존 릴리";
p18.money = 1659000000L;
p18.group = "구사 해적단";
p18.isDevilFruit = true;
list.add(p18);
// 해적19
Pirate p19 = new Pirate();
p19.name = "피셔 타이거";
p19.nickName = "노예해방의 영웅";
p19.gender = 'M';
p19.birth = "11월 5일";
p19.age = 48;
p19.height = 520;
p19.hobby = null;
p19.blood = "Rh-S형";
p19.country = "용국 왕국 어인가";
p19.money = 230000000L;
p19.group = "태양 해적단";
p19.isDevilFruit = false;
list.add(p19);
// 해적20
Pirate p20 = new Pirate();
p20.name = "유스타스 키드";
p20.nickName = "유스타스 '캡틴'키드";
p20.gender = 'M';
p20.birth = "1월 10일";
p20.age = 23;
p20.height = 205;
p20.hobby = new ArrayList<String>();
p20.hobby.add("음악 감상");
p20.hobby.add("무기 수집");
p20.blood = "F형";
p20.country = "사우스 블루";
p20.money = 3000000000L;
p20.group = "최악의 세대";
p20.isDevilFruit = true;
list.add(p20);
// 디버깅
System.out.println(list.size() + "<-- list.size()");
%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>onepiece.jsp</title>
<style>
table, th, td {
border: 1px solid #808080;
}
table {
border-collapse: collapse;
text-align: center;
}
th {background-color: #D5D5D5;}
</style>
</head>
<body>
<h1>등장인물 리스트</h1>
<!-- 리스트 작성 -->
<table>
<tr>
<th>이름</th>
<th>이명</th>
<th>성별</th>
<th>생일</th>
<th>나이</th>
<th>신장</th>
<th>취미</th>
<th>혈액형</th>
<th>출생지</th>
<th>현상금</th>
<th>소속</th>
<th>능력자</th>
</tr>
<%
for(Pirate p : list) {
// list에 추가한 Pirate타입의 수만큼 tr(행)을 반복하여 출력한다 (행의 합 = 레코드셋)
%>
<tr>
<td><%=p.name%></td>
<td><%=p.nickName%></td>
<td> <!-- 성별에 따라 이미지 출력 -->
<%
if(p.gender == 'M') {
%>
<img src="./image/man.png" width="50" height="50">
<%
} else {
%>
<img src="./image/woman.png" width="50" height="50">
<%
}
%>
</td>
<td><%=p.birth%></td>
<td><%=p.age%>세</td>
<td><%=p.height%>cm</td>
<td>
<%
// hobby가 null이 아닌 경우에만 출력
if(p.hobby != null) {
int cnt = 1; // cnt는 for문에서 사용되기 때문에 for문 밖에서 변수 선언
for(String h : p.hobby) {
%>
<%=h%>
<%
// cnt가 hobby수보다 작으면 쉼표 찍고 cnt는 1씩 증가
if(cnt<p.hobby.size()) {
%>
,
<%
}
cnt = cnt + 1;
}
}
%>
</td>
<td><%=p.blood%></td>
<td><%=p.country%></td>
<td>
<%
if(p.money!=0) {
%>
<%=p.money%>베리
<%
} else {
%>
<%
}
%>
</td>
<td><%=p.group%></td>
<td>
<%
if(p.isDevilFruit==true) {
%>
<img src="./image/devilfruit.png" width="50" height="50">
<%
} else {
%>
<img src="./image/no.png" width="50" height="50">
<%
}
%>
</td>
</tr>
<%
}
%>
</table>
</body>
</html>
// 검색조건에 따라 필터링된 list2를 생성
ArrayList<Pirate> list2 = new ArrayList<Pirate>();
// 요청값 디버깅
System.out.println(request.getParameter("gender"));
System.out.println(list2.size() + "<--list2.size");
char gender = ' '; // gender의 초기값 = 공백 // 페이지를 호출했을 때 첫 페이지
// gender가 경우의 수 3개 : 공백, M, F
// gender가 null이 아니거나 공백이 아닐 때
if(request.getParameter("gender") != null) {
gender = request.getParameter("gender").charAt(0); // 요청값의 첫번째 문자를 gender변수에 넣는다
}
// gender ' ' or 'M' or 'F'
/*
if(gender == ' ') {
list2 = list;
} else if (gender =='M') {
for(Pirate p : list) {
if(p.gender == 'M')
list2.add(p);
}
} else { // gender = 'F'
for(Pirate p : list) {
if(p.gender == 'F')
list2.add(p);
}
*/
if(gender == ' ') {
list2 = list;
} else {
for(Pirate p : list) {
if(p.gender == gender) {
list2.add(p);
}
}
}
// gender가 경우의 수가 4개인 경우
/*
gender가 null이 아니거나 공백이 아닐 때
if(request.getParameter("gender") != null ||
!request.getParameter("gender").equals("")) {
gender = request.getParameter("gender").charAt(0);
}
*/
<h1>등장인물 리스트</h1>
<!-- 필터 -->
<form action="./onepiece.jsp" method="post"> <!-- action을 안적으면 자기자신 호출 -->
<select name="gender"> <!-- 경우의 수 3가지: null, M, F -->
<!-- <option value="">:::성별선택:::</option> --> <!-- 공백의 경우의 수 추가 -->
<option value="M">남자</option>
<option value="F">여자</option>
</select>
<div>
<button type="submit">검색</button>
</div>
</form>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<!-- CSS적용 순서는 inline->internal->external(부트스트랩) -->
<!-- Latest compiled and minified CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/css/bootstrap.min.css" rel="stylesheet">
<!-- .min빼면 원래 파일 -->
<!-- Latest compiled JavaScript -->
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.3/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container-fluid">
<table class="table table-striped">
<thead>
<tr>
<th class="x">이름</th>
<th>성별</th>
<th>나이</th>
</tr>
<thead>
<tbody>
<%
for(Person p : list) { // 군집 개별요소 : 군집 -> list.size 만큼 반복
%>
<tr>
<td><%=p.name%></td>
<td><%=p.gender%></td>
<td><%=p.age%></td>
</tr>
<%
}
%>
</tbody>
</table>
<div class="row">
<div class="col-sm-6">
<h1>첫번째 제목</h1> <!-- h1은 블록태그이지만 css적용으로 2단으로 나눠짐 -->
</div>
<div class="col-sm-6">
<h1>두번째 제목</h1>
</div>
</div>
</div>
</body>
</html>