주말공부 or 복습

자바(Java) 복습 1 ( 반복문 , 조건문 , 배열 )

동곤일상 2025. 2. 9. 20:54
반응형

 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) :

 

실수(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;

			}
		}
	}
}