오늘의 공부/Java의 정석

05-1.1(배열(array)이란?)~3.4(다차원 배열의 활용)

콘스_ 2022. 7. 13. 22:12

1.1 배열(array)이란?

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

 

1.2 배열의 선언과 생성

배열의 생성

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

 

1.3 배열의 길이와 인덱스

인덱스(index)는 배열의 요소마다 붙여진 일련번호

"인덱스(index)의 범위는 0부터 '배열길이-1'까지"

 

배열의 길이

배열의 요소의 개수, 즉 값을 저장할 수 있는 공간의 개수

배열의 길이는 int범위의 양의 정수(0도 포함)이어야 한다.

 

배열이름.length

자바에서는 JVM이 모든 배열의 길이를 별도로 관리하며, '배열이름.length'를 통해서 배열의 길이에 대한 정보를 얻을 수 있다.

'배열이름.length'는 상수다.

 

배열의 길이 변경하기

배열의 길이를 변경하는 방법:
  • 더 큰 배열을  새로 생성한다.
  • 기존 배열의 내용을 새로운 배열에 복사한다.

 

1.4 배열의 초기화

'new 타입[]'을 생략하여 코드를 간단히 할 수 있다.

 

1.5 배열의 복사

for문을 이용한 배열을 복사

  1. 배열 arr의 길이인 arr.length의 값이 5이므로 길이가 10인 int배열 tmp가 생성되고, 배열 tmp의 각 요소는 int의 기본값인 0으로 초기화된다.
  2. for문을 이용해서 배열 arr의 모든 요소에 저장된 값을 하나씩 배열 tmp에 복사한다.
  3. 참조변수 arr에 참조변수 tmp의 값을 저장한다. arr의 값은 0x100에서 0x200으로 바뀌고, arr은 배열 tmp를 가리키게 된다.

System.arraycopy()를 이용한 배열의 복사

배열의 복사는 for문보다 System.arraycopy()를 사용하는 것이 효율적이다.

 

1.6 배열의 활용

총합과 평균 예제

public class ArrayEx5 {
    public static void main(String[] args) {
        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;

        System.out.println("총점 : "+ sum);
        System.out.println("평균 : "+ average);
    }
}

 

최대값과 최소값 예제

public class ArrayEx6 {
    public static void main(String[] args) {
        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++) {
            if (score[i] > max) {
                max = score[i];
            } else if (score[i] < min) {
                min = score[i];
            }
        }

        System.out.println("최대값 :" + max);
        System.out.println("최소값 :" + min);
    }
}

 

섞기(shuffle) 예제

public class ArrayEx7 {
    public static void main(String[] args) {
        int[] numArr = new int[10];

        for (int i=0; i<numArr.length; i++){
            numArr[i] = i;
            System.out.print(numArr[i]);
        }
        System.out.println();

        for (int i=0; i<100;i++){
            int n=(int)(Math.random()*10);
            int tmp=numArr[0];
            numArr[0] =numArr[n];
            numArr[n] = tmp;
        }
        for (int i=0;i<numArr.length;i++)
            System.out.print(numArr[i]);
    }
}
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 temp = 0;
        int j = 0;

        for (int i = 0; i < 6; i++) {
            j = (int) (Math.random() * 45);
            temp = ball[i];
            ball[i] = ball[j];
            ball[j] = temp;
        }

        for (int i = 0; i < 6; i++)
            System.out.printf("ball[%d]=%d%n", i, ball[i]);
    }
}

 

임의의 값으로 배열 채우기

random() 사용

for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * 5); // 0~4범위의 임의의 값을 저장
}

 

임의의 값으로 배열 채우기 예제

import java.util.*;

public class ArrayEx9 {
    public static void main(String[] args) {
        int[] code = {-4, -1, 3, 6, 11};
        int[] arr = new int[10];

        for (int i = 0; i < arr.length; i++) {
            int tmp = (int) (Math.random() * code.length);
            arr[i] = code[tmp];
        }
        System.out.println(Arrays.toString(arr));
    }
}

 

정렬하기(sort) 예제

public class ArrayEx10 {
    public static void main(String[] args) {
        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];
                    changed = true;
                }
            }

            if (!changed) break;

            for (int k = 0; k < numArr.length; k++)
                System.out.print(numArr[k]);
            System.out.println();
        }
    }
}

 

빈도수 구하기 예제

public class ArrayEx11 {
    public static void main(String[] args) {
        int[] numArr = new int[10];
        int[] counter = new int[10];

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

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

        for (int i = 0; i < numArr.length; i++) {
            System.out.println(i + "의 개수 :" + counter[i]);
        }
    }
}

 

2.1 String배열의 선언과 생성

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

참조형 변수의 기본값은 null이다.

자료형 기본값
boolean false
char '\u0000'
byte, short, int 0
long 0L
float 0.0f
double 0.0d 또는 0.0
참조형 변수 null

 

2.2 String배열의 초기화

int배열과 동일한 방법으로 한다.

new String[]을 생략할 수 있다.

 

2.3 char배열과 String클래스

String클래스는 char배열에 기능(메서드)을 추가한 것이다.

여기서 말하는 '기능'은 함수를 의미하며, 메서드는 객체지향 언어에서 '함수' 대신 사용하는 용어일 뿐 함수와 같은 뜻이다.

char배열과 String클래스의 한 가지 중요한 차이가 있는데, String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.

 

String클래스의 주요 메서드

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

 

char배열과 String클래스의 변환

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

 

2.4 커맨드 라인을 통해 입력받기

프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 여러 개의 문자열을 프로그램에 전달 할 수 있다.

커맨드라인에 입력된 매개변수는 공백문자로 구분하기 때문에 입력될 값에 공백이 있는 경우 큰따옴표("")로 감싸주어야 한다.

커맨드라인에서 숫자를 입력해도 숫자가 아닌 문자열로 처리된다는 것에 주의해야 한다.

 

3.1 2차원 배열의 선언과 인덱스

선언 방법 선언 예
타입[][] 변수이름; int[][] score;
타입 변수이름[][]; int score[][];
타입[] 변수이름[]; int[] score[]l

 

2차원 배열의 index

행(row)과 열(column)로 구성됨

'배열이름[행index][열index]'

 

3.2 2차원 배열의 초기화

1차원 배열보다 괄호 {}를 한 번 더 써서 행별로 구분한다.

int[][] arr = new int[][] { {1, 2, 3}, {4, 5, 6} };
int[][] arr = { {1, 2, 3}, {4, 5, 6} }; // new int[][]가 생략됨

 

3.3 가변 배열

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];

이렇게 2차원 배열을 생성하면 각 행마다 다른 길이의 배열을 생성하는 것이 가능하다.

가변배열 역시 중괄호{}를 이용해서 생성과 초기화를 동시에 하는 것이 가능하다.

 

3.4 다차원 배열의 활용

좌표에 X표하기 예제

import java.util.Scanner;

public class MultiArrEx1 {
    public static void main(String[] args) {
        final int SIZE = 10;
        int x = 0, y = 0;

        char[][] board = new char[SIZE][SIZE];
        byte[][] shipBoard = {
                { 0, 0, 0, 0, 0, 0, 1, 0, 0},
                {1, 1, 1, 1, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 1, 0, 0},
                {0, 0, 0, 0, 0, 0, 0, 0, 0},
                {1, 1, 0, 1, 0, 0, 0, 0, 0},
                {0, 0, 0, 1, 0, 0, 0, 0, 0},
                {0, 0, 0, 1, 0, 0, 0, 0, 0},
                {0, 0, 0, 0, 0, 1, 1, 1, 0},
        };

        for (int i=1;i<SIZE;i++)
            board[0][i] = board[i][0]=(char)(i+'0');

        Scanner scanner = new Scanner(System.in);

        while(true) {
            System.out.printf("좌표를 입력하세요. (종료는 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||x>=SIZE||y<=0||y>=SIZE){
                System.out.println("잘못된 입력입니다. 다시 입력해주세요.");
                continue;
            }

            board[x][y] = shipBoard[x-1][y-1]==1 ? '0':'X';

            for (int i=0;i<SIZE;i++)
                System.out.println(board[i]);
            System.out.println();
        }
    }
}

 

빙고 예제

import java.util.Scanner;

public class MultiArrEx2 {
    public static void main(String[] args) {
        final int SIZE = 5;
        int x = 0, y = 0, num = 0;

        int[][] bingo = new int[SIZE][SIZE];
        Scanner scanner = new Scanner(System.in);

        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++) {
            for (int j = 0; j < SIZE; j++) {
                x = (int) (Math.random() * SIZE);
                y = (int) (Math.random() * SIZE);

                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);
            String tmp = scanner.nextLine();
            num = Integer.parseInt(tmp);

            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;
                    }
                }
            }
        } while (num != 0);
    }
}

 

행렬의 곱셈 예제 

public class MultiArrEx3 {
    public static void main(String[] args) {
        int[][] m1 = {
                {1, 2, 3},
                {4, 5, 6}
        };

        int[][] m2 = {
                {1, 2,},
                {3, 4,},
                {5, 6,}
        };

        final int ROW = m1.length;
        final int COL = m2[0].length;
        final int M2_ROW = m2.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 < M2_ROW; k++)
                    m3[i][j] += m1[i][k] * m2[k][j];

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

 

단어 맞추기 예제

import java.util.Scanner;

public class MultiArrEx4 {
    public static void main(String[] args) {
        String[][] words = {
                {"chair", "의자"},
                {"computer", "컴퓨터"},
                {"integer", "정수"}
        };

        Scanner scanner = new Scanner(System.in);

        for (int i=0;i<words.length;i++){
            System.out.printf("Q%d. %s의 뜻은?", i+1, words[i][0]);

            String tmp = scanner.nextLine();

            if (tmp.equals(words[i][1])){
                System.out.printf("정답입니다.%n%n");
            }else{
                System.out.printf("틀렸습니다. 정답은 %s입니다.%n%n",words[i][1]);
            }
        }
    }
}