오늘의 후기
나는 국가 상담에 갔다.
지난주에 강사님께 상담을 받으러 가겠다고 했을 때,
강사님이 진돗개 걱정은 안해도 된다고 하셔서…
…
강사님이 모르시는건지…
너무 슬퍼…
오늘의 내용을 정말 이해하지 못했습니다.
힘내자 예은아…
하아…..
구디아 아카데미 교육 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>