2023.04.28.
1교시
* 1주차 퀴즈(첨부 파일)
2교시
* 주사위 문제를 만들기 위한 시나리오 작성
- 주사위를 던져서 나오는 수(주사위 2개 - 컴퓨터, 나)
- 큰 수가 나오면 이김( 비교연산자-조건문(반복문) )
- 메세지 등 시안 생각하기 - 출력 내용 (view)
- 긴 문장은 변수에 담기(뷰에서 표현한 데이터를 변수를 통해 고쳐야 함-mvc)
- 난수 이용하기 (Random)
- 게임 반복하기(계속 하시겠습니까?)
1. 프로젝트 만들기
- 앞으로 프로젝트는 일자로 설정할 것임
- 프로젝트 이름 : 2023.04.28
- 모듈은 체크하지 않기(수업용)
2. 패키지 만들기
- 패키지에서 자바 이름은 못 씀(오라클과 충돌) - web.java는 안 됨.
- 패키지 이름 : web.back
* 패키지
- 같은 목적(종류)을 가진 파일(클래스)
- 내가 만드는 프로그램이 다른 사람이 만든 프로그램과 엮이지 않게 하기 위함(충돌 방지)
- 나만의 도메인(내 소유)를 만들 것
- 소문자로 시작
- (상자가) 햐얗다는 비었다
3. 클래스 만들기
*표기법
- DiceGame(카멜표기법)
- Dice_Game(스네이크 표기법)
-> 영문자, 언더바(_), 숫자 이용
3-1. 코드 작성
- main 함수 (main(작성) + ctrl + space)
- 구현 할 내용 주석으로 작성하기
/*
* 1. 필요한 배우 : 컴퓨터, 나
* 2. 컴퓨터가 낸 주사위 | 내가 낸 주사위
* 가장 큰 수가 나온 사람이 이긴다.
* 3. 임의의 수 : 난수 (간단한 Math 클래스 난수 이용)
* 4. MVC
* 주사위를 던지는 루틴 - 모델(데이터를 데이터베이스에 넘김?)
* 두 주사위를 비교해서 큰 값을 판정하는 판정루틴 - 제어
* 승자를 출력하는 출력루틴 - 뷰
*/
* 난수 발생 방법
- math의 Random 기능 사용하겠다
3교시
* 구체화 : 필요한 모든 것을 표현
추상화 :전체의 일부만 표현
3-1. 코드 작성
1) 변수선언
int com;
int na;
2) 난수 발생
/* Model 부분 = data */
Random ran = new Random(); // 난수 발생 모듈(패키지) 사용, import 작성
int endCount = 3; // 3회까지 진행
String gamePlay; // 계속 게임을 할 것인가 결정하는 변수
- import 누군가 만들어 놓은 모듈(패키지 = 라이브러리)를 해당 클래스에서 사용함 - 패키지 아래 작성 하기
* escape sequence(이스케이프 시퀀스)
- 제어기능을 가짐
- 문자열안에 숨겨진 기능
- 문자열 안에서 조율
- 현재까지 진행하고 기능을 탈출해서 특수한 기능을 수행
- 역슬래시가 나오면 그 뒤에 있는 문자를 상황에 맞게 처리하는 것이다.
\n : 커서를 다음 줄 처음으로 감 - new line
\r : 커서를 현재 줄 처음으로
\t : 현재 위치에 공백문자 4 또는 8자 추가
\v : 커서를 현재 위치에서 수직으로 다음 줄
\' : 현재 문자열 안에 (') 작은 따옴표 추가
\" : 현재 문자열 안에 (") 큰 따옴표 추가
\\ : 이스케이프 시퀀스로 '\' 출력을 못하므로 '\' 출력
* // : 주석과 헷갈리지 않기.
4교시
* 형변환 : 내가 필요한 값을 얻어 옴
- 강제형변환 : 데이터 값 앞에 내가 원하는 형변환을 강제로 넣음
- 암시적 형변환 : 데이터 형이 변환하려는 값보다 작을 때 큰 데이터를 따라감(상속의 개념 string, int)
- object 데이터의 최고 조상
* 난수는 상태임
고로 난수 + 1 , * 1 을 해도 난수임
* 루프
1. 알려진 횟수가 있는 루프 - for문 이용
- forEach를 사용하면 시작과 끝을 조사할 필요가 없음
2. 횟수가 지정되지 않고, 필요할때(참인 경우) 종료 할 수 있는 루프 - while문 이용
* 루프 적용하는 방법
- 프로그램 전체가 반복문(while)에 들어가야함
- 다시 게임을 반복하는 것이지 게임하는 플레이어(com, na)들이 바뀐 것이 아니므로 변수선언 이후 루프 적용
- 난수 발생 모듈도 처음 한 번만 초기화 하면 계속 쓸 수 있으므로 난수 발생 모듈 이 후부터 반복하면 됩니다.
- 게임과 카운팅하는 변수는 별개의 영역
* while문
- 무조건 무한루프를 돌림
- 센티넬 변수가 있으면 외부로 빼낼 수 있음
- continue(루프를 1회만 탈출), break 함수(루프를 완전히 탈출)
3) While문을 통해 루프 돌리기
▷ 게임을 정해진 횟수만큼 진행하기
// 1. 변수 선언
int com;
int na;
/* Model = data */
// 경기 시작 - 난수 발생
Random ran = new Random(); // 난수 발생 모듈(패키지) 사용
/* while의 시작 */
while (true) {
com = ran.nextInt(6) + 1 ; //seed 값 설정
na = ran.nextInt(6) + 1 ;
com = (int)(Math.random() * 6); // 6을 곱해주면 0 <= 난수 < 6, 6 미포함
com = (int)(Math.random() * 6) + 1; // (0 + 1) <= (난수 + 1) < (6 + 1) 정수, 6 포함
na = (int)(Math.random() * 6) + 1;
String gameMsg = ""; // 문자열을 직접 작성하지 않음 (변수에 넣음)
/* 컨트롤러 */
// 경기 판정
if (com == na ) { // 동점일 경우
gameMsg =
"컴퓨터의 주사위 : " + com + "\n" +
"나의 주사위 : " + na + "\n" +
"비겼습니다.\n";
} else if (com > na) { // 컴퓨터가 이김;
gameMsg =
"컴퓨터의 주사위 : " + com + "\n" +
"나의 주사위 : " + na + "\n" +
"패배하셨습니다.\n";
} else if (com < na) { // 내가 이김 else if 생략하지 않기(의미파악에 도움)
gameMsg =
"컴퓨터의 주사위 : " + com + "\n" +
"나의 주사위 : " + na + "\n" +
"승리하셨습니다.\n";
}
/* View */
// 결과판정 출력
System.out.print(gameMsg);
endCount = endCount - 1; // 게임을 끝내기 위한 endCount 1 감소
if (endCount == 0) {
break; // 현재 무한 루프를 끝내라
}
/* while의 끝 */
}
System.out.println("\n### 프로그램 종료 ###");
* \n : 줄바꿈
* if 1개를 case라고 함
- 경계가 분명하고 중첩되지 않는 경우 = case(실행문)
- switch (case) : 하나의 상황에서 여러 케이스에 따라 실행 값이 바뀌는 것
조건 부분에 적합한 부분에서 실행문을 출력
** 다른 곳에서 만들어 놓은 기능 = library
- 이 기능들을 관련있는 것끼리 모아 놓은 방법을 패키지라고함
- 패키지는 import 키워드로 불러온다.
* 라이브러리는 총 3가지 종류가 있다.
- 자바개발키트(=JDK) : 표준라이브러리
- 내가 만든 라이브러리 : 사용자 정의 라이브러리
- 다른 사용자나 회사에서 만든 라이버러리 : 써드파티(third party) 라이브러리
▷ 게임의 종료를 사용자가 정하기
// 1. 변수 선언
int com;
int na;
/* Model = data */
// 경기 시작 - 난수 발생
Random ran = new Random(); // 난수 발생 모듈(패키지) 사용
String gamePlay; // 계속 게임을 할 것인가 결정하는 변수
/* while의 시작 */
while (true) {
com = (int)(Math.random() * 6) + 1; // (0 + 1) <= (난수 + 1) < (6 + 1) 정수
na = (int)(Math.random() * 6) + 1;
String gameMsg = ""; // 문자열을 직접 작성하지 않음 (변수에 넣음)
/* 컨트롤러 */
// 경기 판정
if (com == na ) { // 동점일 경우
gameMsg =
"컴퓨터의 주사위 : " + com + "\n" +
"나의 주사위 : " + na + "\n" +
"비겼습니다.\n";
} else if (com > na) { // 컴퓨터가 이김;
gameMsg =
"컴퓨터의 주사위 : " + com + "\n" +
"나의 주사위 : " + na + "\n" +
"패배하셨습니다.\n";
} else if (com < na) { // 내가 이김 else if 생략하지 않기(의미파악에 도움)
gameMsg =
"컴퓨터의 주사위 : " + com + "\n" +
"나의 주사위 : " + na + "\n" +
"승리하셨습니다.\n";
}
/* View */
System.out.print(gameMsg); // 결과판정 출력
Scanner sc = new Scanner(System.in); // 스캐너: 사용자로부터 입력을 받을 때 사용
System.out.println("게임을 계속 하시겠습니까?(Y / N)"); //사용자에게 안내할 문구 출력
gamePlay = sc.nextLine();
// gamePlay의 값이 "Y" 또는 "y"이면 계속 실행 "N" 또는 "n" 이면 종료
// 문자열 비교 문자열.equals(비교문자열) 사용 : == 와 같은 의미
if (gamePlay.equals("Y") ||
gamePlay.equals("y")) {
continue; // 루프의 처음부터 다시 시작
} else if (gamePlay.equals("n") ||
gamePlay.equals("N")) {
break; // 게임을 그만 끝마침
}
/* while의 끝 */
}
System.out.println("\n### 프로그램 종료 ###");
}
}
* String equal
- 두 값이 같은지 비교
5교시
* 콘솔(결과 창)
* 줄바꿈
\n 과 println은
p 과 br 태그의 차이와 유사함
*스캐너 : 사용자로부터 입력을 받을 때 사용
*스캐너의 위치
- 결과판정 출력 이후
* Scanner 클래스에서 next(); nextLine();의 차이
next(); : 문자열을 입력할 때 처음으로 나오는 화이트스페이스(공백, 탭, 다음 줄 등)
이전 문자열까지만 입력 받음. ex) "안녕하세요 반갑습니다." => "안녕하세요" 만 반환
nextLine(); : 문자열을 입력할 때 "\n" 또는 "\r"로 끝나는 문자열까지 ex) "안녕하세요 반갑습니다" => "안녕하세요 반갑습니다" 반환
* 사용자정의자료형
equals ==
* 명제 - 연산자
그리고 (교집합) - && 두 범위내에서 공통되는 것
혹은, 또는 (합집합) - || (버티컬 바)
* 연산자
-산술연산자
-대소연산자
-부정연산자(참, 거짓 - 명제 ?)
6교시 (주사위 이어서)
* continue : 루프의 처음부터 다시 시작할 때
* break : 끝낼 때
* for
for (초기 값; 조건식; 조건 변화식) {
실행문
}
* while
초기 값
while(조건식){
} 조건변화식
-> for 도 이 구조로 가능
● 숫자의 합 구하기(1~100)
- SumClac 클래스 만들기
- for문 활용
public class SumClac {
public static void main(String[] args) {
// 1 ~ 100까지 더하기
// 변수 선언
int sum = 0; // 더한 값이 없으므로
int i; // 현재 루프를 가르키는 인덱스 변수
for(i=1; i <= 100; i=i+1) {
sum = sum + i; // 변수가 오른쪽에 오면 변수의 저장 값을 읽어라 , 왼쪽 변수의 방에 저장하라
}
System.out.println("1 + ... + 100 =" + sum ); // 출력
}
}
7교시
* 홀수의 합 구하기(1~100)
- OddClac 클래스 만들기
- for문 활용
- if 활용
public static void main(String[] args) {
int sum = 0; // 합계변수 sum
int i = 1; // 루프를 나타내는 인덱스 변수
for (i = 1; i <= 100; i = i + 1) {
// 홀수일 때만 덧셈을 하기(짝수는 통과-pass, continue)
if (i % 2 == 0) { // 나머지 연산자 % 이용하여 짝수 홀수 판별
continue; // 짝수의 경우는 지나감
}
sum = sum + i; // 홀수의 경우 더해줌
}
System.out.println("1 + 3 + ... + 99 =" + sum); // 출력
}
}
* 짝수의 합 구하기
- EvenClac 클래스 만들기
- for문 활용
- if 활용
* 5의 배수의 합 구하기
- 짝수 클래스 이어서
- for문 활용
- if 활용
public class EvenClac {
public static void main(String[] args) {
int i = 1;
int sum = 0;
for ( i = 1; i <= 100; i = i + 1) {
if( i % 2 == 1) { // 홀수의 경우 지나가기
continue;
}
sum = sum + i; // 짝수는 더하기
}
System.out.println("2 + 4 + ... + 100 =" + sum); // 결과
System.out.println("--------------------");
System.out.println("5의 배수의 합");
for(i = 1; i <= 100; i++) {
if(i % 5 == 0) { // 5의 배수는 더하기
sum = sum + i;
} else {
continue; // 나머지는 지나가기
}
}
System.out.println("5 + 10 + ... + 95 + 100 =" +sum); // 결과
}
* long형 정수
long l = 100; // 암시적 형변환 - 작은 자료를 큰 자료에 넣음
long ll = 100L; // 올바른 작성 법, 숫자 끝에 L을 적음
float f = 100;
float ff = 100.0F;
double d = 100; // f or F가 없으면 double형
-> 실수타입(float, double)은 정수타입(byte, short, int 등)으로 자동 변환 되지 않기 때문에 강제 타입변환,
이 경우 소수점 이하 부분이 버려짐
- 자바의 기본자료형은 byte < short < int < long
- long형 변수 = int형 변수 대입에 문제 없음
- int형 변수 = long형 변수 대입 에러(값 유실)
8교시
● print, println의 단점을 개선한 함수 : printf
* System.out.printf("출력할 포맷지정", 인수, 인수, ...);
* 포맷명세자(%문자와 조합 사용)
%d : 정수 10진법
%o : 정수 8진법
%x : 정수 16진법 - css에서 색상 만들 때 활용
%f : 실수형
%s, %S : 문자열(s그대로 출력/ S대문자로 변경되어 출력)
%tY : 년(4자리)
%ty : 년(2자리)
%tm : 월
%td : 일
%tH/ %tM/ %tS : 시/ 분/ 초
System.out.printf("%2$d년 %3$d월 %1$일", 1,1919,3); -> 1919년 3월 1일
$ : 변수의 위치
2$ = 2번째 것(1919)
● System.out.printf 실습
public class PrintfEx {
public static void main(String[] args) {
int i = 100;
System.out.printf("변수 i = %d", i);
System.out.printf("\n%d + %d =" + (i * i), i,i); //변수의 위치만큼 인수가 필요
System.out.println(); // 빈 줄 추가
System.out.println("----------문자열 예제-------------");
String str1 = "abc";
String str2 = "abc";
System.out.printf("첫 번째 문자열 : %s", str1); // 그대로 출력
System.out.printf("\n두 번째 문자열 : %S", str2); // 소문자를 대문자로 출력
System.out.println(); // 빈 줄 추가
double d = 123.456789;
double d1 = 1.23;
double d2 = 33.123;
double d3 = 3.5;
double d4 = 123;
System.out.printf("Double = %.3f\n", d); // 소수점 이하 3자리 출력(반올림)
System.out.printf("%10.3f\n", d1); // 소수점에 나올 숫자가 없으면 0으로 출력
System.out.printf("%10.3f\n", d2);
System.out.printf("%10.3f\n", d3);
System.out.printf("%10.3f\n", d4);
System.out.printf("%010.3f\n", d1); // 오른쪽 정렬
System.out.printf("%-10.3f\n", d2); // 왼쪽 정렬
System.out.printf("%n 날짜 출력해보기 %n");
// Calendar 라이브러리 사용
Calendar cal = Calendar.getInstance();
//new Date() 현재 날짜 구하기
System.out.printf("올해는 %ty년 입니다.%n", new Date());
System.out.printf("올해는 %tY년 입니다.%n", cal);
// 현재시간 출력하기
System.out.printf("%tY년 %tm월 %td일 %tA %tH시 %tM분 %tS초",
cal, cal, System.currentTimeMillis(), cal, cal, cal, cal);
// 라이브러리 사용하지 않고 달력 가져오기
System.out.printf("%tY년 %tm월 %td일 %tA %tH시 %tM분 %tS초",
System.currentTimeMillis(),
System.currentTimeMillis(),
System.currentTimeMillis(),
System.currentTimeMillis(),
System.currentTimeMillis(),
System.currentTimeMillis(),
System.currentTimeMillis());
}
}
* 날짜를 가지고오는 두가지 방법
1. 달력 cal
2. 컴퓨터의 달력 System.currentTimeMillis()