자바(Java) 복습 1 ( 반복문 , 조건문 , 배열 )
1 ) 반복문
2 ) 조건문
2 - 1 ) 일반적인 if 문
2 - 2 ) 중첩 if 문
2 - 3 ) switch 문
2 - 4 ) break없는 switch문
3) 반복문 조건문 문제풀이
총 예제 3개
4) 배열
4 - 1) 배열 선언
4 - 2 ) 배열 생성 및 사용
4 - 3) 배열의 활용
4 - 4 ) 2차원 배열
4-5) 가변 배열(2차원)
4-6 ) 배열의 복사
5) 배열 예제
@@@ 1. 반복문 ( 조건식의 결과가참인동안 문장 실행 ) @@
*=========1. for문=================
for문(초기값 ; 조건문 ; 증감식)
{
조건문이 참인동안 실행되는 문장들 }
조건문의결과가 거짓이면 종료
*=========2. while문=================
while(조건문)
{ 조건문의결과가 참인동안 실행 }
조건문의 결과가 거짓이면 반복문종료
*처음부터 조건문의결과가거짓이면 문장실행 X
*=========3. do-while문===============
do{
조건문의결과가 참인동안 실행( 무조건 한번 실행됨 )
} while(조건);
조건문의 결과가 거짓이면 반복문종료
조건문과상관없이 한번은 실행
public class LoopEx01 {
public static void main(String[] args) {
System.out.println("==반복문없이 1~5 출력하기==");
System.out.print(1);
System.out.print(2);
System.out.print(3);
System.out.print(4);
System.out.println(5);
System.out.println("==for문을이용해 1~5출력==");
for (int i = 1; i <= 5; i++) {//i :지역변수
System.out.print(i);
if(i==5) {
System.out.println("");
}
}
/*
* 1)int i = 1;
* 2) i<=5 : T <----------| 거짓인경우 반복문 종료
* 3) System.out.print(i); |
* 4) i++; //6 -------|
*/
System.out.println("==while문으로 1~5까지실행==");
int count=0; //전역변수 count
while(true) {
count++;
System.out.print(count);
if(count==5) { //count==5일때 \n 후 반복문탈출
System.out.println();
break;}
}
int k=0;
System.out.println("==do-while문으로 1~5실행==");
do {
k++;// 1 2 3 4 5
System.out.print("k : "+k+"\t");// \t == tab
} while (k<5); //5가 되면 break;
System.out.println();
System.out.println("==do=while문 조건과 상관없이 실행되는것 증명==");
int j = 90;
do {System.out.println("j : "+j);}
while(j<10);//이미 조건이 맞지않아서 원래는 반복루프가 돌지않음
}
}
==반복문없이 1~5 출력하기==
12345
==for문을이용해 1~5출력==
12345
==while문으로 1~5까지실행==
12345
==do-while문으로 1~5실행==
k : 1 k : 2 k : 3 k : 4 k : 5
==do=while문 조건과 상관없이 실행되는것 증명==
j : 90
@@ 2. 조건문 @@
2-1 ) 일반적인 if문
* if / else if / else
* if(조건식1){조건식1이 참인경우 실행되는 문장들}
* else if(조건식2){조건식1이거짓이고 조건식2가 참}
* else if(조건식3){조건식1,2 거짓이고 조건식3가 참}
* else{모든조건식이 거짓일 때 실행}
2-2 ) 중첩if문 : if구문 내에 if구문이 존재
if(조건식1){
if( 조건문2 ){ 조건식 1참 && 조건식2 참이면 실행 }
else if( 조건식 3){조건식2 거짓 && 조건식3 참 실행}
else { 조건식3 거짓 && 조건식1 참}
}
System.out.println("중첩if문 예시");
Scanner scan = new Scanner(System.in);
for (int i = 0; i < 4; i++) {
System.out.print("숫자 입력 : ");
int num = scan.nextInt();//숫자입력
if(num<=10) { //10보다작으면 실행
if(num>=9) { //10보다 작고 9보다크거나같으면 실행
System.out.println("A");
}
else if(num >= 5) {//9보다 작고 5와 같거나크면 실행
System.out.println("B");
}
else {//5보다 작으면 실행
System.out.println("C");
}
}
}
중첩if문 예시
숫자 입력 : 10
A
숫자 입력 : 8
B
숫자 입력 : 7
B
숫자 입력 : 4
C
2-3 ) Switch 문
switch ( 조건값 ) {
case 값1 :문장1 break;
case 값2: 문장2 break;
default : 문장 break;
//case에 해당하는 값이 없을 시 실행
}
break;문을 안할 시
밑에 case값의 문장도 실행됨
조건값으로 사용가능한 자료형
byte , short, int ,char , String
실수형 double , float 은 안됨
int num =8;
switch(num) {
case 8: System.out.println("안녕8");
case 7 : System.out.println("안녕7");
case 4 : System.out.println("안녕4");break;
case 3 : System.out.println("안녕3");
}
안녕8
안녕7
안녕4
public class Switch_01 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
for (int i = 0; i <5; i++) {
System.out.print("점수입력 : ");
int score = scan.nextInt();
switch (score/10) {
case 10: // 10에는 break; 문도 없으므로 밑으로 한칸 내려감
case 9:
System.out.println("A학점");break;
case 8:
System.out.println("B");break;
case 7:
System.out.println("C");break;
case 6:
System.out.println("D");break;
default: //모두 아니면 실행
System.out.println("F");
}
switch (score/10) {
case 10: //밑으로내려감
case 9: //밑으로
case 8:// 밑으로
case 7: //밑으로
case 6:System.out.println("PASS"); //60점 이상이라면 pass 출력 후 break;
break;
default:System.out.println("FAIL"); // case에없는 숫자면 실행
break;
}
System.out.println("============");
}
}
}
점수입력 : 60
D
PASS
============
점수입력 : 80
B
PASS
============
점수입력 : 40
F
FAIL
============
점수입력 : 66
D
PASS
============
점수입력 : 59
F
FAIL
============
2- 4 ) break;를 안적어도되는 Ramda switch문
switch(조건값){
case 값1,값2 -> {조건값이 값1 or 값2에 해당하면 실행 }
case 값3 -> {조건값이 값1 , 값2에 해당하면 실행}
case default -> {그 어디에도 해당하지않으면 실행}
}
-> 을 사용하면 break 를 적지 않아도 자동으로 나오게 됨
랜덤변수를 만들어 1~10의 무작위숫자를 뽑은 후
그 값에 맞는 문장 출력
랜덤변수를 생성하는 2가지의 방법
int num = (int)(Math.random() * 10)+1;
/*
* 0.0 <= Math.random() <1.0
* 0.0 <= Math.random()*10 < 10.0
* 0 <= (int)(Math.random()*10) < 9
* 1 <= (int)(Math.random()*10)+1 < 10
*/
int ranNum = new Random().nextInt(10)+1;//1~10 임의의 수를 가져옴
for (int i = 0; i < 5; i++) {
int ranNum = new Random().nextInt(10)+1;
System.out.println("숫자 : "+ranNum);
switch(ranNum) {
case 1,2 -> { System.out.println("자전거당첨"); }
case 3,4,5 -> { System.out.println("마우스 당첨"); }
case 6,7 -> { System.out.println("냉장고 당첨"); }
default ->{ System.out.println("꽝"); }
}System.out.println("====");
}
숫자 : 1
자전거당첨
====
숫자 : 10
꽝
====
숫자 : 5
마우스 당첨
====
숫자 : 3
마우스 당첨
====
숫자 : 1
자전거당첨
3. @@ 조건문+반복문 예제풀이 @@
예제1) (for문과 if문 아스키코드 및 String->char->int 이용 )
* 화면에서 한개의 문자를 입력받아 대소문자 소문자 숫자 기타문자인지출력
(대문자면 소문자도출력
숫자면 100을 더해서 출력)
* [결과]
* 한개의 문자입력 : A
* A는 대문자에요
소문자 : a
* 한개의 문자입력 : 7
* 7는 숫자에요
7+100 : 107
public class Exam02_my {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
for(int i = 0 ; i< 3 ; i++) {
System.out.print("1개의문자를 입력하세요 : ");
String var = scan.next();//한개의문자 입력받기
if(var.length()>1) {
System.out.println("1개의문자만 입력하세요 ");
}
else {
char c = var.charAt(0);
//char(문자열) 형으로 변환
if('A'<= c && c<='Z') {
/*
* A 의 아스키코드 = 65
* Z 의 아스키코드 = 98
* 아스키코드에 32를 더한 후 char형으로 형변환 시 소문자가 됨
*/
System.out.println(c+"는대문자");
System.out.println("소문자 : "+(char)(c+32));
}
else if(97<= c && c<=122) {
/*
* 소문자 a 의 아스키코드 = 99
* 소문자 z 의 아스키코드 = 122 그 사이에있다면 소문자인것임
* (char)(소문자-32) == 대문자
*/
System.out.println(c+"는 소문자");
System.out.println("대문자 : "+(char)(c-32));
}
else if('0'<= c && c<='9') {
System.out.println("숫자임");
System.out.println("c : "+(int)c+" - '0' : "+(int)'0');
System.out.println("(int)('c'-'0')+100 : "+(((int)c-'0')+100));
System.out.println("괄호의 중요성");
System.out.println("100+50 : "+100+50);
System.out.println("(100+50) : "+(100+50));
//이런 아스키코드에 숫자를 더할때는 괄호가 중요함 100을 문자로 인식해버릴수도 있음
// char형 숫자는 0을뺴줘야 int형의 숫자표현이 나옴
}
}
}
}
}
1개의문자를 입력하세요 : g
g는 소문자
대문자 : G
1개의문자를 입력하세요 : K
K는대문자
소문자 : k
1개의문자를 입력하세요 : 5
숫자임
c : 53 - '0' : 48
((int)('c'-'0')+100) : 105
괄호의 중요성
100+50 : 10050
(100+50) : 150
예제2) (중첩 for문 이용)
삼각형의 높이를 입력받아 *로 삼각형출력
package chap4.exam;
public class Exam07_Triangle {
//차례대로 피라미드식으로 출력되는 별
public void basic(int a) {
for (int i = 1; i <= a; i++) { //첫 루프가 1부터 시작해야
for (int j = 0; j < i; j++) { //최소 한번실행 가능
System.out.print("*");
}
System.out.println();
}
}
//거꾸로 출력되는 별 5 4 3 2 1
public void reverse(int b) {
System.out.println("거꾸로출력");
for (int i = b; i >= 1; i--) {
for (int j = 0; j < i; j++) {
System.out.print("*");
}System.out.println();
}
}
/*
* 3: i j
* ================
* * 1 3
* ** 2 23
* *** 3 123
*/
public void emptyPrint(int c) {
System.out.println("공백포함 출력");
for (int i = 1; i <= c; i++) {
for (int j = c; j >= 1; j--) {
if(j>i) {
System.out.print(" ");}
else {// j <= i
System.out.print("*");}
}System.out.println(); // 안의 for문이 끝나면 \n
}
}
/*
* 4: i j(출력)
* =======================
* *** 1 123
* ** 2 23
* * 3 3
*/
public void emptyReverse(int d) {
//공백포함 출력을 만들었다면 조건문만 반대로해주면 완성
System.out.println("공백포함 거꾸로");
for (int i = 1; i <= d; i++) {
for (int j = d; j >= 1; j--) {
if(j<i) {
System.out.print(" ");}
else {// j>=i
System.out.print("*");}
}System.out.println(); // 안의 for문이 끝나면 \n
}
}
}
예제3 (중첩 switch문ㅡ if문 ㅡ 삼항연산자 이용)
3대 운동 티어를 만들어보자
500 초과 : 헬창
450~500 : a+급
400~449 : a급
350~399 : b+급
300~349 : b급
그 외 : 열심히하세요!
여기서 중첩switch문을 사용해봤다
설명은 안했지만 보면 알거다!! 중첩if문과 비슷하게 동작
package chap4.hardEx;
import java.util.Scanner;
public class My_Test {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
for(int k = 0 ; k<3 ; k++) {
System.out.print("3대 무게를 입력해보세요 : ");
String numS = scan.next();
int num = Integer.parseInt(numS);
System.out.println("==switch문으로 표현 == (번거로움)");
switch(num/100){
case 9,8,7,6,5->System.out.println("헬창");
case 4-> {
switch(num/10) {case 45,46,47,48,49-> System.out.println("a+ 급");
case 40,41,42,43,44->System.out.println("a 급");}
}
case 3-> {
switch(num/10) {case 35,36,37,38,39-> System.out.println("b+ 급");
case 30,31,32,33,34->System.out.println("b 급");}
}
default->System.out.println(" 분발하세요 ");
}
System.out.println("== if문을 사용 ==");
if(num >= 500) {
System.out.println("헬창");
}
else if(num>=400) {
if(num>=450) {System.out.println("A+ 급");}
else {System.out.println("A급");}
}
else if(num>=300) {
if(num>=350) {System.out.println("B+ 급");}
else {System.out.println("B급");}
}
else {
System.out.println("분발하세요 ");
}
System.out.println("==삼항연산자 사용==(괄호를굉장히 신경쓰며 작성해야함)");
String result = (num>=500? "헬창":
(num>=450?"A+급":
(num>=400?"A급":
(num>=350?"B+급":
(num>=300?"B급":"분발하세요")))));
System.out.println(result);
}
}
}
3대 무게를 입력해보세요 : 560
==switch문으로 표현 == (번거로움)
헬창
== if문을 사용 ==
헬창
==삼항연산자 사용==(괄호를굉장히 신경쓰며 작성해야함)
헬창
3대 무게를 입력해보세요 : 420
==switch문으로 표현 == (번거로움)
a 급
== if문을 사용 ==
A급
==삼항연산자 사용==(괄호를굉장히 신경쓰며 작성해야함)
A급
3대 무게를 입력해보세요 : 340
==switch문으로 표현 == (번거로움)
b 급
== if문을 사용 ==
B급
==삼항연산자 사용==(괄호를굉장히 신경쓰며 작성해야함)
B급
@@ 4) 배열 @@
4-1) 배열의 선언
new 예약어
1.객체생성( 정수 5개를 저장할 수 있는 객체생성)
2.기본값 초기화
숫자(byte short int) : |
0 |
실수(float , double ) |
0.0 |
boolean |
false |
그 외 (String , 객체 등) |
null |
System.out.println("초기화 ");
byte [] b = new byte[5];
System.out.println("byteArray : "+Arrays.toString(b));
int [] i = new int[5];
System.out.println("intArray : "+Arrays.toString(i));
double [] d = new double[5];
System.out.println("doubleArray : "+Arrays.toString(d));
boolean [] bo = new boolean[5];
System.out.println("booleanArray : "+Arrays.toString(bo));
String [] s = new String[5];
System.out.println("intArray : "+Arrays.toString(s));
초기화
byteArray : [0, 0, 0, 0, 0]
intArray : [0, 0, 0, 0, 0]
doubleArray : [0.0, 0.0, 0.0, 0.0, 0.0]
booleanArray : [false, false, false, false, false]
intArray : [null, null, null, null, null]
4-2) 배열의 생성 및 사용
참조에 대해 이해가 안된다면
arr2 = arr ; (참조값 복사 )
arr2 : 2000-> 1000 으로 바뀐거임 (오타)
arr2 가 원래 참조하던 객체가 사라지고
arr 과 같은곳을 참조하게 됨
package chap05;
import java.util.Arrays;
public class ArrayEx01 {
public static void main(String[] args) {
// int arr[];
// arr = new int[5];
int [] arr = new int [5];
//배열의인덱스 : 0번부터 시작
arr[0] = 10;
arr[1] = 20;
//arr.length = 5 배열의크기
for (int i = 0; i < arr.length; i++) { //0번인덱스~4번인덱스 반복
System.out.print("arr["+i+"] : "+arr[i]+" , ");
}System.out.println();
int []arr2 = new int[]{100,200}; //100과200을 요소로가진 크기2의 arr배열 생성
for (int i = 0; i < arr2.length; i++) {
System.out.print("arr2["+i+"] : "+arr2[i]+" , ");
}System.out.println();
System.out.println("arr2 = arr ");
System.out.println("참조값이 바뀌어버림 arr2가 참조하던 객체는 사라짐");
arr2= arr;
/*
arr의 주소를 arr2에 복사 -->
arr2가 참조하는 객체 (100,200)이 사라지고
arr과 같은곳을 참조하게 됨
*/
arr2[3] = 999;
/*
* 원래 arr2는 크기가 2인 100,200 이저장된 배열을 참조했지만
* 크기가 5인 arr 로 참조를 바꿈
* arr2 에서 데이터변경을 하면 arr 도 바뀔것임 (같은곳을 참조)
*/
for (int i = 0; i < arr2.length; i++) {
System.out.print("arr2["+i+"] : "+arr2[i]+" , ");
}System.out.println();
for (int i = 0; i < arr.length; i++) {
System.out.print("arr["+i+"] : "+arr[i]+" , "
+ "");
}System.out.println();
//향상된for문
System.out.println("--향상된for문사용--");
System.out.printf("arr2 : ");
for (int i : arr2) {
System.out.print(i+" ");
}System.out.println();
System.out.println("--Arrays.toString()사용해 배열출력--");
System.out.println("arr2 : "+Arrays.toString(arr2));
}
}
arr[0] : 10 , arr[1] : 20 , arr[2] : 0 , arr[3] : 0 , arr[4] : 0 ,
arr2[0] : 100 , arr2[1] : 200 ,
arr2 = arr
참조값이 바뀌어버림 arr2가 참조하던 객체는 사라짐
arr2[0] : 10 , arr2[1] : 20 , arr2[2] : 0 , arr2[3] : 999 , arr2[4] : 0 ,
arr[0] : 10 , arr[1] : 20 , arr[2] : 0 , arr[3] : 999 , arr[4] : 0 ,
--향상된for문사용--
arr2 : 10 20 0 999 0
--Arrays.toString()사용해 배열출력--
arr2 : [10, 20, 0, 999, 0]
4-3) 배열의 활용
로또 번호 45개를 만든 후
무작위로섞고
6개의 숫자만 뽑은 후
정렬시켜서
출력해보자
숫자배열 생성과 (크기45)
뽑기 배열 생성 (크기 6)
숫자배열에 1~45숫자를 넣은 후
랜덤변수 이용해
무작위로 100번 섞기
package chap05;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
public class ArrayEx03 {
public static void main(String[] args) {
int[] balls = new int[45];
int[] lotto = new int[6];
//45까지의 숫자가 들어있는 배열 생성
for (int i = 1; i <= 45; i++) {
balls[i-1] = (i);
}
System.out.println("숫자출력");
System.out.println(Arrays.toString(balls));
for (int i = 0; i < 1000; i++) {
int f = (int)(Math.random() * 45 );//0~44 의 int값 생성 ( 45는 인덱스44번이다)
int t = (int)(Math.random() * 45 );
//swap 알고리즘 양 값 바꾸기
int temp = balls[f];
balls[f] = balls[t];
balls[t] = temp;
//하나의 변수를 두어 중간에서 섞는역할
//랜덤한 인덱스 값 추출후 섞기
}
System.out.println("섞은 후 ball");
System.out.println(Arrays.toString(balls));
/*
* System.out.println("List라는 프레임워크를 이용하면 섞는 함수도 제공하긴 한다 (배열처럼 순서대로 들어감)");
* ArrayList<Integer> arrayList = new ArrayList<Integer>(); arrayList.add(1);
* arrayList.add(2); arrayList.add(3); arrayList.add(4);
* System.out.println(arrayList); Collections.shuffle(arrayList); //map은
* shuffle이 안됨 System.out.println(arrayList);
*/
섞은 숫자를 차례대로
lotto 배열크기만큼 저장
그 후 정렬 알고리즘 (배열크기 만큼 동작) 사용해
오름차순으로 정렬
버블정렬을 사용했다
(맨왼쪽부터 하나씩 비교해가며 변경)
0 1 2 3 4 5 (인덱스6개)
0 1 ->1 2-> 2 3 -> 3 4 -> 4 5 5번비교
0 1 -> 1 2 -> 2 3 -> 3 4 4번비교
0 1 -> 1 2 -> 2 3 3번비교
0 1 -> 1 2 2번비교
0 1 1번비교
if(j=0 ; j < lotto.length-1-i ; j++)
만일 j < j+1 일시 break;
하지만
Arrays.sort(); 사용해 정렬하는것을 추천함 !!!
//lotto 번호선택 0~5 번 인덱스까지
for (int i = 0; i < lotto.length; i++) {
lotto[i] = balls[i];
}
System.out.println("** 로또 **");
System.out.println(Arrays.toString(lotto));
//정렬(sort)
for (int i = 0; i < lotto.length; i++) {
boolean sortable = true;
for (int j = 0; j < lotto.length-1-i; j++) {
/*lotto.length-1-i 로설정한 이유
* 일단 j+1 과비교하기떄문에 length가6이라고치면
* 4번인덱스 까지만 루프를 돌면5번까지도 비교가 됨
*
* 첫번쨰루프에서 0번부터 맨뒤에까지 비교를 했으니
* (맨뒤index 는 가장 큰 숫자일게 분명함)
* (length-1-i)번 인덱스 까지만 루프를 돌리자
*/
if(lotto[j]> lotto[j+1]) {
int temp = lotto[j];
lotto[j] = lotto[j+1];
lotto[j+1] = temp;
sortable = false;
}
}
System.out.print(i+":");
for (int j : lotto) {
System.out.print(j+" , ");
}
System.out.println();
if(sortable)break; //if문이 거짓이면 break;
}
System.out.print("최종정렬 : ");
for (int i : lotto) {
System.out.print(i+" , "
+ "");
}
Arrays.sort(lotto);
// 이방법을사용해서 정렬을 할 수도있음. (이게훨씬간편함)
}
}
숫자출력
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45]
섞은 후 ball
[26, 24, 11, 18, 28, 14, 39, 32, 12, 33, 13, 25, 1, 10, 45, 16, 42, 37, 9, 34, 2, 20, 8, 3, 19, 22, 31, 23, 40, 30, 44, 6, 43, 17, 4, 38, 41, 36, 21, 5, 15, 27, 7, 35, 29]
** 로또 **
[26, 24, 11, 18, 28, 14]
0:24 , 11 , 18 , 26 , 14 , 28 ,
1:11 , 18 , 24 , 14 , 26 , 28 ,
2:11 , 18 , 14 , 24 , 26 , 28 ,
3:11 , 14 , 18 , 24 , 26 , 28 ,
4:11 , 14 , 18 , 24 , 26 , 28 ,
최종정렬 : 11 , 14 , 18 , 24 , 26 , 28 ,
정렬하는 횟수는 매번달라 질 수 있음
4 - 4) 2차원 배열
* 2차원배열은 1차원배열의 참조변수의 배열 .(배열의 배열)
즉
2차원배열은 1차원배열이 여러개 존재하는거라 보면 된다
각각 참조하는곳이 다 다름.
이 그림을 참고해서 구조를 이해하고시작하자
저 밑에 그림은
arr[1][] 의 참조값이 바뀐것을 의미함.
package chap05;
import java.util.Arrays;
/*
* 2차원배열은 1차원배열의 참조변수의 배열 .(배열의 배열)
*/
public class ArrayEx07 {
public static void main(String[] args) {
int[][] arr = new int[2][3];
System.out.println("arr[2][3] : \n크기3의 배열 2개가 들어갈 자리를 만들어 주는 거라 생각");
//2행3열짜리 배열
// arr[0][0] = 10;
// arr[0][1] = 20;
// arr[0][2] = 30;
// arr[1][0] = 40;
// arr[1][1] = 50;
// arr[1][2] = 60;
arr[0] = new int[] {10,20,30};
arr[1] = new int[]{40,50,60};
System.out.println("참조값이 다른것을 확인 ");
System.out.println("arr참조값:"+arr);
System.out.println("arr[0]참조값:"+arr[0]);
System.out.println("arr[1]참조값:"+arr[1]+"\n");
System.out.println("arr.length(가로 행의 길이) :"+arr.length);
System.out.println("arr[0].length(0행의 열 길이) : "+arr[0].length);
System.out.println("arr[1].length(1행의 열 길이) :"+arr[1].length+"\n");
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print("arr["+i+"]["+j+"]="+arr[i][j]+" ");
}System.out.println();
}
System.out.println();
int k = 0;
for (int[] is : arr) {
String string = Arrays.toString(is);//배열arr를 string으로변경
System.out.printf("arr["+k+"] : ");
++k;
System.out.println(string);
}
System.out.println("\narr[1]의 객체변경");
System.out.println("변경 전 참조변수 :"+arr[1]);
int h=0;
int[] arr1 = {1,2,3,4,5};
arr[1] = arr1;
System.out.println("변경 후 참조변수 :"+arr[1]);
for (int[] is : arr) {
String string = Arrays.toString(is);
System.out.printf("arr["+h+"] : ");
h++;
System.out.println(string);
}
// arr[1].length==5
}
}
arr[2][3] :
크기3의 배열 2개가 들어갈 자리를 만들어 주는 거라 생각
참조값이 다른것을 확인
arr참조값:[[I@372f7a8d
arr[0]참조값:[I@63961c42
arr[1]참조값:[I@65b54208
arr.length(가로 행의 길이) :2
arr[0].length(0행의 열 길이) : 3
arr[1].length(1행의 열 길이) :3
arr[0][0]=10 arr[0][1]=20 arr[0][2]=30
arr[1][0]=40 arr[1][1]=50 arr[1][2]=60
arr[0] : [10, 20, 30]
arr[1] : [40, 50, 60]
arr[1]의 객체변경
변경 전 참조변수 :[I@65b54208
변경 후 참조변수 :[I@3b9a45b3
arr[0] : [10, 20, 30]
arr[1] : [1, 2, 3, 4, 5]
int[][]arr ={{10,20}, {30,40},{50,60}};
이렇게 선언과 초기화를 동시에 할 수 있다
package chap05;
public class ArrayEx08 {
public static void main(String[] args) {
int[][] arr1 = new int[3][2];
arr1[0] = new int[]{10,20};
arr1[1] = new int[]{30,40};
arr1[2] = new int[]{50,60};
int[][]arr ={{10,20},
{30,40},
{50,60}};
System.out.println("==arr1==");
for (int i = 0; i < arr1.length; i++) {
for (int j = 0; j < arr1[i].length; j++) {
System.out.print("arr["+i+"]["+j+"]="+arr1[i][j]);
if(j!=arr1[i].length-1) {System.out.print(",");} //마지막 열 제외하고 , 를 찍는다
}System.out.println();
}
System.out.println("==arr==");
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print("arr["+i+"]["+j+"]="+arr[i][j]);
if(j!=arr[i].length-1) {System.out.print(",");}
}System.out.println();
}
}
}
==arr1==
arr[0][0]=10,arr[0][1]=20
arr[1][0]=30,arr[1][1]=40
arr[2][0]=50,arr[2][1]=60
==arr==
arr[0][0]=10,arr[0][1]=20
arr[1][0]=30,arr[1][1]=40
arr[2][0]=50,arr[2][1]=60
4-5 ) 가변배열 (2차원배열)
2차원 배열의 열의 크기를 지정하지않고
원하는 크기로 배열을 만들 수 있다.
public class ArrayEx09 {
public static void main(String[] args) {
int arr[][] = new int[3][]; //가변배열 (3행짜리 배열)(열은 알아서)
arr[0] = new int[] {10,20};
arr[1] = new int[] {30,40,50};
arr[2] = new int[] {60};
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.print("arr["+i+"]["+j+"]="+arr[i][j]);
if(j!=arr[i].length-1) {System.out.print(", ");}
}System.out.println();
}
}
}
arr[0][0]=10, arr[0][1]=20
arr[1][0]=30, arr[1][1]=40, arr[1][2]=50
arr[2][0]=60
행의크기를 가변으로 만드는 건 안돼!!!!
int [][] arr2 = new int[][2];
arr2[0] = new int[]{1,2};
arr2[1] = new int[]{4,5};
4-6 ) 배열의 복사
*
* 배열의 복사 or 크기변경
*새로운 배열 객체 생성해 배열 요소값을 복사
* 1. for구문을 이용 요소 하나하나를 복사
원본배열보다 크기가 큰 새로운 배열 하나를 만든다
그 후 원본배열의 크기만큼 for문을 돌려 새로만든 배열요소에 넣는다
하나 추가된 요소에는 다음과 같이 모든요소를 더해서 넣거나
넣지않는다면 0 이 들어갈 거다
* 2. System.arraycopy()함수 이용
똑같이 크기가 더 큰 배열을 하나 만들어주고
System.arraycopy(원본배열 , 복사 할 원본배열의 시작 index , 새로운 배열 , 새로운 배열의 시작index , 가져 올 요소의 갯수)
ex) System.arraycopy(arr2 , 0 , arr3 , 1 , arr2.length )
* 3..Arrays.copyOf() 함수이용
자료형 [ ] 배열명 = Arrays.copyOf(복사 할 배열 , 가져올 갯수(0번부터시작))
ex) int [] arr4 = ArrayscopyOf(arr3.5)
arr3의 0번부터 5개의 인덱스를 arr4에 저장
* 4. 얕은복사 (객체 그대로를 복사함)
arr5 = arr4
그냥 객체를 복사하는거임 (참조변수가 같아짐)
arr4 or arr5 하나라도 건드리면 둘다바뀌게됨
package chap05;
import java.util.Arrays;
public class ArrayEx10 {
public static void main(String[] args) {
int [] arr1 = {10,20,30};
System.out.println("arr1 : "+Arrays.toString(arr1)+"\n");
//arr1 배열보다 더 큰 배열을 생성해
//arr1의 배열값저장 후 합계를 마지막요소에저장
//arr1.length = 4 ; 크기변경은 불가능
int [] arr2 = new int[arr1.length+1];
System.out.println("1.for문을 이용해 복사");
//for문으로 배열값 복사하기
for (int i = 0; i < arr1.length; i++) {
arr2[i] = arr1[i];
arr2[arr1.length]+= arr1[i];
}
System.out.printf("arr2 : ");
for(int a : arr2) {
System.out.print(a);
if(a!=arr2[arr1.length]) {
System.out.print(",");}
}System.out.println();
//2 System.arratcopy()함수 이용
System.out.println("\nSystem.arraycopy()함수");
int[] arr3 = new int[arr2.length+5]; //arr2 크기보다 5가 큰 배열 생성
System.arraycopy(arr2, 0, arr3, 2, arr2.length);
//arr2의 0번부터의 값을
//arr3의 2번인덱스~arr2.length까지 넣는다
//arraycopy(원본배열, 복사 할 원본배열의시작index , 복사배열 ,복사배열의시작index , 가져올 요소의 갯수)
System.out.print("arr3 : ");
for (int i : arr3) {
System.out.print(i+",");
}System.out.println();
//3.Arrays.copyOf() 함수이용
System.out.println("\nArrays.copyOf() 함수");
int[] arr4 = Arrays.copyOf(arr3, 4); //arr3의 4개의요소를 복사한다.
System.out.printf("arr4 : ");
for (int i : arr4) {
System.out.print(i);
if(i!=arr4[arr4.length-1]) {
System.out.print(",");
}
}System.out.println();
System.out.println("\n얕은복사(그냥 참조변수를 복사하는거임 )"); //객체 자체가복사됨
int[] arr5 = arr4;
System.out.println("arr4(참조변수) : "+arr4);
System.out.println("arr5(참조변수) : "+arr5);
System.out.printf("arr5 : ");
for (int i : arr5) {
System.out.print(i);
if(i!=arr5[arr5.length-1]) {
System.out.print(",");
}
}System.out.println();
System.out.print("\narr1 : ");
for (int i : arr1) {
System.out.print(i);
if(i!=arr1[arr1.length-1]) {
System.out.print(",");
}
}System.out.println();
System.out.print("arr2 : ");
for (int i : arr2) {
System.out.print(i);
if(i!=arr2[arr2.length-1]) {
System.out.print(",");
}
}System.out.println();
System.out.print("arr3 : ");
for (int i : arr3) {
System.out.print(i+",");
}System.out.println();
System.out.print("arr4 : ");
for (int i : arr4) {
System.out.print(i+",");
}System.out.println();
System.out.print("arr5 : ");
for (int i : arr5) {
System.out.print(i);
if(i!=arr5[arr5.length-1]) {
System.out.print(",");
}
}System.out.println();
}
}
arr1 : [10, 20, 30]
1.for문을 이용해 복사
arr2 : 10,20,30,60
System.arraycopy()함수
arr3 : 0,0,10,20,30,60,0,0,0,
Arrays.copyOf() 함수
arr4 : 0,0,10,20
얕은복사(그냥 참조변수를 복사하는거임 )
arr4(참조변수) : [I@548c4f57
arr5(참조변수) : [I@548c4f57
arr5 : 0,0,10,20
arr1 : 10,20,30
arr2 : 10,20,30,60
arr3 : 0,0,10,20,30,60,0,0,0,
arr4 : 0,0,10,20,
arr5 : 0,0,10,20
@@ 5) 배열을 이용한 문제풀이 @@
숫자를 입력받아
2진수 8진수 10진수 16진수로 변경하시오
package chap05.hard_ex;
import java.util.Scanner;
/*
10진수를 2,8,10,16 진수로 변경하기
[결과]
10진수 값을 입력하세요
16
16의 2진수 :10000
16의 8진수 :20
16의 10진수 :16
16의 16진수 :10
*/
public class Test11 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
System.out.print("10진수 입력 : ");
int num = scan.nextInt();
int Nnum = num;
int i=0;
int[] two = new int[16];
//2진수
while(Nnum>0) {
two[i++] = Nnum%2;
Nnum /=2;
}
System.out.print(num+"의 2진수 : ");
for (int j = i-1; j >=0; j--) {
System.out.print(two[j]);
}System.out.println("");
//8진수
int g=0;
int Nnum2 = num;
int[] eigth = new int[16];
while(Nnum2>0) {
eigth[g++] = Nnum2%8;
Nnum2 /=8;
}
System.out.print(num+"의 8진수 : ");
for (int k = g-1; k >=0; k--) {
System.out.print(eigth[k]);
}System.out.println("");
//10진수
System.out.println(num+"의 10진수 : "+num);
//16진수
int Nnum3 = num;
char[] charArray = "0123456789abcdef".toCharArray();
char[] sixteen = new char[16];
int o =0;
while(true) {
sixteen[o++] = charArray[Nnum3 % 16];
Nnum3/=16;
if(Nnum3==0)break;
}
System.out.print(num+"의 16진수 : ");
for (int j = o-1; j >=0; j--) {
System.out.print(sixteen[j]);
}System.out.println();
System.out.println("@자바 제공하는 함수로 사용@");
String binaryString = Integer.toBinaryString(num);
System.out.println("10->2진수 : "+binaryString);
String octalString = Integer.toOctalString(num);
System.out.println("10->8진수 : "+octalString );
String hexString = Integer.toHexString(num);//toHexString으로하면 소문자로 반환
System.out.println("10->16진수 : "+hexString.toUpperCase());
}
}
10진수 입력 : 24
24의 2진수 : 11000
24의 8진수 : 30
24의 10진수 : 24
24의 16진수 : 18
@자바 제공하는 함수로 사용@
10->2진수 : 11000
10->8진수 : 30
10->16진수 : 18
문제 5-2)
package chap05.test2;
import java.util.Arrays;
/*
* int[][] score = {
{90,80,70},
{95,85,75},
{70,80,75},
{75,70,85},
{70,75,80}
};
* score 배열보다 가로 세로가 1씩 더큰 배열 result 배열 생성하기.
* score 배열의 내용을 result에 저장하고,
* 각 추가된 행과 열에는 각 행과 열의 합을 저장하고, result 배열의 내용 출력하기
*
* [결과]
90 80 70 240 [5][0] === 00 10 20 30 40 (총 5개)
95 85 75 255
70 80 75 225
75 70 85 230
70 75 80 225
400 390 385 1175
*/
public class Test3 {
public static void main(String[] args) {
int[][] score = {
{90,80,70},
{95,85,75},
{70,80,75},
{75,70,85},
{70,75,80}
};
int a = score.length; //행
int b= score[0].length; //열
int[][] result = new int[a+1][b+1];
//result배열의크기 : score배열의 행 , 열 1씩 큰 배열
for (int i = 0; i < a; i++) {
for (int j = 0; j < b; j++) {
result[i][j] = score[i][j];
result[i][b] += score[i][j];// 하나의 행의 열 합을 저장 (가로의 합)
result[a][j] += score[i][j]; // 하나의 열의 행 합을 저장( 세로의 합)
//result[a][0] += score[0][0] + score[1][0] +....score[score.length][0]
//result[a][1] += score[0][1] + score[1][1] +....score[score.length][1]
}
result[a][b] += result[i][b]; // 마지막 열의 합을 모두 더한값 저장 (세로의 합)
}
for (int[] is : result) {
System.out.println(Arrays.toString(is));
}System.out.println();
}
}
[90, 80, 70, 240]
[95, 85, 75, 255]
[70, 80, 75, 225]
[75, 70, 85, 230]
[70, 75, 80, 225]
[400, 390, 385, 1175]
예제 5-3)
command line에서 숫자로 이루어진 문자를 두개 받아서 두수의 공약수를 구하시오
int num1 = Integer.parseInt(args[0])
[결과]
10과 20 의 공약수 : 1,2,5,10,
command line 입력하려면
if(args.length !=2) {
System.out.println("commandLine에 두개의 파라미터만");
return;
}
로 args 배열의 길이가 2가 아니라면
경고문을 출력하고 조건문종료시킨다.
args배열 입력하는방법은
일단 경고문을 뜨게 한 후
우클릭 -> runAs -> run configuration-> argument 에
입력을 하면 된다
2개의 문자 입력시 문자사이에 space바를 하지않으면
1개의 문자로 인식함!!!!
package chap05.test2;
public class Test2 {
public static void main(String[] args) {
if(args.length !=2) {
System.out.println("commandLine에 두개의 파라미터만");
return;
}
int int1 = Integer.parseInt(args[0]);
int int2 = Integer.parseInt(args[1]);
for (int i = 0; i < args.length; i++) {
System.out.println("args["+i+"] : "+args[i]);
}
//args 입력 할떄 space를 누르지않는다면 배열의요소가 하나가됨 args.length == 1
//띄어쓰기로 요소를 분리해서 저장하자
int i=0;
System.out.print(int1+"와"+int2+"의 공약수 : ");
while(true) {
++i;
if(int1%i==0 && int2%i==0) {
System.out.print(i+",");
}
if(i>int1 || i>int2) {
break;
}
}
}
}
args[0] : 10
args[1] : 20
10와20의 공약수 : 1,2,5,10,
예제 5-4)
오른쪽 대각선으로 내려가는별을보면 0~~10
왼쪽대각선 : 10~~~0 을 보고 법칙을 찾자
package chap05.test2;
import java.util.Arrays;
import java.util.Scanner;
public class Test5_1 {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
while(true) {
System.out.print("크기를 입력 : ");
int size= scan.nextInt();
if(size%2==0) {
System.out.println("홀수만 입력하세요");
}
else {
String[][] a = new String[size][size];
int b=0;
int c=(a.length-1);
//String 배열의 초기화는 필수임
//초기화안할시 다 null값이므로 다른것을 찍을 수 없게됨
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
a[i][j] = " ";
}
}
///////////X 표시를 찍는 부분 ////////////////////
for (int i = 0; i <= size; i++) {
for (int j = 0; j < size; j++) {
if(j==b || j==c) {
a[i][j] = "X";
//a[0][10] a[0[0]
//a[1][9] a[1][1]
//a[6][4] a[6][6]
//a[7][3] a[7][7]
}
}b++;c--;
}
// for (int i = 0; i < size; i++) {
// a[i][i] = "X";
// a[i][size-1-i] = "X";
// //a[0][0]과 a[0][10] , a[1][1] 과 a[1][9] ......
// //a[6][6] 과 a[6][4] ......만 X이찍힘
// } 이 방법도 가능 ( 이게 더 명확함)
//
/////////////출력부분//////////////
for (int i = 0; i < size; i++) {
for (int j = 0; j < size; j++) {
System.out.print(a[i][j]+" ");
}System.out.println();
}break;
}
}
}
}