[비트교육센터] 자바 12일차 조건문,반복문,배열
1. 조건문, 반복분
1) 조건문
package com.julian5383.train;
public class IfTest {
public static void main(String[] args) {
int num=(int)(Math.random()*6)+1;
//1~6, Math.random(): double 형으로 0.0이상 1.0 미만 사이의 값을 반환하는 함수
//(int)를 붙여 형변환을 하고 6개의 정수중 하나를 랜덤으로 선택한다.
//원래는 0~5이지만 맨 뒤에 +1을 붙여 출력하려는 수에 1을 더해준다.
if(num ==1) {
System.out.println("1번");
}else if(num==2) {
System.out.println("2번");
}else if(num==3) {
System.out.println("3번");
}else if(num==4) {
System.out.println("4번");
}else if(num==5) {
System.out.println("5번");
}else {
System.out.println("6번");
}
// 랜덤으로 선택된 수를 통해 if문이 동작한다.
System.out.println("===============");
num=(int)(Math.random()*6)+1;
switch(num) {
case 1:
System.out.println("1번");
break;
case 2:
System.out.println("2번");
break;
case 3:
System.out.println("3번");
break;
case 4:
System.out.println("4번");
break;
case 5:
System.out.println("5번");
break;
default:
System.out.println("6번");
}
//switch-case를 이용해 1-5번중 출력되는 수로 case문이 동작한다.
//6일 경우 case에 해당되지 않기 때문에 default에 있는 구문이 출력된다.
//case마다 break를 넣어 조건에 맞는 코드가 걸렸을때 실행을 중단시킨다.
System.out.println("===============");
char ch='y';
switch(ch) {
case 'Y':
case 'y':
System.out.println("진행~~");
break;
case 'N':
case 'n':
System.out.println("중지");
break;
default:
System.out.println("잘못선택");
}
//case를 2번 선언할 수 있다. 대문자,소문자 관계없이 처리할 수 있다.
System.out.println("===============");
char ch1='N';
switch(ch1) {
case 'Y','y'->System.out.println("진행~~");
case 'N','n'->System.out.println("중지");
default->System.out.println("잘못선택");
}
//Java12 부터는 switch에 표현식을 사용할 수 있다.
//break 문을 없애는 대신 화살표와 중관호를 이용할 수 있다.
}
}
--> 결과
4번
===============
4번
===============
진행~~
===============
중지
2) 반복문(For)
package com.julian5383.train;
public class ForTest {
public static void main(String[] args) {
int num = 10;
++num; // num = num + 1, num += 1
System.out.println(num);
num++;
System.out.println(num);
int num2 = 20 + ++num; //++num은 피연산자를 1증가 시키고 해당연상을 진행한다.
System.out.println(num+" - "+num2);
num2 = 20 + num++; //num++은 해당 연산을 수행 후, 피연산자 값을 1증가 시킨다.
System.out.println(num+" - "+num2);
System.out.println("===============");
int sum=0;
for (int i = 1; i <= 100; i++) {
sum+=i;
}
System.out.println(sum);
System.out.println("===============");
sum=0;
int i=1; //for문의 초기화식은 지역변수라서 분리시킬 수 있다.
for (; i <= 100; i++) {
sum+=i;
}
System.out.println(sum);
System.out.println("===============");
i=1;
int j=1;
for (; i <= 100; i++,j++) {//i하고 j가 같이상승
sum+=i;
}
System.out.println(sum);//10100
System.out.println("j = "+j);//j=101
System.out.println("===============");
/*for(;;) {
sum=0; //for문으로 무한루프
}*/
}
}
- 초기화식 이후로 for문은 조건식->실행문장->증감식으로 계속 반복된다.
- 그 과정에서 j증감식도 계속 증가한다. 그래서 j가 101이 나오는 것이다.
---
- 마지막 for문에 어떤 설정도 안해주면 for문은 무한루프를 돌게된다.
--> 결과
11
12
13 - 33
14 - 33
===============
5050
===============
5050
===============
10100
j = 101
===============
3) 반복문(While)
package com.julian5383.train;
import java.util.Scanner;
public class WhileTest {
public static void main(String[] args) {
int i=1;
int sum=0;
while(i<=100) {
sum+=i;
i++;
}
System.out.println(sum);
//while문으로 1에서 100을 더해준다.
System.out.println("===============");
sum=0;
i=1;
do {
sum+=i;
i++;
}while(i<=100);
System.out.println(sum);
//do~while: while에 있는 조건식이 true이든 false이든 무조건 한번은 실행한다.
//실행후 조건을 검사해 반복을 결정한다.
System.out.println("===============");
String input;
Scanner scanner = new Scanner(System.in);
//Scanner는 기본적인 데이터타입을 모두 입력받을 수 있다.
//java.util 패키지에 포함되어 java.util을 import 해줘야 사용할 수 있다.
do {
System.out.print(">");
input = scanner.nextLine();
//입력받은 문자열을 input에 저장한다.
//String을 읽고 개행을 기준으로 읽는다.
System.out.println("==>"+input);
}while(!input.equals("q"));
//만약 q를 입력하면 중지한다.
scanner.close();
//Scanner를 닫는다.
System.out.println("Game Over!!");
}
}
--> 결과
5050
===============
5050
===============
>ㄹ
==>ㄹ
>ㅇ
==>ㅇ
>q
==>q
Game Over!!
2. 배열
1) 배열
package com.julian5383.train;
public class ArrayTest {
public static void main(String[] args) {
int[] scores= {80,90,100};
//scores라는 배열을 선언해 80,90,100에 대한 집합을 선언한다.
System.out.println(scores.length);
//scores배열의 길이를 출력한다.
System.out.println(scores[0]);
System.out.println(scores[1]);
System.out.println(scores[2]);
//scores 배열의 인덱스 0,1,2의 값이 무엇인지 출력한다.
int sum=0;
for (int i = 0; i < scores.length; i++) {
sum+=scores[i];
}
System.out.println(sum);
//scores배열에 있는 값들의 합을 출력한다.
System.out.println("===============");
sum=0;
//for each구조로로 배열을 선언한 것이다.
for (int score : scores) {//for(각 요소 값 : 배열이나 컨테이너 값)
sum+=score; //반복 수행할 작업
}
System.out.println(sum);
}
}
--> 결과
3
80
90
100
270
===============
270
2) 배열, 자바참조
package com.julian5383.train;
public class ArraySample {
public static void main(String[] args) {
if(args.length != 2) {//입력한 데이터 개수가 2개가 아닌 경우
System.out.println("Usage: 클래스명 매개변수1 매개변수2");
//사용법 출력
System.exit(0);
//강제종료
}
System.out.println("입력한 값: "+args[0]+"와 "+args[1]+"입니다.");
//입력한 매겨변수 출력
}
}
- 자바 커맨드 라인 입력이다.
- String[] args를 통해 커맨드라인에서 입력된 데이터의 수(배열의 길이), 입력된 데이터(배열의 항목 값)을 알 수 있다.
- 프로그램을 실행시 2개의 문자열을 주지 않으면 프로그램의 사용법을 출력하고 강제종료하도록 한다.
- 만약 프로그램을 실행시 2개의 문자열이 정확히 입력되면 2개의 문자열을 출력한다.
--> 결과
Usage: 클래스명 매개변수1 매개변수2
- 터미널을 실행하고 본인이 작업하는 workspace의 주소로 이동합니다.
- 그리고 해당 주소의 bin폴더 경로까지의 경로를 입력합니다.
- java com.julian5383.train.ArraySample hahaha hohoho
==> java java파일 매개변수1 매개변수2 으로 입력한다. 참고로 자바파일은 패키지 경로도 같이 선언해야 한다.
3) 2차원 배열
package com.julian5383.train;
public class MultiArray {
public static void main(String[] args) {
int [][] scores= { {90,85},
{85,80},
{77,100}
};
//2차원 배열 생성
for (int i = 0; i < scores.length; i++) {//행 길이를 기준으로
for (int k = 0; k < scores[i].length; k++) {//열 길이를 기준으로
System.out.print("scores[" + i + "][" + k + "] = " + scores[i][k] + " ");
}
System.out.println("");
}
//생성한 2차원 배열을 출력한다.
int [][] mathScores = new int[3][];
int[] row01= {90,85};
int[] row02= {85,80};
int[] row03= {77,100};
mathScores[0]=row01;
mathScores[1]=row02;
mathScores[2]=row03;
//mathScores에 대한 2차원 배열을 생성한다.
for (int i = 0; i < scores.length; i++) {
for (int k = 0; k < scores[i].length; k++) {
System.out.print("mathscores[" + i + "][" + k + "] = " + scores[i][k] + " ");
}
System.out.println("");
}
//mathscores배열과 scores배열을 출력한다.
for(int i[]: scores) {
for(int j:i) {
System.out.print( j + " ");
}
System.out.println();
}
//scores 배열을 for-each로 출력한다.
}
}
--> 결과
scores[0][0] = 90 scores[0][1] = 85
scores[1][0] = 85 scores[1][1] = 80
scores[2][0] = 77 scores[2][1] = 100
mathscores[0][0] = 90 mathscores[0][1] = 85
mathscores[1][0] = 85 mathscores[1][1] = 80
mathscores[2][0] = 77 mathscores[2][1] = 100
90 85
85 80
77 100
4) 배열 실습문제
- 2차원 배열을 선언하고 해당 배열에서 0이 있을 경우 0이 있는 열과 행을 값을 이용한다.
- 열에 있는 값들의 평균값과 행에 있는 평균값 중 가장 큰 값을 0을 대신해서 넣어준다.
[1] 내가 푼 답변
package com.julian5383.train;
public class ArrayExam {
public static void main(String[] args) {
double[][] findAvgInput = { { 5, 4.5, 6.8 },
{ 6, 0, 3.4 },
{ 7, 8.4, 2.3 }
};
findAverage(findAvgInput);
}
public static void findAverage(double[][] array) {
int row=-1;
int col=-1;
//행인덱스, 열 인덱스 초기화
double sum_row=0.0,avg_row=0.0;//행 전체합, 행평균
double sum_col=0.0,avg_col=0.0;//열 전체합, 열평균
for (int i = 0; i < array.length; i++) {
for (int k = 0; k < array[i].length; k++) {
if (array[i][k]==0) {//만약 0이 존재한다면???
row=i;
for (int j = 0; j < array[row].length; j++) {
sum_row+=array[row][j];
}
avg_row=sum_row/(array[i].length);//0이 속한 행 평균 구하기
col=k;
for (int j = 0; j < array.length; j++) {
sum_col+=array[j][col];
}
avg_col=sum_col/(array.length);//0이 속한 열 평균 구하기
if(avg_row > avg_col) {
array[i][k]=avg_row;
}
else {
array[i][k]=avg_col;
}//행 평균, 열 평균 중 가장 큰 것을 0이 있는 주소에 넣기
System.out.print(array[i][k]+" ");
//최종출력
}else {
System.out.print(array[i][k]+" ");
//0이 아예 없으면 그대로 출력
}
}
System.out.println("");
}
}
}
--> 결과
5.0 4.5 6.8
6.0 4.3 3.4
7.0 8.4 2.3
[2] 선생님의 답변
package com.julian5383.train;
public class ArrayExam_Answer {
public static void main(String[] args) {
double[][] findAvgInput = { { 5, 4.5, 6.8 },
{ 6, 0, 3.4 },
{ 7, 8.4, 2.3 }
};
findAverage(findAvgInput);
}
public static void findAverage(double[][] array) {
for(int row=0;row<array.length;row++){//행 인덱스
for (int column = 0; column < array[row].length; column++) {//열 인덱스
if (array[row][column] == 0) {//만약 0이 존재한다면??
array[row][column] = Math.max(getRowTotal(array, row) / array[row].length,
getColumnTotal(array, column) / array.length);
//행과 열의 평균중 가장 큰값을 0이 있는 인덱스에 입력해준다.
}
}
}
for (double[] row : array) {
for (double column : row) {
System.out.printf("%2.1f ", column);
}
System.out.println();
}//최종 출력한다.
}
public static double getRowTotal(double[][] array, int row) {
double sum = 0.0;
for (int column = 0; column < array[row].length; column++) {//열 개수
sum += array[row][column];
}
return sum;
}//0이 존재하는 행의 합계를 계산한다.
public static double getColumnTotal(double[][] array, int column) {
double sum = 0.0;
for(int row=0;row<array.length;row++){//행 개수
sum += array[row][column];
}
return sum;
}//0이 존재하는 열의 합계를 계산한다.
}
--> 결과
5.0 4.5 6.8
6.0 4.3 3.4
7.0 8.4 2.3
[3] 다른 분의 답변
package com.julian5383.train;
public class ArrayExam_Other {
public static void main(String[] args) {
double[][] findAvgInput = { { 5, 4.5, 6.8 },
{ 6, 0, 3.4 },
{ 7, 8.4, 2.3 }
};
findAverage(findAvgInput);
}
public static void findAverage(double[][] array) {
double row_sum = 0.0;
double length_sum = 0.0;
int length_index = 0;
int row_index = 0;
double length_end = 0.0;
double row_end = 0.0;
double max_end = 0.0;
for (double[] row : array) {
row_index = 0;
for (double row_v : row) {
if (row_v == 0.0) {
for (double i : row) {
row_sum = row_sum + i;
}//0이 존재하는 행 더하는 곳
for (double[] i : array) {
length_sum = length_sum + i[length_index];
}//0이 존재하는 열 더하는 곳
row_end = row_sum / array.length ;
length_end = length_sum / row.length ;
//행,열 평균 구하기
if (length_end < row_end)
max_end = row_end;
if (length_end > row_end)
max_end = length_end;
//평균중 가장큰값
array[length_index][row_index] = max_end;
//가장 큰값을 입력
}
row_index++;//인덱스 길이 증가
}
length_index++;//열 인덱스 길이 증가
}
for (double[] scoress : array) {
for (double scoresss : scoress) {
System.out.print(scoresss + " ");
}
System.out.println("");
}
//최종출력
}
}
--> 결과
5.0 4.5 6.8
6.0 4.3 3.4
7.0 8.4 2.3