쿠릉쿠릉 쾅쾅 2021. 8. 29. 00:02
728x90

◎ 배열

  • 배열은 같은 타입의 여러 변수를 하나의 묶음으로 다루는 것
  • 배열은 참조값으로만 접근할 수 있음
  • 많은 양의 값(데이터)을 다룰 때 유용하다
  • 배열의 각 요소는 서로 연속적임
  • 배열의 인덱스 ㅡ 각 요소(저장공간)에 자동으로 붙는 번호
  • 인덱스(index)의 범위는 0부터 '배열길이-1' 까지

 

  • 여기서 배열 이름 score는 배열을 다루는데 필요한 참조변수일 뿐 값을 저장하기 위한 공간이 아님

 

 

 

 

배열의 선언과 생성

  • 배열을 다루기 위한 참조변수의 선언
  • 타입 또는 변수 이름 뒤에 대괄호 [] 를 붙여서 배열을 선언함
  • '타입[] 변수 이름' 선언 방식으로 쓰는거 선호 ㅡ 대괄호[ ]가 타입의 일부라고 생각하는게 좋음

 

// 선언 방법
타입[] 변수 이름;    // 배열 선언 (배열을 다루기 위한 참조변수 선언)
변수 이름 = new 타입[길이]   //  배열 생성 (실제 저장공간을 생성)


// ex.1
int [] score;    // int 타입의 배열을 다루기 위한 참조변수 score 선언
score = new int [5]  // int 타입의 값 5개를 저장할 수 있는 배열 생성

score[3] = 100;  // 배열 4번째 요소에 100을 저장함

int value = score[3];  // 배열 score의 4번째 요소의 값을 value에 저장함



// ex.2
int[] score = new int[5];  // 배열의 선언과 생성을 동시에

 

 

 

 

배열의 길이

  • 배열이름.length 
  • 배열의 길이는 int형 상수임
  • 배열은 한번 생성하면 그 길이를 바꿀 수 없다.
  • 배열의 길이는 0 또는 양의 정수이어야하며 최대값은 int 타입의 최대값인 약 20억임
  • 배열의 길이가 0인 배열도 생성 가능함

 

// ex.1
int[] arr = new int[5];  // 길이가 5인 int 배열
int tmp = arr.length;   // arr.length의 값은 5이고 tmp 에 5가 저장 됨



// ex.2  배열의 길이가 0인 배열들
int[] arr = new int[0];
int[] arr2 = new int[]{};
int[] arr3 = {};

 

 

 

 

 

 

 

 

배열의 초기화

  • 배열의 각 요소에 처음으로 값을 저장하는 것
  • 배열은 생성과 동시에 자동적으로 자신의 타입에 해당하는 기본값으로 초기화 됨
// 배열 초기화 방법 1
int [] score = new int[5];
score[0] = 50;
score[1] = 60;
score[2] = 70;
score[3] = 80;
score[4] = 90;



// 배열 초기화 방법 2
int[] score = new int[5];
for (int i=0; i < score.length; i++) {  // for문을 이용하려면 배열 값의 규칙이 필요함
    score[i] = i * 10 + 50;
}



// 배열 초기화 방법 3
int[] score = new int[]{50, 60, 70, 80, 90};


// 배열 초기화 방법 4   ← 주로 이 방법으로 씀
int[] score = {50,60,70,80,90};   // new int[]를 생략할 수 있음



// 배열 초기화 방법 4 주의사항
int [] score;

score = {50, 60, 70, 80 ,90};      // 에러. new int[] 를 생략할 수 없음

socre = new int[]{50,60, 70, 80, 90}; // ok

 

 

배열의 출력

  • 배열을 출력할 때, char 배열을 제외한 나머지 배열들은 인덱스 없이 'System.out.println(배열명)' 으로 쓰면 안됨.
  • for 문을 이용하여 '배열명[인덱스]' 로 배열 출력 가능
  • 주로 배열을 출력할 때는 'Arrays.toString(배열명)' 을 씀
    • 베열의 모든 요소를 '['첫번째 요소', '두번째 요소', ...]' 와 같은 형식의 문자열로 만들어서 반환함
    • import java.util.*;   추가 해야함

 

// ex.1
int[] iArr = {100, 95, 80, 70, 60};
System.out.println(iArr);   // [I@156643d4 와 같은 형식의 문자열이 출력됨


// ex.2
char[] chArr = {'a', 'b', 'c', 'd'};
System.out.println(chArr);  // abcd 가 출력됨


// ex.3   for 문을 이용한 배열 출력
int[] iArr2 = {50,60,80,70};
for(int i=0; i < iArr2.length; i++){
    System.out.println(iArr2[i]);    // 배열의 요소를 순서대로 하나씩 출력함
}



// ex.4  Arry.toString() 이용하여 배열의 모든 요소 출력  ← 주로 이 방법을 씀
import java.util.Arrays;   // ctrl + shift o  누르면 자동으로 import 문 추가됨

int[] iArr3 = {10,50,30,40};
System.out.println(Arrays.toString(iArr3));   // [10, 50, 30, 40]


// ex.5
int[] score = new int[5];
int k = 1;

score[0] = 50;
score[1] = 60;
score[k+1] = 70;  // score[2] = 70;
score[3]= 80;
score[4] = 90;

int tmp = score[k+2] + score[4];  // int tmp = score[3] + score[4] 

for(int i=0; i<5; i++) {
    System.out.printf("score[%d] : %d%n", i, score[i]);
}
System.out.printf("tmp:%d%n", tmp);		// 170





// ex.6
import java.util.Arrays;

int[] iArr1 = new int[10];
int[] iArr2 = new int[10];
int[] iArr3 = {10,20,30,40,50,60};
char[] chArr = {'a','b','c','d'};

// iArr1에 1~10 순차대로 값 지정하기
for(int i=0; i<iArr1.length;i++) iArr1[i] = i+1;

// iArr2에 1~10 랜덤으로 값 부여하기
for(int i=0; i<iArr2.length;i++) iArr2[i] = (int)(Math.random()*10) +1 ;

// iArr1 배열 출력하기
for(int i=0; i<iArr1.length; i++) System.out.print(iArr1[i] + ",");   // 1,2,3,4,5,6,7,8,9,10,
System.out.println();

// iArr2 배열 출력하기  ← 랜덤 숫자라 출력마다 값이 바뀜
System.out.println(Arrays.toString(iArr2));  // [3, 1, 8, 4, 9, 1, 7, 1, 3, 8]

// iArr3 배열 출력하기
System.out.println(Arrays.toString(iArr3));  // [10, 20, 30, 40, 50, 60]

// iArr3 배열 참조값 출력하기  ← 참조값이 출력마다 바뀔 수 있음
System.out.println(iArr3);  // [I@36aa7bc2

// chArr 배열 출력하기
System.out.println(chArr);  // abcd

 

 

 

배열 예제

// ex.1 배열 요소의 총합과 평균 구하기 

int sum = 0; // 총합을 저장하기 위한 변수
float average = 0f; // 평균을 저장하기 위한 변수

int[] score = {100, 88, 100, 100, 90};

for (int i = 0; i<score.length; i++){
    sum += score[i];
    
}

average = sum/(float)score.length;  // 계산 결과를 float 타입으로 얻으려 형변환

System.out.println("총합 : " + sum);   // 총합 : 478
System.out.println("평균 : " + average);  // 평균 : 95.6





// ex.2 배열의 요수 중에서 최대값과 최소값 구하기
int[] score = {79, 88, 91, 33, 100, 55, 95};

int max = score[0]; // 배열의 첫 번째 값으로 최대값 초기화
int min = score[0]; // 배열의 첫 번째 값으로 최소값 초기화

for (int i=1; i < score.length; i++) {   // 배열의 두 번째 요소부터 읽기 위해서 i를 1로 초기화
    if(score[i] > max){
        max = score[i];
    } else if (score[i] < min){
        min = score[i];
    }
} // end of for

System.out.println("최대값 = " + max);  // 최대값 : 100
System.out.println("최소값 = "+ min);  // 최소값 : 33






// ex.3 배열의 요소의 순서를 반복해서 바꿈 (숫자 섞기)
import java.util.Arrays;

int[] numArr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(numArr));

for (int i=0; i < numArr.length; i++){
    int n = (int)(Math.random()*10);  // 0~9 중의 한 값을 임의로 얻음
    
    // numArr[i] 와 numArr[n]의 값을 서로 바꿈 
    int tmp = numArr[i];
    numArr[i] = numArr[n];
    numArr[n] = tmp;
 
} //end of for

System.out.println(Arrays.toString(numArr));







// ex.4  배열의 요소의 순서를 반복해서 바꿈 (로또 번호 뽑기)
import java.util.Arrays;

int[] ball = new int[45]; // 45개의 정수값 저장하기위한 배열 생성

// 배열의 각 요소에 1~45 값 저장
for (int i=0; i < ball.length; i++){
    ball[i] = i+1;  // ball[0]에 1이 저장됨
}

System.out.println(Arrays.toString(ball));

int tmp = 0;  // 두 값을 바꾸는데 사용할 임시 변수
int j = 0; // 임의의 값을 얻어서 저장할 변수

//배열의 i번째 요소와 임의의 요소에 저장된 값을 서로 바궈서 값을 섞음
// 0번째 부터 5번째 요소까지 모두 6개만 바꿈
for(int i=0; i < 6; i++){
    j = (int)(Math.random()*45);  // 0~44 범위의 임의의 값을 얻음
    tmp = ball[i];
    ball[i] = ball[j];
    ball[j] = tmp;
}

//배열 ball의 앞에서 부터 6개의 요소를 출력한다
for(int i=0; i < 6; i++){
    System.out.printf("ball[%d] = %d%n", i, ball[i]);
}

 

 

배열의 길이 변경하는 방법

  • 더 큰 배열을 새로 생성함   →  기존 배열의 내용을 새로운 배열에 복사함

 

 

배열의 복사

  • 배열의 복사는 비효율적이기 때문에 처음부터 배열을 생성할 때, 기존 길이의 
  • for문을 이용해서 배열을 복사할 수 있음
    • 기존 배열의 길이보다 2배 정도의 길이로 생성하는것이 좋음
  • System.arraycopy() 를 이용한 배열 복사
    • 배열복사는 for 문보다 System.arraycopy() 가 더 효율적임

System.arrycopy() 사용방법
System.arraycopy() 예시

  • Arrays.copyOf(배열명, 복사할 요소의 개수)
    • import java.util.Arrays 추가 할 것
  • Arrays.copyOfRange(배열명, int from, int to)  ㅡ int to 인덱스 값은 포함 안됨
    • import java.util.Arrays 추가 할 것

 

 

System.arraycopy()   vs  Arrays.copyOf()

  • 서로 기능은 같음
  • System.arraycopy() 는 native 코드를 호출해서 속도면에서 2배 이상 빠름
  • Arrays.copyOf() 가 더 직관적임
  • 전체 길이를 전부 복사하거나, 복사 대상의 객체를 유지하지 않아도 된다면 Arrays.copyOf() 를 사용할 것
  • 복사하는 길이를 명시하거나, 객체를 유지해야 한다면 System.arraycopy() 를 사용할 것

 

 

 

예제

/* ex.1   for문을 이용한 배열 복사 */
int[] arr = new int[5];  // 기존 배열
int[] tmp = new int[arr.length*2];  // 기존 배열의 길이가 2배인 새로운 배열 생성

for(int i=0; i<arr.length; i++) tmp[i] = arr[i];  // arr[i] 값을 tmp[i] 값에 대입

// 기존 arr 배열의 참조값이 tmp 배열의 참조값으로 바뀜. 기존 arr 배열의 참조값이 사라져서 기존 arr 배열도 사라짐
arr = tmp;







/* ex.2 for 문을 이용한 배열복사2 */
import java.util.Arrays;

int[] arr = new int[5];

// arr 배열에 1~5 까지 순서대로 값 대입
for(int i=0; i<arr.length; i++) arr[i] = i+1;

// 변경전 arr 배열 출력
System.out.println("[변경전]");  // [변경전]
System.out.println(arr.length); // 5
System.out.println(Arrays.toString(arr));  // [1,2,3,4,5]

// 복사할 배열 생성
int[] tmp = new int[arr.length*2];
for(int i=0; i<arr.length; i++) tmp[i] = arr[i];
arr = tmp;

// 변경후 arr 배열 출력
System.out.println("[변경후]");  // [변경후]
System.out.println(arr.length);  // 10
System.out.println(Arrays.toString(arr)); // [1,2,3,4,5,0,0,0,0,0]









/* ex.3   System.arraycopy()를 이용하여 배열 복사하기 */
char[] abc = {'A', 'B', 'C', 'D'};
char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

System.out.println(abc);   // ABCD
System.out.println(num);   // 0123456789

// 배열 abc와 num을 붙여서 하나의 배열(result)로 만듦
char[] result = new char[abc.length + num.length];
System.arraycopy(abc, 0, result, 0, abc.length);
System.arraycopy(num, 0, result, abc.length, num.length);
System.out.println(result);   // ABCD0123456789

// 배열 abc를 배열 num의 첫 번째 위치로부터 배열 abc의 길이만큼 복사
System.arraycopy(abc, 0, num, 0, abc.length);
System.out.println(num);   // ABCD456789

// 배열 num의 인덱스 6위치에서 배열 abc의 첫 번째 위치로부터 3개 복사
System.arraycopy(abc, 0, num, 6, 3);
System.out.println(num);   // ABCD45ABC9




// ex.4   Arrays.copyOf()
import java.util.Arrays;

int[] arr = {0,1,2,3,4,5,6};
int[] arr2 = Arrays.copyOf(arr, 3);  //  [0,1,2]
int[] arr3 = Arrays.copyOf(arr, 9);  //  [0,1,2,3,4,5,6,0,0]
int[] arr4 = Arrays.copyOf(arr, arr.length); // [0,1,2,3,4,5,6]

System.out.println(Arrays.toString(arr2));  // [0,1,2]
System.out.println(Arrays.toString(arr3));	// [0,1,2,3,4,5,6,0,0]
System.out,println(Arrays.toString(arr4)); // [0,1,2,3,4,5,6]




// ex.5 Arrays.copyOfRange()
import java.util.Arrays;

int[] arr = {0,1,2,3,4,5,6};
int[] arr2 = Arrays.copyOfRange(arr, 2, 4);  // [2,3]
int[] arr3 = Arrays.copyOfRange(arr, 3, 9);   // [3,4,5,6,0,0]

System.out.println(Arrays.toString(arr2));  // [2,3]
System.out.println(Arrays.toString(arr3));	// 	[3,4,5,6,0,0]

 

 

 

 

 

 

배열의 활용

  • 총합과 평균
  • 최대값과 최소값
  • 섞기(shuffle)
  • 임의의 값으로 배열 채우기
  • 정렬하기(sort)
  • 빈도수 구하기
/* ex.1  총합과 평균 */
int sum = 0;   // 총합을 저장하기 위한 변수
float average = 0f;  // 평균을 저장하기 위한 변수
int[] score = {100,90,88,100,100};

// 총합
for(int i=0; i<score.length; i++) sum += score[i];

// 평균
average = sum/(float)score.length; 

System.out.println(sum);  // 478
System.out.println(average); // 95.6



/* ex.2  최대값과 최소값 */
int[] score = {79, 88, 91, 33, 100, 55, 95};
int max = score[0];  // 배열의 첫 번째 값으로 최대값을 초기화
int min = score[0];  // 배열의 첫 번째 값으로 최소값을 초기화

for(int i=0; i<score.length; i++){
    if (max < score[i]) max = score[i];
    else if (min > score[i]) min = score[i];
}

System.out.println(max);  // 100
System.out.println(min);  // 33




/* ex.3-1  순서 섞기(shuffle) ㅡ 카드 뽑기 */
import java.util.Arrays;

int[] score = new int[10];
for (int i=0; i<score.length; i++) score[i] = i;

// 순서 섞기 전
System.out.println(Arrays.toString(score));  // [0,1,2,3,4,5,6,7,8,9]

for (int i=0; i<score.length; i++){
    // score[i] 값이랑 score[n] 값 서로 바꾸기
    int n = (int)(Math.random()*10);
    int tmp = score[i];
    score[i] = score[n];
    score[n] = tmp;
}

// 순서 섞기 후
System.out.println(Arrays.toString(score));  // [1, 0, 3, 4, 5, 9, 6, 7, 2, 8]  ← 실행마다 값이 다름







/* ex.3-2   순서 섞기(shuffle) ㅡ 로또 번호 생성 */
import java.util.Arrays;

// 로또 볼 번호 초기화
int[] ball = new int[45];
for(int i=0; i<ball.length; i++) ball[i] = i+1;

// 로또 볼 6개 값만 순서 섞기
for(int i=0; i<6; i++){
    int n = (int)(Math.random()*45);
    int tmp = ball[i];
    ball[i] = ball[n];
    ball[n] = tmp;
}

// ball 번호 6번째까지 값을 새로운 배열에 복사
int[] lotto =  Arrays.copyOf(ball,6);

System.out.println(Arrays.toString(lotto));  // [6, 1, 35, 9, 17, 40]  ← 실행마다 값이 달라짐



/* ex.4  임의의 값으로 배열 채우기 */
import java.util.Arrays;

int[] code = {-4, -1, 3, 6, 11};
int[] arr = new int[10];  // 배열 code에 저장된 값들 중 하나를 임의의 값으로 채울 배열 생성

for(int i=0; i<arr.length; i++){
    int n = (int)(Math.random()*code.length);
    arr[i] = code[n];
}

System.out.println(Arrays.toString(arr));  // [3, 3, 3, 6, -1, 6, -1, 11, -1, 3] ← 실행마다 값이 달라짐








/* ex.5  정렬하기(sort) ㅡ 오름차순으로 정렬하기  */
// 이 정렬방법은 버블 정렬(bubble sort) 방법임. 비효율적이지만 가장 간단함
int[] numArr = new int[10];
for(int i=0; i<numArr.length;i++) System.out.print(numArr[i] = (int)(Math.random()*10));

System.out.println();

for(int i=0; i<numArr.length-1; i++){
    boolean changed = false;  // 자리 바꿈이 발생했는지 체크함
    
    for(int j=0; j<numArr.length-1-i; j++){
        if(numArr[j] > numArr[j+1]){
            int temp = numArr[j];
            numArr[j] = numArr[j+1];
            numArr[j+1] = temp;
            changed = true;  // 자리바꿈이 발생했으니 true
        }  // end of if
    } // end for j
    
    if(!changed) break;  // 자리 바꿈이 없으면 반복문을 벗어남
    
    for(int k=0; k<numArr.length; k++) System.out.print(numArr[k]);
    System.out.println();
} // end for i





/* ex.6 빈도수 구하기 */
int[] numArr = new int[10];
int[] counter = new int[10];

for(int i=0; i<numArr.length; i++) System.out.print(numArr[i] = (int)(Math.random()*10));
System.out.println();

for(int i=0; i<numArr.length; i++) counter[numArr[i]]++;

for(int i=0; i<numArr.length; i++) System.out.printf("%d의 개수: %d%n", i, counter[i]);

 

 

 

 

 


 

◎ String 배열

  • 여러가지 문자열을 저장할 수 있는 배열
  • string은 기본형이 아닌 참조형임
  • 참조형 배열의 경우 배열에 저장되는 것은 객체의 주소임
  • 참조형 배열을 객체 배열이라고 부름

 

 

배열 선언과 생성

  • string[] name = new String[3];   // 3개의 문자열을 담을 수 있는 배열 생성

 

 

 

 

  • string 기본값이 null 이기 때문에 string 배열의 기본값도 null 로 초기화됨

 

자료형에 따른 기본값

 

 

// 배열의 선언과 생성을 동시에 함  ← 이 방법이 제일 많이 쓰임
String[] name = {"Kim", "Park", "Yi"};

 

 

 

 

 

예제

/* ex.1 */
String[] strArr = {"가위", "바위", "보"};

for(int i=0; i<10; i++){
    int tmp = (int)(Math.random()*3);  // 0~2 임의의 정수를 얻음 
    System.out.println(strArr[tmp]);
}




/* ex.2 */
String[] names = {"Kim", "Park", "Yi"};

for(int i=0; i <names.length; i++) System.out.printf("names[%d]: %s%n", i, names[i]);

names[0] = "Lee";

for(String tmp : names) System.out.println(tmp);


/* 출력문
names[0]: Kim
names[1]: Park
names[2]: Yi
Lee
Park
Yi
*/






/* ex.3  16진수를 2진수로 변환하는 예제 */
char[] hex = {'C', 'A', 'F', 'E'};
String[] binary ={
    "0000", "0001", "0010", "0011",
    "0100", "0101", "0110", "0111",
    "1000", "1001", "1010", "1011",
    "1100", "1101", "1110", "1111"
};

String result ="";

for(int i=0; i<hex.length; i++){
    if('0' <= hex[i] && hex[i] <= '9') result += binary[hex[i]-'0'];
    else result += binary[hex[i]-'A' +10];
}

System.out.println(new String(hex));   //  CAFE
System.out.println(result);   // 1100101011111110

 

 

 

 


◎ String 클래스

  • String 클래스 = char[] 배열 + 메서드(기능)
  • String 클래스는 내용을 변경할 수 없다. (read only) 
  • 변경 가능한 문자열을 다루려면, StringBuffer 클래스를 사용하면 됨
// 문자열 str 의 내용이 변경되는 것 같지만, 문자열은 변경할 수 없으므로 새로운 내용의 문자열이 생성 된 것임
String str = "Java";
str +=  "8";   
System.out.println(str);  // "Java8"

 

 

 

 

String 클래스의 주요 메서드

메서드 결과 값의 값 타입 설명
charAt(int index) char 문자열에서 해당 위치(index)에 있는 문자를 반환함
length() int 문자열의 길이를 반환함
substring(int from, int to) String 문자열에서 해당 범위 (from~to)의 문자열을 반환함 (to는 포함 안 됨)
equals(object obj) boolean 문자열의 내용이 같은지 확인한다. 같으면 true, 다르면 false
toCharArray() char 문자열을 문자배열( char[] )로 변환해서 반환함

 

예제

// ex.1   charAt(int index)
// string 클래스의 문자열을 index로 문자(char) 구하기 
String str = "ABCDE";
char ch = str.charAt(3);
System.out.println(ch); // D





// ex.2  length()
// string 클래스의 문자열 길이 구하기
String str = "ABCDE";
System.out.println(str.length()); // 5





// ex.3   substring(int from, int to)
// string 클래스의 문자열의 index 범위를 이용하여 문자열 구하기
String str = "012345";
String tmp = str.substring(1,4);   // str에서 index 범위 1~4의 문자들을 반환
System.out.println(tmp);  // 123





// ex.4-1   equals(object obj)
// string 클래스 같나 안같나 확인. 대소문자 구별함
String str = "ABC";
String str2 = "ABC";
String str3 = "abc";

System.out.println(str.equals(str2));  // true
System.out.println(str.equals(str3)); // false



// ex.4-2   equalsIgnoreCase(object obj)
// string 클래스 같나 안같나 확인. 대소문자 구별 안함
String str = "ABC";
String str2 = "ABC";
String str3 = "aBc";

System.out.println(str.equalsIgnoreCase(str2));   // true
System.out.println(str.equalsIgnoreCase(str3));   // true

//ex.5  toCharArray()
// string 클래스 문자열을 char[] 배열로 바꾸기
String str = "ABCD";
char[] ch = str.toCharArray();
System.out.println(ch);  //ABCD

 

 

 

 

char 배열과 String 클래스의 변환

char[] chArr = {'A', 'B', 'C', 'D'};
String str = new String(chArr);    // char 배열 → String
char[] tmp = str.toCharArray();  // String  → char 배열

 

 

/* ex.1 */
String src = "ABCDE";

for(int i=0; i<src.length(); i++){
    char ch = src.charAt(i);
    System.out.print(ch);  // ABCDE
}
System.out.println();

char[] chArr = src.toCharArray();
System.out.println(chArr);  // ABCDE




/* ex. 2*/
String source = "SOSHELP";
String[] morse = {
	".-", "-...", "-.-", "-..", ".",
	"..-.", "--.", "....", "..", ".---",
	"-.-", ".-..", "--", "-.", "---",
	".--.", "--.-", ".-.", "...", "-",
	"--.."
};	

String result = "";
for(int i=0; i< source.length(); i++) result += morse[source.charAt(i) - 'A'];

System.out.println(source);   // SOSHELP
System.out.println(result);   // ...---.........-...--.

 

 

 


 

 

◎ 커맨드라인 입력 받기

 

 

이클립스창에서 커맨드 라인 입력 받기

  • 매개변수 입력 하는 법
    • 이클립스 → Run 카테고리 → Run Configurations... → (x)= Arguments → Program arguments: →  매개변수 입력 → run
    • 매개변수를 입력하지 않을 경우 참조변수 'args' 의 값은 'null' 임.
  • 매개변수 입력시 공백으로 매개변수 구분함. 만약에 공백이 포함하는 문자열일경우 " " 로 구분함

 

 

/* ex.1 */
// 매개변수 입력
if(args != null){
    System.out.println(args.length);
    for(int i=0; i<args.length; i++) System.out.println(args[i]);
}



/* ex.2 */
// 매개변수 입력 → 123 + 235
if(args.length != 3){   // 입력된 값의 개수가 3개가 아니라면
    System.exit(0);   // 프로그램 종료
}

int num1 = Integer.parseInt(args[0]);
char op = args[1].charAt(0);
int num2 = Integer.parseInt(args[2]);
int result = 0;

switch(op){
    case '+':
        result = num1 + num2;
        break;
    case '-':
        result = num1 - num2;
        break;
    case '*':
        result = num1 * num2;
        break;
    case '/':
        result = num1 / num2;
        break;
    default :
        System.out.println("지원되지 않는 연산입니다.");
}

System.out.println(result);

 

 

 

 

 

 


 

 

 

◎ 2차원 배열 

  • 2차원 배열의 각 요소에 접근하는 방법은 '배열이름[행index][열index]'

 

 

 

 

2차원 배열 생성

 

참고) 다차원 배열 생성시 타입에 대괄호 [ ] 를 차원의 수만큼 넣으면 됨.

참고) 행은 세로, 열은 가로

 

 

// 4행 3열의 2차원 배열 생성
int[][] score = new int[4][3]

// 값 생성
score[0][0] = 100;   // score의 1행 1열에 100 저장
System.out.println(score[0][0]);  // 100

 

 

 

4행 3열의 2차원 배열

 

 

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





// 2차원 배열 초기화 2   ← 자주 쓰임
int[][] arr2 = {{1,2,3},{4,5,6}};  //new int[][] 가 생략됨





// 2차원 배열 초기화2-2   ← 이렇게 자주 쓰임
int[][] arr2 = {
                    {1,2,3},   // 한줄, 한줄이 1차원 배열임
                    {4,5,6}    // 한줄, 한줄이 1차원 배열임
                };
                
                
                
              
              
              
/* ex.2 */
int[][] score = new int[4][3];  // 4행 3열 2차원 배열 생성
for(int i=0; i< score.length; i++){
    for(int j=0; j< socre[i].length; j++) { 
        score[i][j] = 10;   // 배열 score의 모든 요소를 10으로 초기화
    }
}




                
/* ex.1 */
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++){
    for(int j=0; j<score[i].length; j++){
        System.out.print(score[i][j] + " ");
    }
    System.out.println();
}


for(int[] tmp : score){  // score의 각 요소(1차원 배열 주소)를 tmp에 저장
    for(int i : tmp){   // tmp는 1차원 배열을 가리키는 참조변수
        sum += i;
    }
}

System.out.println(sum);

/* 출력값
100 100 100 
20 20 20 
30 30 30 
40 40 40 
570

*/




/* ex.3 */
int[][] score = {
    {100,100,100},
    {20,20,20},
    {30,30,30},
    {40,40,40},
    {50,50,50}
};

//과목별 총점
int korTotal=0, engTotal=0, mathTotal=0;

System.out.println("번호  국어  영어  수학  총점  평균  ");
System.out.println("=======================================");

for(int i=0; i<score.length; i++){
   //과목별 총합
   korTotal += score[i][0];
    engTotal += score[i][1];
    mathTotal += score[i][2];
    
    // 총점, 평균
    int sum = 0;
    float average = 0.0f;
    
    // 번호
    int num = i+1;
    System.out.print(num);
    
    for(int j=0; j<score[i].length; j++){
        sum += score[i][j];
        average = sum / score[i].length;
        
        System.out.printf("%5d", score[i][j]);
    }
    System.out.printf("%5d %5.1f%n", sum, average);
}

System.out.printf("총점: %3d, %3d, %3d%n", korTotal, engTotal, mathTotal);
System.out.println("=======================================");
/* 출력값
번호  국어  영어  수학  총점  평균  
=======================================
1  100  100  100  300 100.0
2   20   20   20   60  20.0
3   30   30   30   90  30.0
4   40   40   40  120  40.0
5   50   50   50  150  50.0
총점: 240, 240, 240
=======================================
*/

 

ex.1 배열 구조

 

 

 

 

 

 

 

예제

// ex.1
int[][] score = {                        // 4행 3열의 2차원 배열 생성
                    {100, 100, 100},
                    {20, 20, 20},
                    {30, 30, 30},
                    {40, 40, 40}
                };

int sum = 0;
 for(int i=0; i < score.length; i++){    // 행 반복문
     for(int j=0; j < score[i].length;j++){  // 열 반복문
         System.out.printf("scre[%d][%d] =%d%n", i, j, score[i][j]);
         
         sum += score[i][j];
     }
 }
 
 System.out.println("sum = " + sum);  // sum = 570

 

 

 

가변 배열

  • 2차원 이상의 다차원 배열을 생성할 때 전체 배열 차수 중 마지막 차수의 길이를 지정하지 않고, 추후에 각기 다른 길이의 배열을 생성함으로 써 고정된 형태가 아닌 유동적인 가변 배열을 생성하는 것



 

// 가변 배열 생성
int[][] score = new int[5][];

score[0] = new int[4];
score[1] = new int[3];
score[2] = new int[2];
score[3] = new int[2];
score[4] = new int[3];

System.out.println(score.length);  // 5
System.out.println(score[0].length); // 4
System.out.println(score[1].length);  // 3
System.out.println(score[2].length);  // 2
System.out.println(score[3].length);  // 2
System.out.println(score[4].length);  // 3

 

생성된 2차원 가변 배열

 

 

 

 

 

가연 배열 생성과 초기화를 동시에

int[][] score= {
    {100, 100, 100, 100},
    {20, 20, 20},
    {30, 30},
    {40, 40},
    {50, 50, 50}
};

 

 

 


◎ 다차원 배열의 활용

  • 좌표에 x 표하기
  • 빙고
  • 행렬의 곱셈
  • 단어 맞추기

 

 

 

 

 

 

좌표에 x표 하기 ㅡ 입력한 2차원 좌표의 위치에 x표시

import java.util.Scanner;

final int SIZE = 10;
int x=0, y=0;

char[][] board = new char[SIZE][SIZE];
byte[][] shipBoard = {
    //  9 * 9 테이블
    //   1  2  3  4  5  6  7  8  9
        {0, 0, 0, 0, 0, 0 ,0 ,0 ,0}, // 1,
    	{1, 1, 1, 1, 0, 0, 1, 0, 0}, // 2
        {0, 0, 0, 0, 0, 0, 1, 0, 0}, // 3
        {0, 0, 0, 0, 0, 0, 0, 0, 0}, // 4
        {1, 1, 0, 1, 0, 0, 0, 0, 0}, // 5
        {0, 0, 0, 1, 0, 0, 0, 0, 0}, // 6
        {0, 0, 0, 0, 0, 1, 1, 1, 0}, // 7
        {0, 0, 0, 0, 0, 0, 0, 0, 0}, // 8
        {1, 0, 1, 0, 0, 1, 1, 1, 1}  // 9
};

// 1행에 행번호를, 1열에 열번호를 저장함
for(int i=0; i<SIZE; i++){
	board[i][0] = board[0][i] = (char)(i+'0'); 
}

Scanner scanner = new Scanner(System.in);

while(true){
    System.out.print("좌표를 입력하세요 (종료는 00)>");
    String input = scanner.nextLine();
    
    if(input.length() == 2) {
        x = input.charAt(0) - '0';
        y = input.charAt(1) - '0';
        
        if(x == 0 && y== 0) break;
    }
    
    if (input.length() !=2 || x<=0 || y<=0 || x>SIZE || y>SIZE){
            System.out.println("잘못된 입력입니다. 다시 입력해주세요");
            continue;
        }


    board[x][y] = (shipBoard[x-1][y-1] == '1') ? 'O' : 'X';
    
    
    // println 메서드로 1차원 char 뱌ㅐ열의 참조변수를 출력하면, 배열의 모든 요소를 한 줄로 출력함
    for(int i=0; i<SIZE; i++) System.out.println(board[i]);   // board[i]는 1차원 배열임

    System.out.println();
    
} end of while

 

 

 

 

빙고

import java.util.Scanner;

final int SIZE = 5;
int x=0, y=0, num=0;

int[][] bingo = new int [SIZE][SIZE];

// 빙고 배열에 값 저장하기
for(int i=0; i<SIZE; i++){
    for(int j=0; j<SIZE; j++) bingo[i][j] = i*SIZE + j + 1;
}


// 빙고 배열에 있는 값 랜덤을 섞기
for(int i=0; i<SIZE; i++){
    x = (int)(Math.random()*SIZE);
    y = (int)(Math.random()*SIZE);

    for(int j=0; j<SIZE; j++){
        int tmp = bingo[i][j];
        bingo[i][j] = bingo[x][y];
        bingo[x][y] = tmp;
    }
}






do{
    // 빙고판 보여주기
    for(int i =0; i<SIZE; i++){
        for(int j=0; j<SIZE; j++){
            System.out.printf("%2d ",bingo[i][j]);
        }
        System.out.println();
    }
    System.out.println();

    // 빙고 맞추기
    System.out.printf("1~ %d 까지 숫자를 입력하세요 (종료:0)>", SIZE*SIZE);
    Scanner scanner = new Scanner(System.in);
    String tmp = scanner.nextLine();
    num = Integer.parseInt(tmp);
    
    // 맞춘 빙고판의 숫자를 0 으로 표시하기
    outer:
    for(int i=0; i<SIZE; i++){
        for(int j=0; j>SIZE; j++){
            if(bingo[i][j] == num){
                bingo[i][j] = 0;
                break outer;
            }  // end of if
        } // end for j
    }  // end for i

} while (num !=0); // 0 누르면 종료

 

 

 

행렬의 곱셈

행렬의 곱셈 조건

 

  • 두 행렬의 곱셈이 가능하려면 행렬 A의 열의 길이와 행렬 B의 행의 길이가 일치해야함
  • A*B = m행 n열
int[][] m1= {  // 2*3 행렬
    {1,2,3},
    {4,5,6}
};

int[][] m2 ={  // 3*2 행렬
    {1,2},
    {3,4},
    {5,6}
};




final int ROW = m1.length;  // m1 행의 길이  : 2
final int COL = m2[0].length;  // m2 열의 길이  : 2
final int M2_ROW = m2.length;  // m2 행의 길이  : 3

// m3 행렬 생성하기
int[][]m3 = new int[ROW][COL];

// m1 x m2 행렬 곱하기
for(int i=0; i<ROW; i++){
    for(int j=0; j<COL; j++){
        for(int k=0; k<M2_ROW; k++) m3[i][j] += (m1[i][k] * m2[k][j]); 
    } // end for i
} // end for j


// m3 행렬 출력
for(int i=0; i<ROW; i++){
    for(int j=0; j<COL; j++) System.out.printf("%3d", m3[i][j]);
    System.out.println();
}

/* 출력
22 28
49 64
*/

 

 

 

단어 맞추기

import java.util.Scanner;

String[][] words = {
    {"chair", "의자"},
    {"computer", "컴퓨터"},
    {"integer", "정수"}
};

// 단어 맞추기
for(int i=0; i<words.length;i++){
    System.out.printf("Q%d %s의 뜻은?", i+1, words[i][0]);
    
    Scanner scanner = new Scanner(System.in);
    
    String tmp = scanner.nextLine();
    
    if(words[i][1].equals(tmp)){
        System.out.printf("정답입니다.%n%n");
    } else {
        System.out.printf("틀렸습니다. 정답은 %s입니다.%n%n", words[i][1]);
    };

}

◎ Array 배열 다루기

 

 

배열의 비교와 출력 

  • Arrays.equals()  ㅡ 1차원 배열 비교
  • Arrays.deepEquals() ㅡ 2차원, 다차원 배열 비교
  • Arrays.toString() ㅡ 1차원 배열을 문자열로 반환
  • Arrays.deepToString() ㅡ 2차원, 다차원 배열을 문자열로 반환
// ex.1 배열을 문자열로 반환하기
import java.util.Arrays;

int[] arr = {0,1,2,3,4};
int[][] arr2D= {{11,12}, {21,22}};

// 1차원 배열일 때 문자열로 반환하기
System.out.println(Arrays.toString(arr)); // [0, 1, 2, 3, 4]

// 2차원배열, 다차원 배열일 때 문자열로 반환하기
System.out.println(Arrays.deepToString(arr2D)); // [[11, 12], [21, 22]]





// ex.2  1차원 배열 비교하기
import java.util.Arrays;

String[] str = {"1","2","3","4","5","6"};
String[] str2 = {"1","2","3","4", "5","6"};
String[] str3 = {"2","3","4","5","6"};

System.out.println(Arrays.equals(str, str2));  // true
System.out.println(Arrays.equals(str, str3));  // false





// ex.3  2차원, 다차원 배열 비교하기
String[][] str2D = {{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D2 = {{"aaa", "bbb"}, {"AAA", "BBB"}};
String[][] str2D3 = {{"AAA", "BBB"}, {"aaa", "bbb"}};

System.out.println(Arrays.deepEquals(str2D, str2D2));   // true
System.out.println(Arrays.deepEquals(str2D, str2D3));   // false

 

 

 

 

 

 

 

 

배열의 정렬

  • Arrays.sort(배열명) ㅡ 오름차순 정렬
// ex.1    Arrays.sort()
int[] arr = {3, 2, 0, 1, 4};
Arrays.sort(arr);    // 배열 정렬
System.out.println(Arrays.toString(arr));  // [0,1,2,3,4]
728x90