[TIL] 구디아카데미 8일차: 형변환, ArrayList, 랩퍼타입, 리스트만들기, 부트스트랩

Mijin·2023년 4월 14일
0

TIL

목록 보기
8/21
post-thumbnail

벌써 구디아카데미에서의 두번째 주가 지났다.
오늘은 어제에 이어 리스트를 만들었는데 앞으로 가장 많이 만들게 되는 것이 리스트라고 하셨다.
아직 배열과 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()에서 ()는 호출연산자 -> 뒤에 위치하고 값이 들어온다

✅ArrayList와 랩퍼(박싱)타입

// 랩퍼타입 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

⌨해적단 리스트 만들기

  • Pirate 클래스 생성
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 {
					%>
							&nbsp;
					<%	
						}
					%>	
				</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>

✅필터링

  • 필터링된 list 생성
	// 검색조건에 따라 필터링된 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);
	}
	*/
  • select 폼 작성
<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>

💪느낀점

  • 리스트는 어제도 만들고 오늘도 만들었지만 여전히 낯설다. 가장 중요한 것은 for문, if문, ArrayList를 잘 사용하는 것인데 처음이라 쉽지 않다. 그래도 계속 하다보면 익숙해지니까 포기하지 말자!
  • 부트스트랩을 처음 사용해봤는데 역시! 전문가들의 손길이 닿으니 보여지는 부분에서 만족감이 크다!!! 디자인이나 미적인 부분에 약하고 CSS를 공부하고 오지 않아서 실습할 때마다 아쉬웠는데 앞으로는 부트스트랩을 적극적으로 활용할 것이다.
profile
개발자로 가는 길 🏃‍♀️

0개의 댓글