chapter05 배열(array)

byeol·2022년 7월 9일
0

Java의 정석

목록 보기
7/9
전체적인 Flow
1.배열
1.1 배열이란
1.2 배열의 선언과 생성
1.3 배열의 길이와 인덱스
1.4 배열의 초기화
1.5 배열의 복사
1.6 배열의 활용
2. String배열
2.1 String배열의 선언과 생성
2.2 String배열의 초기화
2.3 char배열과 String클래스
2.4 커맨드 라인을 통해 입력받기
3. 다차원 배열
3.1 2차원 배열의 선언과 인덱스
3.2 2차원 배열의 초기화
3.3 가변 배열
3.4 다차원 배열의 활용

1.배열

  • 1.1 배열이란
    같은 타입의 여러 변수를 하나의 묶음으로 다루는 것

  • 1.2 배열의 선언과 생성

    • 선언: 생성되는 배열을 다루기 위한 참조변수(주소값 저장)를 위한 저장 공간이 만들어지는 것
    int[] arr ;//1
     int arr1[];//2
    • 생성: 배열을 위한 공간과 그 공간에 저장된 값이 저장됨+ 참조변수에 배열의 주소값이 저장됨.
    int[] arr=new int[5];
    int[] arr1= new int[]{1,2,3,4};
    int[] arr2={1,2,3};
  • 1.3 배열의 길이와 인덱스

    • 배열의 길이=배열 이름.length
      0인 배열도 생성할 수 있다.
    int[] a=new int[0];
    int[] b=new int[]{};
    int[] c={};
    • 배열 길이 변경하기
      사실 배열의 길이는 변경할 수 없으며 배열의 길이는 상수이다
      그러나 변경할 수 있는 방법이 하나 있는데
      그것은 현재 배열보다 길이가 긴 새로운 배열을 만들고 여기에 기존 배열의 값을 복사하는 것이다.
  • 1.4 배열의 초기화

    int[] arr=new int[5];//자동적으로 기본값으로 초기화
    int[] arr1= new int[]{1,2,3,4};
    int[] arr2={1,2,3};
    
    int[] arr3;
    arr3=new int[]{1,2,3,4};
    //arr3={1,2,3,4}; 에러

    위와 먼저 생성-> 선언하는 경우에는new int[ ]를 생략할 수 없다.

    • 배열의 출력
      초기화를 하고 나면 이제 배열에 어떤 값이 저장되었는지 출력을 해야한다.
      "어떤 방법이 있을까?"
      사실은 아주 간단하다. ① for문을 이용하는 것!!
      하지만 더 간단한 방법이 있다.
      바로 ② Arrays.toString()이라는 함수를 이용하는 것이다!
      "왜 우리는 System.out.println(배열이름); 이렇게 바로 출력할 수 없는 것인가?" 그 이유는 "배열이름=참조변수"이기 때문이다.
      따라서 저 실행문의 결과는 "배열의 주소"가 될 것이다.
      그러나 예상과 다르게 "타입@주소"가 나온다.
      하지만 예외적으로 바로 출력할 수 있는 경우가 있는데
      ③char타입의 배열의 경우는 각 요소가 구분자 없이 그대로 출력된다.
  • 1.5 배열의 복사
    앞서 배운 1.3에 등장하는데 중간에 배열의 길이를 바꾸려면
    ① for문

    int[] arr=new int[5];
    ...
    int[] arr_copy=new int[arr.lenfth*2];
    for(int i=0;i<arr.length;i++){
     arr_copy[i]=arr[i];}
    arr=arr_copy;

    여기서 기억해야할 것은 배열의 변수는 참조변수라는 것
    즉 arr=arr_copy;라는 것은 arr에 arr_copy에 저장된 배열의 주소가 저장된다는 것이다. 그래서 이제 arr은 기존의 5길이에서 10길이가 되었다.
    ② System.arraycopy()
    이 방법은 앞서 배운 for문보다 더 효율적이다.
    한 줄로 끝낼 수 있기 때문이다.
    System.arraycopy(num,0,newNum,0,num.length)
    기존 num[0]에서 newNum[0]으로 num.length개를 복사한다.

  • 1.6 배열의 활용

public class ArrayEx5 {

	public static void main(String[] args) {
		int sum=0;
	    float average=0f;
	    
	    int[] score = {100,88,100,100,90};
	    //int[] score= new int[5];
	    //int[] score= new int[] {100,88,100,100,90};
	    
	    for(int i=0;i<score.length;i++)
	    { 
	    	sum=sum+score[i];
	    	
	    }
	    average=(float)sum/score.length;
	    //average=sum/(float)score.length;
	    
	   System.out.printf("sum=%d%n",sum);
	   System.out.printf("average=%f",average);
	}

}
public class ArrayEx8 {

	public static void main(String[] args) {
		int[] ball=new int[45];
		
		for (int i=0;i<ball.length;i++)
			ball[i]=i+1;

		int tmp=0;
		int n=0;
		
		for (int i=0;i<6;i++)
		{
			n=(int)(Math.random()*45);
			tmp=ball[i];
			ball[i]=ball[n];
			ball[n]=tmp;//만약에 n이 0~5사이일 수도 있음 그래서 바꿔야함.
			
		}
		for(int i=0;i<6;i++)
		   System.out.printf("%d ",ball[i]);
	}

}

2. String배열

  • 2.1 String배열의 선언과 생성

  • 2.2 String배열의 초기화
    String은 참조형 배열이 생성-> 각각의 배열 방에는 실제 값이 저장되는 공간의 주소가 저장된다.
    왜냐하면 String은 클래스이기 때문이다.
    따라서 String 배열은 기본형 배열이 아닌 참조형 배열이다.

String[] Name=new String[3];
Name[0]="KIM";
Name[1]="Yi";
Name[2]="Park";
//---------------
String[] Name=new String[3];
Name[0]=new String("KIM");
Name[1]=new String("Yi");
Name[2]=new String("Park");
//----------------
String[] Name={"KIM","Yi","Park"};
//----------------
String[] Name=new String[]{"KIM","Yi","Park"};

다 같은 코드이다.


public class ArrayEx13 {

	public static void main(String[] args) {
		//이것은 16진수의 값을 2진수로 바꾸는 것인데
		// 접근을 할 때
		// 진짜 16진수의 값을 가진 배열 하나
		// 2진수의 문자열을 가진 배열 하나
		char[] hex= {'1','F','4','9','C'};
		//'0'~'9':48~57
		//'A'~'Z':65~90
		//char의 유니코드는 연속적인 문자는 연속적인 값을 갖는다
		String[] binary= {"0000","0001","0010","0011",
				          "0100","0101","0110","0111",
				          "1000","1001","1010","1011",
				          "1100","1101","1110","1111"};
		//16진수는 0~9와 자리수가 넘어가는 A~F
       String result =""; 
		
		for(int i=0;i<hex.length;i++)
			{if(hex[i]>='0'&&hex[i]<='9')
			{
				result+=binary[hex[i]-'0']+" ";//내가 " "를 추가
			}else {
				result+=binary[hex[i]-'A'+10]+" ";
			}
		     
			}
		System.out.println("result="+result);
	}

}
  • 2.3 char배열과 String클래스
    • String 클래스의 주요 메서드
      ∎char charAt(index)
      String.charAt(0): String의 0번째 문자를 반환
      ∎int length()
      ∎String substring(int from, int to)
      어떤 String의 인덱스 from~ to-1번째까지 뽑음
      ∎boolean equals(Object obj)
      String.equals("Kim") 같은지 같으면 1 다르며 0
      ∎char[] toCharArray()
      String.toCharArray() 문자열을 문자 배열로 만듦
    • char배열 --String str=new String(charArray);--->String
    • String-----str.toCharArray()------------------->char배열
  • 2.4 커맨드 라인을 통해 입력받기
    자 이것은 총 3가지의 방법이 있는데
    내가 성공한 것은 2가지이다.

    "일단 커맨드 라인을 사용하는 이유는 무엇일까?
    그것은 args 배열에 문자열을 저장하는 것을
    프로그램 자체를 변경하지 않고 하기 위해서"
    이다.

    여기서 중요한 것은 ①문자열로 저장된다는 것!
    그리고 저장시 ②띄어쓰기로 각각의 요소가 저장되는데
    그 요소가 띄어쓰기를 가지고 있다면..
    예를들어 Hello World라면
    Hello와 World로 저장되지 않게
    "Hello World"로 저장해야 한다

    자 방법을 알아본다.




    ③ cmd 창을 이용하는 방법인데 잊어버려서 나중에 추가하도록 하겠다.
    이 방법은 실패했기 때문에 다시 성공하면 올리겠다.

3. 다차원 배열

  • 3.1 2차원 배열의 선언과 인덱스
    int [][] array;
    int array[][];
    int[] array[];

    int[][] array=new int[4][3]

  • 3.2 2차원 배열의 초기화
    int [][] array=new int[][]{{1,2,3},{4,5,6}};
    int [][] array={{1,2,3},{4,5,6}};

    <1차원 배열의 모습>

    <2차원 배열의 모습>
    여기서 각각이 어디를 향하고 있는가를 보자
    그러면 Name.length와 Name[0].length가 각각 얼마인지 알 수 있다.
    Name은 Name[0]을 향하고 있기 때문에 Name.length=5
    Name[0]은 Name[0][0]을 향하고 있기 때문에 Name[0].length=3

public class ArrayEx18 {

	public static void main(String[] args) {
		int[][] score=
			{
					{100,100,100},
					{20,20,20},
					{30,30,30},
					{40,40,40}
			};
		int sum=0;
		
		for(int i=0;i<score.length;i++)//행: 4번
			for(int j=0;j<score[i].length;j++)//열 3번
                System.out.printf("score[%d][%d]=%d%n",i,j,score[i][j]);
		
		System.out.println("score="+score);
		for (int[] tmp : score)//score이 향하는 곳 즉, 각 행의 처음 주소들
		{    System.out.println("tmp:score="+tmp); //
		     for (int i: tmp) { //tmp array의 각 값들이 향하는 곳
		    	 System.out.println("i:tmp="+i);
		    	 sum+=i;
		     }
	    }
	}

}
//score[2][0]=30
//score[2][1]=30
//score[2][2]=30
//score[3][0]=40
//score[3][1]=40
//score[3][2]=40
//score=[[I@6a5fc7f7
//tmp:score=[I@3b6eb2ec
//i:tmp=100
//i:tmp=100
//i:tmp=100
//tmp:score=[I@1e643faf
//i:tmp=20
//i:tmp=20
//i:tmp=20
//tmp:score=[I@6e8dacdf
//i:tmp=30
//i:tmp=30
//i:tmp=30
//tmp:score=[I@7a79be86
//i:tmp=40
//i:tmp=40
//i:tmp=40

public class ArrayEx19 {

	public static void main(String[] args) {
		int[][] score=
			{
					{100,100,100},
					{20,20,20},
					{30,30,30},
					{50,50,50},
					{40,40,40}
			};
		//총점과 평균 사람당, 과목당
		int Kor=0, Eng=0, Math=0;
		
		
		for(int[] tmp: score) {//for(int i=0;i<score.length;i++) {
			   int sum=0;
        	   float avg= 0.0f;   
			   Kor +=tmp[0];    //Kor+=score[i][0];
			   Eng +=tmp[1];    //Eng+=score[i][0];
			   Math +=tmp[2];  //Math+=score[i][0];
		       //개인 평균과 점수 알아보기
		        for(int per:tmp) {
		        	sum+=per;
		       }
		    	avg=sum/tmp.length;   
		    	System.out.printf("avg=%f,sum=%d%n",avg,sum);   
		       }System.out.println(Kor+","+Eng+","+Math);

	}

}
  • 3.3 가변 배열
    Array의 Array 중 마지막 Array 즉 열의 개수를 가변적으로 변동시킬 수 있다.
    int [][] array=new int[5][]

  • 3.4 다차원 배열의 활용

//배가 바다에 있는데 내가 찍은 좌표에 배가 있는지 찾아가는
import java.util.*;
public class MultiArrEx1 {

	public static void main(String[] args) {
		int [][] True_shipment = {
				{0,0,0,0,0,0,0,1,0,0},
				{1,0,1,0,0,0,0,1,0,0},
				{0,0,0,0,0,1,0,0,0,0},
				{1,0,0,1,1,0,0,1,1,0},
				{1,1,1,0,0,0,1,0,0,0},
				{1,0,1,0,0,0,0,0,0,0},
				{1,0,0,0,0,0,0,1,0,0},
				{0,0,1,0,0,0,0,1,0,0},
				{0,0,0,0,0,0,0,0,0,0},
				{1,0,0,0,0,0,0,0,0,0}
				};//10,10
		char [][] Board= new char[11][11]; 
		
		for(int i=1;i<=10;i++)
		{
			if (i==10)///유니코드 숫자는 0~9까지만 존재
				  {Board[0][i]=Board[i][0]='A';
				   break;}
			
			  Board[0][i]=Board[i][0]=(char)(i+'0');
		
		}
		
		Scanner scan =new Scanner(System.in);
		
		while (true){
		int x=scan.nextInt();
		int y=scan.nextInt();
		
		if (x<=0||x>10||y<=0||y>10)
		{System.out.println("다시 입력하시오>>");
		continue;
		} 
		
	    if (True_shipment[x-1][y-1]==1){
	    	Board[x][y]='O';
	    }else {
	    	Board[x][y]='X';
	    }

	    for(int i=0;i<11;i++)
		{
			System.out.println(Board[i]);//행마다 
			
		}System.out.println();
		}		
							
}
}
//빙고판을 만들고 내가 입력한 변수를 빙고에서 지워가는 예시
import java.util.*;
public class MultiArrEx2 {
public static void main(String[] args)
{
	 final int Size =5;
	 int x=0, y=0, tmp=0, input=0;
	 
	 Scanner scan= new Scanner (System.in);
	 //빙고 만들기 
	 int[][] bingo =new int [Size][Size];
	 
	 for(int i=0;i<Size;i++) {
		 for (int j=0;j<Size;j++)
		 { bingo[i][j]=Size*i+j+1;} 
		// System.out.println(bingo[i]); char array는 가능하나 
		// int array 는 불가능
		   System.out.println(Arrays.toString(bingo[i]));	 }//빙고판초기화끝
	 System.out.println("--------------------");
	 //자 이제 빙고판을 섞어보자~!!
	 for(int i=0;i<Size;i++) {
		 for(int j=0;j<Size;j++) {
			 x=(int)(Math.random()*5);
			 y=(int)(Math.random()*5);
			 tmp=bingo[i][j];
			 bingo[i][j]=bingo[x][y];
			 bingo[x][y]=tmp; 
		 }
		 System.out.println(Arrays.toString(bingo[i]));
	 }//빙고판 섞기 끝
	 
	 //빙고를 시작하자
	 do {
		 for (int i=0; i<Size;i++) {
		 System.out.println(Arrays.toString(bingo[i]));}
		 
		 System.out.println("숫자를 입력하시오(종료하려면 0)>");
		 input=scan.nextInt();
	
		 outer ://자 이제 입력한 값을 빙고판에서 찾아보자
		 for(int i=0;i<Size;i++) {
			 for(int j=0;j<Size;j++) {
				 if(bingo[i][j]==input) {
					 bingo[i][j]=0;
					 break outer;}
			 }
			 
			 
		 }//outer을 통해서 여기로 도착
		 
		 
	 } while(input!=0);//while 문 밖에 input 초기화 시켜줘라~ 이유는 모르겠습니다 
	 //지금은
	 //추후에 변수를 배우면 내용 추가
	 
	 
}
}
// 행렬의 곱셈
import java.util.Arrays;

public class MultiArrEx3 {
	public static void main(String[] agrs) {
		int[][] m1= {// 2X3
				{1,2,3},
				{4,5,6}	};
		int[][] m2={// 3X2
				{1,2},
				{3,4},	
				{5,6}};
		
		int Row = m1.length;
		int Col = m2[0].length;
		int M = m2.length; //m1[0].length
		int [][] m3=new int [Row][Col];
		// 이 부분을 이해하는데 조금 시간이 필요했다
       //아랫부분 복습하기 필수
		for(int i=0;i<Row;i++)//행 접근 크게 행부터
		 for(int j=0;j<Col;j++)//열 접근
			 for(int k=0;k<M;k++)
			     m3[i][j]+=m1[i][k]*m2[k][j];
		
		for(int i=0;i<m3.length;i++)
		{
			System.out.println(Arrays.toString(m3[i]));
		}
			 
		 
		
		
	}
	

}

profile
꾸준하게 Ready, Set, Go!

0개의 댓글