본문 바로가기
백엔드/자바

자바-3

by study_yeon 2023. 5. 1.

2023.04.28.

1교시 

* 1주차 퀴즈(첨부 파일)


2교시 

 

* 주사위 문제를 만들기 위한 시나리오 작성 
- 주사위를 던져서 나오는 수(주사위 2개 - 컴퓨터, 나)
- 큰 수가 나오면 이김( 비교연산자-조건문(반복문) )
- 메세지 등 시안 생각하기 - 출력 내용 (view)
- 긴 문장은 변수에 담기(뷰에서 표현한 데이터를 변수를 통해 고쳐야 함-mvc)
- 난수 이용하기 (Random)
- 게임 반복하기(계속 하시겠습니까?)

1. 프로젝트 만들기 
- 앞으로 프로젝트는 일자로 설정할 것임 

- 프로젝트 이름  : 2023.04.28

- 모듈은 체크하지 않기(수업용)

이런 내용이 뜬다면 Remember~~ 체크해서 다시는 안뜨게 설정


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주차 퀴즈.txt
0.00MB


* 날짜를 가지고오는 두가지 방법
1. 달력 cal
2. 컴퓨터의 달력 System.currentTimeMillis()

 

 

'백엔드 > 자바' 카테고리의 다른 글

자바 - 6  (0) 2023.05.03
자바-5  (0) 2023.05.02
자바-4  (0) 2023.05.01
자바-2  (0) 2023.04.27
자바-1  (0) 2023.04.26