본문 바로가기

수업내용

[Day8][Java] 가위바위보 게임 / 숫자 맞히는 게임 / 레이블 / 배열 / 확장된 for문 / Random / 로또 당첨번호 / 버블 정렬

Day7에서 한 가위바위보 게임을 이어서 만들어보자.

 

pcNum

userNum

1

1 or 2 or 3

2

1 or 2 or 3

3

1 or 2 or 3

 

 

 

int pcNum = (int)(Math.random()*(3-1+1))+1;
				String result = "";

				// 사용자가 이긴 경우
				if((pcNum==1 && userNum==2) ||
				   (pcNum==2 && userNum==3) ||
				   (pcNum==3 && userNum==1)) {
					result = ">>> 사용자님이 이겼습니다.\n";
				}
				// 사용자가 진 경우
				else if((pcNum==2 && userNum==1) ||
				   (pcNum==3 && userNum==2) ||
				   (pcNum==1 && userNum==3)) {
					result = ">>> 사용자님이 졌습니다.\n";
				}
				
				// 사용자와 컴퓨터가 비긴 경우
				else {
					result = ">>> 비겼습니다.\n";
				}
				System.out.println(result);

 

 

 


 

 

 

컴퓨터가 내는 값이 무엇인지 알 수 있도록 나타내 보자.

 

 

 

 

String pcNumStr="";
				if(pcNum==1) {
					pcNumStr = "가위";
				}
				else if(pcNum==2) {
					pcNumStr = "바위";
				}
				else{
					pcNumStr = "보";
				}
				
				System.out.println("\n컴퓨터는" + pcNumStr + "을 냈습니다.");

 

 

 

-- pcNumd은 정수만 들어갈 수 있으므로 String pcNumStr를 선언하여 각 숫자마다 가위, 바위, 보를 출력할 수 있도록 바꾸어 준다.

 

 


 

 

숫자를 맞히는 게임을 만들어 보자.

 

 

 

 

import java.util.Scanner;

public class MainBingo {

	public static void main(String[] args) {
			// 컴퓨터가 1~100까지 중 랜덤하게 생성한 숫자 한 개 맞추기 게임

		Scanner sc = new Scanner(System.in);

		int randNum = (int) (Math.random() * (100 - 1 + 1)) + 1;
		int userCnt = 0;
		do {
			System.out.println(">> 1부터 100까지 중 숫자 하나를 입력하세요 ==> ");
			int userNum = 0;
			try {
				userNum = Integer.parseInt(sc.nextLine());
			} catch (NumberFormatException e) {
				System.out.println(">> 숫자만 입력하세요. 다시 처음부터 게임을 시작합니다.");
				userCnt = 0;
				continue;
			}

			if (randNum < userNum) {
				userCnt++;
				System.out.println(">> " + userNum + "보다 작습니다.");
			} else if (randNum > userNum) {
				userCnt++;
				System.out.println(">> " + userNum + "보다 큽니다.");
			} else {
				userCnt++;
				System.out.println(">> BINGO! " + userCnt + "번 만에 맞추었습니다.");
				break;
			}

		} while (true);

		sc.close();
		System.out.println("== 프로그램 종료 ==");
	}
}

 

 

 

 


 

 

다시 시작할 때 랜덤 값을 다시 설정해야 count가 제대로 된다.

 

 

 

 

try {
		userNum = Integer.parseInt(sc.nextLine());
	} catch (NumberFormatException e) {
		System.out.println(">> 숫자만 입력하세요. 다시 처음부터 게임을 시작합니다.");
		randNum = (int) (Math.random() * (100 - 1 + 1)) + 1;   // 랜덤 값 다시 설정
		userCnt = 0;
		continue;
	}

 

 

 


 

질문 ▷▷ 레이블을 사용하여 break; 하기

-- 레이블명 뒤에 : 을 붙이며 반드시 반복문 앞에 써야 한다.

 

 

 

 

for(int i=0; i<10; i++) {		// 10행
			for(int j=0; j<5; j++) {	// 5열
				if(i==2 && j==2) break;
				System.out.print("["+i+","+j+"]");
			}
			System.out.println("");
		}

 

 

 

 

 

 


 

 

 

outer:
		for(int i=0; i<10; i++) {		// 10행
			for(int j=0; j<5; j++) {	// 5열
				if(i==2 && j==2) break outer;
				System.out.print("["+i+","+j+"]");
			}
			System.out.println("");
		}

 

 

 

 

-- outer: 을 레이블이라고 부르는데 그 레이블 이름이 지금은 outer일 뿐이지 바꿀 수 있다.

-- break 레이블명; 을 하면 레이블명: 다음에 오는 반복문을 빠져나간다.

 

 


 

 

레이블을 사용하여 가위바위보 게임을 빠져나가 보자.

 

 

 

outer: 
do {
for (;;) {
					System.out.print(">> 게임을 계속하시겠습니까?(Y/N) => ");
					yn = sc.nextLine();

					if ("y".equalsIgnoreCase(yn))
						break;

					if ("n".equalsIgnoreCase(yn))
						break outer;
					else {
						System.out.println("▷ 계속여부는 Y/N이어야 합니다.");
						continue;
					}
    } while (!(userNum == 4));

 

 

 

-- do while() 밖에 레이블을 잡아 놓고 break outer;를 해 준다.

 

 


 

Ⅰ. 배열(Array)

-- 동일한 데이터타입을 가지는 여러개의 데이터를 담을 수 있는 데이터 타입을 말한다.

-- 배열 또한 객체라는 것을 꼭 기억하도록 하자.

 

1. 배열의 선언

▷▷ 첫 번째 방법

-- 데이터타입[] 배열명;

-- 데이터타입 배열명[];

 

 

 

int[] subjectArr; // 또는 int subjectArr[];

 

 

2. 선언되어진 배열을 메모리에 할당해 준다.

 

 

 

subjectArr = new int[7];

 

 

 

0

1

2

3

4

5

6

 

-- 위의 숫자는 배열의 인덱스(index)를 가리키는 번호로서 0부터 시작하여 1씩 증가한다.

-- 배열의 인덱스(index)를 "배열의 방번호"라고 흔히 부른다.

-- 배열에 저장된 데이터를 표현할 때는 아래와 같이 배열명[인덱스번호]로 나타낸다.

subjectArr[0]

    subjectArr[1]

    subjectArr[2]

    subjectArr[3]

    subjectArr[4]

    subjectArr[5]

    subjectArr[6]

▷ subjectArr[7] ==> 오류

-- 배열로 선언된 변수에는 자동적으로 초기값이 들어간다.

-- 정수는 0, 실수는 0.0, char는 '', String을 포함한 객체는 null이 들어간다.

 

 


배열의 길이에 대해 알아보자.

 

 

 

subjectArr = new int[7];
System.out.println("배열 subjectArr의 길이 : " + subjectArr.length);

 

 

 

▷결과

배열 subjectArr의 길이 : 7

 


 

배열에 들어가 있는 값이 무엇인지 알아보자.

 

 

 

for(int i=0; i<subjectArr.length; i++) {
			int val = subjectArr[i];
			System.out.print(val);
		}

 

 

 

▷결과

0000000

 

3. 데이터 값 넣어 주기

 

 

 

 

subjectArr[0] = 100;	// 국어
				subjectArr[1] = 90;		// 영어
				subjectArr[2] = 95;		// 수학
				subjectArr[3] = 70;		// 과학
				subjectArr[4] = 98;		// 사회
				subjectArr[5] = 100;	// 음악
				subjectArr[6] = 90;		// 체육
				
				for(int i=0; i<subjectArr.length; i++) {
					int val = subjectArr[i];
					System.out.println("subjectArr["+i+"] =>"+ val);
				}

 

 

 

▷결과

subjectArr[0] =>100

subjectArr[1] =>90

subjectArr[2] =>95

subjectArr[3] =>70

subjectArr[4] =>98

subjectArr[5] =>100

subjectArr[6] =>90

 


 

점수들의 총점을 구해 보자.

 

 

 

int total=0;
		for(int i=0; i<subjectArr.length; i++) {
		total += subjectArr[i];
		}
		System.out.println("총점 : "+total);

 

 

 

▷결과

총점 : 643

 

 


 

 

점수들의 평균을 구해 보자.

 

 

 

double avg = (double)total/subjectArr.length;
		System.out.println("평균 : "+ avg);

 

 

 

▷결과

평균 : 91.85714285714286

 

소수부 첫째자리까지만 보여주고 반올림을 해 보자.

 

 

 

System.out.println("평균 : "+ Math.round((avg*10))/10.0);

 

 

 

▷결과

평균 : 91.9

 


 

▷▷ 두 번째 방법

 

-- 위의 1. 배열의 선언과 2. 선언되어진 배열을 메모리에 할당을 각각 따로 하지 않고 아래와 같이 동시에 할 수 있다.

 

 

 

int[] subjectArr2 = new int[7];

 

 

 

 

-- 위의 코드와 똑같이 값 입력, 총점, 평균을 구할 수 있다.

 

 

 

 

subjectArr2[0] = 100; // 국어
subjectArr2[1] = 90; // 영어
subjectArr2[2] = 95; // 수학
subjectArr2[3] = 70; // 과학
subjectArr2[4] = 98; // 사회
subjectArr2[5] = 100; // 음악
subjectArr2[6] = 90; // 체육

for (int i = 0; i < subjectArr2.length; i++) {
	int val = subjectArr2[i];
	System.out.println("subjectArr2[" + i + "] =>" + val);
}
total = 0;
for (int i = 0; i < subjectArr2.length; i++) {
	total += subjectArr2[i];
	}
System.out.println("총점 : " + total);

avg = (double) total / subjectArr2.length;
System.out.println("평균 : " + avg);
System.out.println("평균 : " + Math.round((avg * 10)) / 10.0);

 

 

 

▷결과

subjectArr2[0] =>100

subjectArr2[1] =>90

subjectArr2[2] =>95

subjectArr2[3] =>70

subjectArr2[4] =>98

subjectArr2[5] =>100

subjectArr2[6] =>90

총점 : 643

평균 : 91.85714285714286

평균 : 91.9

 


 

▷▷ 세 번째 방법

-- 위의 1.배열의 선언과 2. 선언되어진 배열을 메모리에 할당과 3. 데이터 값을 넣어주기를 각각 따로 하지 않고 아래와 같이 동시에 할 수 있다.

 

 

 

int[] subjectArr3 = new int[] {100, 90, 95, 70, 98, 100, 90};

		for (int i = 0; i < subjectArr3.length; i++) {
			int val = subjectArr3[i];
			System.out.println("subjectArr3[" + i + "] =>" + val);
		}

		total = 0;
		for (int i = 0; i < subjectArr3.length; i++) {
			total += subjectArr3[i];
		}
		System.out.println("총점 : " + total);

		avg = (double) total / subjectArr3.length;
		System.out.println("평균 : " + avg);
		System.out.println("평균 : " + Math.round((avg * 10)) / 10.0);

 

 

 

▷결과

subjectArr3[0] =>100

subjectArr3[1] =>90

subjectArr3[2] =>95

subjectArr3[3] =>70

subjectArr3[4] =>98

subjectArr3[5] =>100

subjectArr3[6] =>90

총점 : 643

평균 : 91.85714285714286

평균 : 91.9


-- 세 번째 방법에서 new int[]는 생략이 가능하다.

 

 

 

int[] subjectArr4 = {100, 90, 95, 70, 98, 100, 90};
		
		for (int i = 0; i < subjectArr4.length; i++) {
			int val = subjectArr4[i];
			System.out.println("subjectArr4[" + i + "] =>" + val);
		}

		total = 0;
		for (int i = 0; i < subjectArr4.length; i++) {
			total += subjectArr4[i];
		}
		System.out.println("총점 : " + total);

		avg = (double) total / subjectArr4.length;
		System.out.println("평균 : " + avg);
		System.out.println("평균 : " + Math.round((avg * 10)) / 10.0);

 

 

 

▷결과

subjectArr4[0] =>100

subjectArr4[1] =>90

subjectArr4[2] =>95

subjectArr4[3] =>70

subjectArr4[4] =>98

subjectArr4[5] =>100

subjectArr4[6] =>90

총점 : 643

평균 : 91.85714285714286

평균 : 91.9

 


 

Ⅱ. 확장된 for문

-- 개선된 for문, for each문 라고도 한다.

 

 

 

for(int val:subjectArr4) {
	System.out.println(val);
}

 

 

 

-- subjectArr4 배열의 길이만큼 반복한다.

-- 반복하면서 int val 속에 배열방(index)에 들어있는 값을 넣어준다.

▷결과

100

90

95

70

98

100

90

 


 

확장된 for문을 사용하여 총점을 구해 보자.

 

 

 

int total=0;
for(int val:subjectArr4) {
			total += val;
		}
		System.out.println("총점 : " + total);

 

 

 

▷결과

총점 : 643

 


 

배열을 이용하여 암호를 확인하는 프로그램을 만들어 보자.

-- 암호를 입력받고자 하는데 암호의 길이는 8글자 이상 15글자 이하이어야 하고,

암호는 반드시 영문대문자, 영문소문자, 숫자, 특수기호가 최소한 1개 이상 들어가야 한다.

-- 암호를 입력하기 위해 Scanner를 사용한다.

 

 

 

Scanner sc = new Scanner(System.in);
do {
		System.out.print(">> 암호를 입력하세요. => ");
		String passwd = sc.nextLine();
         }while(true);
sc.close();

 

 

 

-- 1) 입력받은 passwd 의 길이 검사

 

 

 

int len = passwd.length();
		if(len<=8 || len>=15) {
			System.out.println("▷ 암호의 길이는 8글자 이상 15글자 이하이어야 합니다.\n");
		}
		else {
        }

 

 

 

-- 2) 위의 1)의 else 안에 입력받은 passwd 글자 하나하나를 검사한다.

 

 

 

 

boolean flagUpper = false;		// 영문대문자 표식을 위한 용도
boolean flagLower = false;		// 영문소문자 표식을 위한 용도
boolean flagNumber = false;		// 숫자 표식을 위한 용도
boolean flagSpecial = false;	// 특수문자 표식을 위한 용도

char[] chrArr = passwd.toCharArray(); // 리턴타입이 char타입의 배열로 나온다.

for(char ch:chrArr) {
				if('A'<=ch && ch<='Z') {		// 영문대문자인지 검사
					flagUpper = true;
				}
				else if('a'<=ch && ch<='z') {	// 영문소문자인지 검사
					flagLower = true;
				}
				else if('0'<=ch && ch<='9') {	// 숫자인지 검사
					flagNumber = true;
				}
				else {							// 특수문자인지 검사
					flagSpecial = true;
				}
			}

 

 

 

-- passwd에서 받은 문자열을 char 배열에 넣어서 문자 하나씩 영문 대문자인지, 소문자인지, 숫자인지, 특수문자인지 검사한다.

-- boolean 변수는 do while문 안, if~else문 밖에 선언해 주자.

 

 

 

 

if(flagUpper && flagLower && flagNumber && flagSpecial) {
				// 암호요구 조건에 충족하는 경우
				System.out.println("▷ 암호입력 성공! \n");
				System.out.println("▷ 입력한 암호 : "+passwd);
				break;
			}
			else {
				// 암호요구 조건에 충족하지 못하는 경우
				System.out.println("▷ 암호는 영문 대문자, 소문자, 숫자, 특수기호가 혼합이 되어져야 합니다. \n");
			}

 

 

 

 

 

 

 


 

다른 클래스에 passwdCheck명의 static method를 만들어서 불러와 보자.

 

 

 

package my.day8.b.array;

import java.util.Scanner;
import my.util.MyUtil;

public class MainQuiz {
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);

		System.out.print(">> 암호를 입력하세요. => ");
		String passwd = sc.nextLine();
		
		boolean isUse = MyUtil.passwdCheck(passwd);
		
		if(isUse) {
			System.out.println("입력하신 암호 " +passwd+ "는 사용이 가능합니다.");
		}
		else {
			System.out.println("입력하신 암호 " +passwd+ "는 사용이 불가합니다.");
		}	
		sc.close();
	}
}

 

my.util(package) - MyUtil(class, main() 미포함)

 

 

 


 

Ⅲ. Random

-- 어떤 범위 내의 무작위 수를 얻어오는 것

-- Math.random 대신 사용할 수 있다.

-- 보안상 Math.random() 보다 new Random();을 사용하는 것이 더 안전하다.


5부터 10까지 랜덤한 수를 만들어 보자.

 

 

 

Random rnd = new Random();
int n = rnd.nextInt(6)+5;
System.out.println(n);

 

 

 

-- rnd.nextInt(마지막수-처음수+1)+5

 

 


 

배열을 이용하여 로또 당첨 번호를 만들어 보자.

 

 

 

 

int[] ballArr = new int[45];
		int[] tempArr = new int[5];	// 기존에 뽑았던 방번호를 기억시켜두는 공간	
		
		for(int i=0; i<ballArr.length; i++) {
			ballArr[i] = i+1;	// 배열의 방마다 데이터 입력하기
								// 데이터값은 1~45 
		}
		
		for(int i=0; i<tempArr.length; i++) {
			tempArr[i] = -1;
			/*
			 	공을 꺼내어 오면 꺼내온 공의 방번호(index 번호)를 기억하는 곳으로 사용한다
			 	꺼내온 공의 방번호(index 번호)가 0(실제로는 1번볼)이 들어올 수 있으므로
			 	데이터 값은 방번호(index 번호)로 사용하지 않는 -1로 모두(5개) 초기화한다.
			 	
			 */
		}
		
		// 공의 방번호를 꺼내는 작업을 6번 반복
		// 0번 방부터 44번 방까지 랜덤하게 6번 뽑아야 한다.
		// 즉, 0~44까지 난수를 발생
		String result = "";	// 랜덤하게 뽑은 공의 데이터 값(1~45)을 보여주기 위한 용도
		Random rnd = new Random();
		
		outer:
		for(int i=0; i<6; i++) {
			// int idx = rnd.nextInt(마지막수-처음수+1)+처음수);
			int idx = rnd.nextInt(44-0+1)+0;	// 방번호
			// 9 0 12 7      34 20
			
			// tempArr[5] <= 랜덤하게 뽑은 배열의 방번호를 기억하는 공간
			/*
			 				---------------------
			배열의 방번호 		| 0 | 1 | 2 | 3 | 4 |
			 				---------------------
			배열속의 데이터값	  -1  -1  -1  -1  -1
							---------------------
			랜덤하게 뽑은		   9   0  12   7  34  20(ok)
			배열의 방번호
			 
			// 9 0 12 9(중복) 34 20
			 				---------------------
			배열의 방번호 		| 0 | 1 | 2 | 3 | 4 |
			 				---------------------
			배열속의 데이터값	  -1  -1  -1  -1  -1	// 0도 난수값에 해당되므로 아예 다른 수를 초기치로 잡아야 한다.
							---------------------
			랜덤하게 뽑은		   9   0  12 (다시)7 34  20(ok)
			배열의 방번호
			
			*/
			for(int j=0; j<tempArr.length; j++) {
				if(tempArr[j] == idx) {	// 이미 9를 뽑았는데 9를 또 뽑으면 어떻게 할지
					i--; // 위에서 시도할 횟수를 다시 한번 주어야 한다.
						 // 해주지 않으면 6번 뽑아야 하는데 중복 될수록 횟수가 1씩 줄어든다.
					continue outer;	// 새로 random하게 뽑을 수 있도록 위의 for문부터 다시 할 수 있도록 continue; 해야 한다. 
				}
			}	// end of for(j<tempArr.length)
			
			if(i<5)
			tempArr[i] = idx;	// 뽑은 공의 방번호(indxe 번호)를 기억시켜둔다. 
			
			String str = (i<5)?", ":"\n";
			result += ballArr[idx]+str;
		}	// end of for(int<6) ----------------------
		
		System.out.println("로또 1등 당첨번호 : "+result);

 

 

 

 


 

Ⅳ. 버블 정렬(Bubble Sort)

-- 버블 정렬(Bubble Sort)은 정렬 대상 리스트(배열)의 항목을 수평방향으로 나열했다고 가정했을 때,

왼쪽 끝에서부터 시작해서 인접하는 두 항목의 값을 비교하여 올바른 순서(오름차순 또는 내림차순)로 되어있지 않으면

서로 위치를 교환하는 정렬방법이다.

-- 이렇게 인접하는 항목의 값을 비교해서 위치를 교환하는 과정을 리스트(배열)의 마지막 항목까지 반복해서

제일 큰(또는 작은) 값이 끝에 오도록 한다.

-- 각 회전(Pass)과정이 끝날때마다 정렬은 뒤에서부터 하나씩 완료된다.

 

 

int[] numArr = {9,7,3,5,1};
System.out.print("정렬하기전: ");
		for(int i=0; i<numArr.length; i++) {
			String str = (i<numArr.length-1)?", ":"";
			System.out.print(numArr[i]+str);
		}

 

 

 

▷결과

정렬하기 전 : 9, 7, 3, 5, 1

 

 

 

for(int i=0; i<numArr.length-1; i++) {		            // 추출대상 개수 ==> 배열 길이-1
			for(int j=0; j<numArr.length-1-i; j++) {	// 비교대상 갯수 ==> (배열길이-1) 부터 1씩 감소
				if(numArr[j] > numArr[j+1]) {
					int temp = numArr[j];
					numArr[j] = numArr[j+1];
					numArr[j+1] = temp;
				}
			}
		}
		System.out.print("오름차순 정렬한 후: ");
		for(int i=0; i<numArr.length; i++) {
			String str = (i<numArr.length-1)?", ":"";
			System.out.print(numArr[i]+str);
		}

 

 

 

▷결과

오름차순 정렬한 후 : 1, 3, 5, 7, 9

 


내림차순으로 정렬해 보자.

 

 

 

int[] numArr2 = {9,7,3,5,1};
		System.out.println("\n=== 내림차순 정렬한 후 ===");
		
		for(int i=0; i<numArr2.length-1; i++) {
			for(int j=0; j<numArr2.length-1-i; j++) {
				if(numArr2[j] < numArr2[j+1]) {
					int temp = numArr2[j];
					numArr2[j] = numArr2[j+1];
					numArr2[j+1] = temp;
				}
			}
		}
		
		for(int i=0; i<numArr2.length; i++) {
			String str = (i<numArr2.length-1)?", ":"";
			System.out.print(numArr2[i]+str);
		}

 

 

 

▷결과

내림차순 정렬한 후 : 9, 7, 5, 3, 1

 


 

정렬 메소드를 사용하여 오름차순으로 정렬해 보자.

 

 

 

int[] numArr3 = {9,7,3,5,1};
Arrays.sort(numArr3);
System.out.print("Arryas.sort()한 결과 : ");
for(int i=0; i<numArr3.length; i++) {
	String str = (i<numArr3.length-1)?", ":"";
	System.out.print(numArr3[i]+str);
}

 

 

 

▷결과

Arryas.sort()한 결과 : 1, 3, 5, 7, 9

-- Arrays.sort()로 하면 오름차순으로만 정렬이 된다.

 


 

▷ Arrays.sort()를 사용하여 내림차순으로 정렬해 보자.

 

 

 

int[] numArr4 = {9,7,3,5,1};
		
		System.out.print("Arryas.sort()한 결과(내림차순) : ");
		Arrays.sort(numArr4);
		for(int i=(numArr4.length-1); i>=0; i--) {
			String str = (i>0)?", ":"";
			System.out.print(numArr4[i]+str);
		}

 

 

 

Arryas.sort()한 결과(내림차순) : 9, 7, 5, 3, 1