(구디아 아카데미) 23.04.17 자바 교육 (9일차)

오늘의 후기

나는 국가 상담에 갔다.

지난주에 강사님께 상담을 받으러 가겠다고 했을 때,

강사님이 진돗개 걱정은 안해도 된다고 하셔서…

강사님이 모르시는건지…

너무 슬퍼…

오늘의 내용을 정말 이해하지 못했습니다.

힘내자 예은아…

하아…..


구디아 아카데미 교육 9일차

  • 1. 컴퓨터 언어
  • 2. 기본 API, 캘린더 기능 사용
  • 3. (과제) 뒤집힌 달력 만들기 (+난이도)

1. 컴퓨터 언어

– 객체 지향(함수 내부)
현실판. 객체 안에 함수를 넣습니다. 게임에서 많이 사용
– 기능 지향(기능 외부)
수학, 과학, 빅데이터, 인공지능

컴퓨터 언어: 데이터(값, 이진법) + 함수(산술, 함수)
: 숫자(1, 3, 10, …), 내부적으로 매핑된 문자(‘A’, ‘B’, ‘A’), 논리값 매핑(true, false)
계산(피연산자의 종류가 같아야 함) : +, -, *, /, %, <, >&&, ||, …
변하기 쉬운 : 값을 저장하고 재사용(호출)하기 위해 대입 연산자(=(오른쪽을 왼쪽에 넣기), +=)
내가 가진 것은 주소 값만 있어야 하는데, 사실 기본형은 객체지향에 반대한다. 빠르기 때문에 그대로 두었습니다.

기본 유형(단일 데이터 값, 스칼라) 대 참조 유형(다중 데이터 값, 세트, ​​벡터)

기본형(데이터형) : 변수와 ​​값의 범위가 일치해야 합니다. (소를 집에 넣으려면 둘 공간이 있어야 하듯이)
바이트(1바이트 나누기 256 -158 ~ 157),
short (int. 2 billion…?의 정수 부분은 int. 2 바이트 512 -2의 16제곱에서 2의 16제곱에서 빼기 제거되었습니다.)
int (4byte -20억 ~ (0 제외) 20억)
롱(8바이트)
float(4byte), double(8byte) 부동 소수점 처리는 실수를 표현하는 데 사용됩니다. double은 오류가 발생하기 쉽습니다.
char(2byte) 어떤 영어를 쓰든
boolean(true, false)(4byte) –> 데이터 값이 변수에 저장됩니다.

Wrapper형(byte부터 boolean까지 다 있음) 사실 기본형처럼 저장되지만 메모리 모양은 참조형이다.
정수 x = 10; | 정수 x = 래퍼 유형. x 포인트가 10인 곳.

참조 유형(배열, 클래스)

배열: 동일한 데이터 유형의 여러 데이터 값 집합, 배열 참조 변수 -> 인덱스, 연산자() -> 개별 값에 대한 액세스
String() 이름 = new String(3); names(2)=’홍길동’;

클래스(1): 사용자 정의 유형, 여러 데이터 유형이 있는 데이터 값 집합, 개체 참조 변수 -> 필드(멤버 변수) 이름, .operator -> 개별 값
사람 p = 새 사람(); p.name=”홍길동”;

클래스 (2): 메서드 정의가 있는 사양

방법: 클래스 내부에 정의된 함수

입력값을 받아 함수를 실행하고 반환값을 남기는 표현식 -> 연산자

*Java에는 클래스 외부에 선언된 함수가 없습니다.

일반 방법 대 정적 방법
일반 방법: A = 새로운 A(); (생략 가능)

JSP는 Tomcat에 의해 Java 코드로 변환됩니다. 요청 요청 = 새 요청
요구. getParameter(); 일반 메서드로 만들려면 소문자로 만드세요.
정적 방법 : 객체를 생성할 필요가 없습니다. A.test(); (클래스 이름으로 호출)

제어문

코드 실행문을 읽는 순서: up -> down down -> up

제어문 가능: 분기문(조건문, if, switch, try… catch), 루프문(반복문, while, for, foreach))

네이티브 라이브러리(API), 외부 라이브러리(API)

2. 기본 API, 캘린더 기능 사용

클래스 이름: 대문자.

변수 이름: 소문자.
영문 이름 2개 추가 시 : 두 번째 단어는 대문자로 표기합니다.
정적 최종 필드: 대문자. (두 글자를 대문자로 표기할 수 없는 경우 _underscore 사용)

변수: 여자친구
클래스 낙타: 여자 친구
정적 필드: GIRL_FRIEND

* a.jsp가 생성되면 Tomcat은 언어를 java로 변경하여 Java를 실행합니다.
* A.Jsp.java: 인공

* a_jsp.java : 기계로 만든 것




ex2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.util.Calendar" %>
<%
	//Calendar c = new Calendar(); 이건 안됨. 문법적으로 왜 안되는지는 나중에... 추상 클래스 관련... 
	Calendar c = Calendar.getInstance(); //static method 처럼. 자바 디자인 패턴. (고프? 디자인 패턴...?)


	String yoil = "";
	switch(c.get(Calendar.DAY_OF_WEEK)){
	case 1:
		yoil = "일";
		break;
	case 2:
		yoil = "월";
		break;
	case 3:
		yoil = "화";
		break;
	case 4:
		yoil = "수";
		break;
	case 5:
		yoil = "목";
		break;
	case 6:
		yoil = "금";
		break;
	default:
		yoil = "토";
		//break; 마지막은 break 필요X
	}

%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

	<div>Calendar.getInstance : <%=c%></div>
	<!--  <div>Year : <%//c.get(1) %></div> -->
	
	<div>Year : <%=c.get(Calendar.YEAR)%></div>
	<div>Month : <%=c.get(Calendar.MONTH)%>(읽는 사람이 +1해서 읽어야됨.)</div>
	<div>Date : <%=c.get(Calendar.DATE)%></div>
	<div>이번주에 몇번째 날 : <%=c.get(Calendar.DAY_OF_WEEK)%></div> 주일이 첫번째날이라.
	<div>요일 : <%=yoil %></div>
	class Calendar {
	public static int YEAR = 1; }
	
	<!--캘린더 get이라는 메소드에 1을 넣어주면 년도만 리턴 시킴. 상수는 어렵게 만듦.-->
	<div>현재달의 마지막 날짜 : <%=c.getActualMaximum(Calendar.DATE)%></div>
</body>
</html>

삼. (과제)뒤집힌 달력 만들기 (+어려움)

과제

1) 부트스트랩 스타일

2) 선데이 컬러 RED

3) 날짜 클릭 시 일정 입력 창으로 이동

4) 첫날 이전 날짜는 회색으로, 마지막 날 이후 날짜는 회색으로 표시

임무는 분명했다



내 결과는 비참했습니다.




‘달력 3번의 마지막 날짜를 출력한 후 공백의 갯수(td)’부터 이해가 되지 않았습니다.

왜 7에서 빼..?

달력.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import = "java.util.Calendar" %>
<%
	//몇년 몇월 달력인지 받기
	int targetYear = 0; //몇년 받기
	int targetMonth = 0;//몇월 받기
	
	//변하는 년/달의 값을 변수로 설정.
	//Integer로 값이 넘어와야되니까, 무조건 둘 중 하나라도 null값이면 안된다.
	if(request.getParameter("targetYear") == null
			|| request.getParameter("targetMonth") == null){
		Calendar today = Calendar.getInstance();
		targetYear = today.get(Calendar.YEAR); //요청한 날짜가 없으니까 일단 오늘로 설정.
		targetMonth = today.get(Calendar.MONTH);
		
	} else { //아니면, 사용자가 클릭했을 때 년도와 월을 받아오기.
	 targetYear = Integer.parseInt(request.getParameter("targetYear")); 
	 targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
	 
		 //누르면 바뀌는 달력을 만들고 싶은데, 바뀌는 경우는 2가지밖에 없다.
		 //(1) 1월->12월로 갈 때
			 if(targetMonth == -1){ //0이 1월이니까, 이전달로 가려면 -1을 해야 11(실제 12월)이 된다.
				 targetMonth = 11; //실제 보여지는 값: 12월
				 targetYear = targetYear - 1; //년도도 함께 감소시켜라.
				 
		 //(2) 12월->1월로 갈 때
			 } else if(targetMonth == 12) { //11이 12월이니까, 다음달로 가려면 11 + 1 => 13(실제 1월)으로 넘어가야 된다.
				 targetMonth = 0; //실제 보여지는 값: 1월
				 targetYear = targetYear +1; //년도도 함께 증가시켜라.
			 }
	}
	
		// http://localhost/ex17/calendar.jsp?targetYear=2023&targetMonth=11
		// http://localhost/ex17/calendar.jsp
		
		// 디버깅 코드: 중간중간 확인하는 것. (코드 다 만들고 적지 말 것.)
		System.out.println(targetYear + "<-- targetYear");
		System.out.println(targetMonth + "<-- targetMONTH");
	   
       //앞에 공백(회색)이 몇칸인지 어떻게 알까? 1일이 언제있는지 알면 된다.
	   // 현재 월의 1일 구하기. 첫째 행. DAY_OF_WEEK(일 1, 월 2, ... 토 7 ) - 1/ 공백의 수는 6개
	   int startTdBlank = 0; //초기화를 시킨다.
	   
	   // 요일에 맞게 1일을 맞춰줘야 한다.(시작 값을 변경)
	   // 출력하고자 하는 년/월/1일
	   Calendar firstDate = Calendar.getInstance(); //오늘 날짜가 나옴.
	   //set으로 targetYear와 targetMonth로 값을 변경.
	   firstDate.set(Calendar.YEAR, targetYear); //사용자가 누른 년도를 Calendar.getInstance로 가져온 YEAR에 저장.
	   firstDate.set(Calendar.MONTH, targetMonth); //사용자가 선택하는 달을 Calendar.getInstance로 가져온 Month에 저장.
	   firstDate.set(Calendar.DATE, 1); //DATE는 모든 달이 1일부터 시작하니까 무조건 1이어야 됨.
	   
	   //1. 달력 첫날짜 출력 전, 공백(td) 수
	   startTdBlank = firstDate.get(Calendar.DAY_OF_WEEK) - 1; //7-1 해서 공백이 6이 돼야, 4월 1일이 토요일부터 시작됨.
	   System.out.println(startTdBlank + " <-- startTdBlank");
	   
	   //2. 출력하고자 하는 년/월/마지막날짜
	   int endDateNum = firstDate.getActualMaximum(Calendar.DATE);//getActualMaximum : 이 날짜가 가지고 있는 데이터 값 중에 제일 큰 날짜.
	   System.out.println(endDateNum + " <-- endDateNum");
	   
	   //3. 달력 마지막날짜 출력후 공백(td) 수 
	   int endTdBlank = 0; //변수 초기화
	   if((startTdBlank + endDateNum) % 7 != 0) { //공백+검정글자 나누기 7 해서 남는 게 0
	      endTdBlank = 7-((startTdBlank + endDateNum)%7);
	   }
	   //4. 총 42셀이 될 수 있도록
	   int totalTdCnt = startTdBlank + endDateNum + endTdBlank;
	   System.out.println(totalTdCnt + "<--tdtalTdCnt");
%>

<!--  targetYear -->

<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<!-- 부트스트랩5 사용 -->
	<!-- Latest compiled and minified CSS -->
	<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
	<!-- Latest compiled JavaScript -->
	<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container">
	<h1>
		<a href="./calendar.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth-1%>">이전달</a>
		<%=targetYear %>년 <%=targetMonth+1%>월
		<a href="./calendar.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth+1%>">다음달</a>
	</h1>
	<table class="table table-striped"> <!-- 검정색 테이블로 만들기 -->
		<thead>
			<tr>
				<th>일</th>
				<th>월</th>
				<th>화</th>
				<th>수</th>
				<th>목</th>
				<th>금</th>
				<th>토</th>
			</tr>
		</thead>

		<tr>
			<%
				for(int i=0; i<totalTdCnt; i++){
					if(i%7==0){ //7일마다 개행해라.
			%>
						</tr><tr>
			<%			
					} 
					//숫자마다 링크연결
					int dateNum = i - startTdBlank + 1;	//시작하는 날짜.
					if(dateNum > 0 && dateNum <= endDateNum){ //1부터 마지막일까지 출력
						if(i%7==0){
			%>
						<td class="text-danger">
							<a href="./diary.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth%>&targetDate=<%=dateNum%>"><%=dateNum%></a>
						</td>
			<%				
							//out.print(dateNum);
						} else if(i%7==6){
			%>
						<td class="text-primary">
							<a href="./diary.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth%>&targetDate=<%=dateNum%>"><%=dateNum%></a>
						</td>
			<%		    
						} else {
			%>
						<td class="text-dark">
							<a href="./diary.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth%>&targetDate=<%=dateNum%>"><%=dateNum%></a>
						</td>
			<%	
						} 
			  		} else if(dateNum < 1){
			 %>
			 			<td class="text-secondary">
			 				<%=endDateNum + dateNum%>
			 			</td>
			 <% 			
			  		} else{
			 %>
			 			<td class="text-secondary">
			 				<%=dateNum - endDateNum%>
			 			</td>
			 			
			 <%			
			  		}
				}
			%>
		</tr>
	</table>
</div>
</body>
</html>

일기.jsp



<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%
			int targetYear = Integer.parseInt(request.getParameter("targetYear"));
			int targetMonth = Integer.parseInt(request.getParameter("targetMonth"));
			int targetDate = Integer.parseInt(request.getParameter("targetDate"));
%>
<!DOCTYPE html>
<html>
<head>
	<meta charset="UTF-8">
	<title>Insert title here</title>
	<!-- 부트스트랩5 사용 -->
	<!-- Latest compiled and minified CSS -->
	<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet">
	<!-- Latest compiled JavaScript -->
	<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js"></script>
</head>
<body>
<div class="container">
	<form action="./calendar.jsp?targetYear=<%=targetYear%>&targetMonth=<%=targetMonth%>&targetDate=<%=targetDate%>" method="post">
		<table>
			<tr>
				<h1><%=targetYear%>년 <%=targetMonth + 1%>월 <%=targetDate %>일</h1>
			</tr>
			<tr>
				<label for="comment"><h3>다이어리 작성:</h3></label>
				<textarea class="form-control" rows="5" id="comment" name="text"></textarea>
				<button type="submit" class="btn btn-primary">Submit</button>
			</tr>
		</table>
	</form>
</div>
</body>
</html>