전체적인 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.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 배열의 길이와 인덱스
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[ ]를 생략할 수 없다.
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.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.4 커맨드 라인을 통해 입력받기
자 이것은 총 3가지의 방법이 있는데
내가 성공한 것은 2가지이다.
"일단 커맨드 라인을 사용하는 이유는 무엇일까?
그것은 args 배열에 문자열을 저장하는 것을
프로그램 자체를 변경하지 않고 하기 위해서"이다.
여기서 중요한 것은 ①문자열로 저장된다는 것!
그리고 저장시 ②띄어쓰기로 각각의 요소가 저장되는데
그 요소가 띄어쓰기를 가지고 있다면..
예를들어 Hello World라면
Hello와 World로 저장되지 않게
"Hello World"로 저장해야 한다
자 방법을 알아본다.
①
②
③ cmd 창을 이용하는 방법인데 잊어버려서 나중에 추가하도록 하겠다.
이 방법은 실패했기 때문에 다시 성공하면 올리겠다.
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]));
}
}
}