๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐‘†๐‘ข๐‘›๐‘ โ„Ž๐‘–๐‘›๐‘’ ๐‘Ž๐‘“๐‘ก๐‘’๐‘Ÿ ๐‘Ÿ๐‘Ž๐‘–๐‘›โœง

[Java] ๋ฐฐ์—ด ๋ณธ๋ฌธ

โญ ๋ฐฐ์—ด

 

  • ์ผ์ฐจ์› ๋ฐฐ์—ด
    • ๋ณ€์ˆ˜๋Š” ํ•œ ๊ฐœ์˜ ๋ฐ์ดํ„ฐ๋งŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
  • ๋™์ผํ•œ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ์—ฌ๋Ÿฌ ๊ฐœ ์ €์žฅํ•˜๊ณ  ์‹ถ์„ ๊ฒฝ์šฐ ๋ฐฐ์—ด ์‚ฌ์šฉ
    • ์ธ๋ฑ์Šค๋Š” 0๋ถ€ํ„ฐ ์‹œ์ž‘
    • ๋ฐฐ์—ด ์›์†Œ ์‚ฌ์ด์—๋Š” ์ˆœ์„œ๊ฐ€ ์กด์žฌ
    • ํ•˜๋‚˜์˜ ๋ฐฐ์—ด ์ด๋ฆ„์„ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— for๋ฌธ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ
  • ์„ ์–ธ
    • ๋ฐ์ดํ„ฐํƒ€์ž…[] ๋ฐฐ์—ด๋ณ€์ˆ˜์ด๋ฆ„ = new ๋ฐ์ดํ„ฐํƒ€์ž…[๋ฐ์ดํ„ฐ ๊ฐœ์ˆ˜];
    • ๋ฐฐ์—ด ์„ ์–ธ์‹œ ์›์†Œ๊ฐ’์„ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ
      • ๋ฐ์ดํ„ฐํƒ€์ž…[] ๋ฐฐ์—ด๋ณ€์ˆ˜์ด๋ฆ„ = {..., ..., ..., ..., ...};
    • ๋ฐฐ์—ด ๊ฐ์ฒด๊ฐ€ ์—†๋‹ค๋ฉด null ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ
      • ๋ฐ์ดํ„ฐํƒ€์ž…[] ๋ฐฐ์—ด๋ณ€์ˆ˜์ด๋ฆ„ = null;
int[] scores = new int[100];

for (int i = 0; i<100; i++){
    scores[i] = i+1; //1๋ถ€ํ„ฐ ๊ฐ’์„ ๋„ฃ์–ด์ค€๋‹ค.

 

int[] scores = {90, 83, 77, 100, ..., 60};

 

  • ์ด์ฐจ์› ๋ฐฐ์—ด
    • ํ–‰๊ณผ ์—ด์„ ๊ฐ€์ง„ ํ…Œ์ด๋ธ” ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ์ €์žฅํ•  ๊ฒฝ์šฐ ์ด์ฐจ์› ๋ฐฐ์—ด ์‚ฌ์šฉ
    • ์„ ์–ธ ๋ฐฉ๋ฒ•
      • ๋ฐฐ์—ด ์„ ์–ธ์‹œ ์ €์žฅํ•  ํ–‰๊ณผ ์—ด์˜ ๊ฐœ์ˆ˜๋งŒ ์•Œ๊ณ  ์žˆ๋Š” ๊ฒฝ์šฐ
      • ๋ฐ์ดํ„ฐํƒ€์ž…[][] ๋ฐฐ์—ด๋ณ€์ˆ˜์ด๋ฆ„ = new ๋ฐ์ดํ„ฐํƒ€์ž…[ํ–‰์˜ ํฌ๊ธฐ][์—ด์˜ ํฌ๊ธฐ];
int[][] scores = new int[1][3];

scores[0][0] = 10;
scores[0][1] = 20;
scores[0][2] = 30;

 

  • ์ผ์ฐจ์›๋ฐฐ์—ด ↔  ์ด์ฐจ์›๋ฐฐ์—ด
public class Array1dtoArray2dExample {
    public static void main(String[] args) {
        final int ROW_NUM = 3;
        final int COL_NUM = 5;
        final int NUM = ROW_NUM * COL_NUM;
        int[] arr1d = new int[NUM];
        for (int i = 0; i < arr1d.length; i++) {
            arr1d[i] = i + 1;
        }
        for (int element: arr1d) {
            System.out.printf("%2d ", element);
        }
        System.out.println("\n");

        int[][] arr2d = new int[ROW_NUM][COL_NUM];
        for (int i = 0; i < arr2d.length; i++) {
            for (int j = 0; j < arr2d[i].length; j++) {
                arr2d[i][j] = arr1d[i * COL_NUM + j];
            }
        }
        for (int i = 0; i < arr2d.length; i++) {
            for (int j = 0; j < arr2d[i].length; j++) {
                System.out.printf("%2d ", arr2d[i][j]);
            }
            System.out.println();
        }
        System.out.println("\n");

        int[] arr1dRevert = new int[ROW_NUM * COL_NUM];
        for (int i = 0; i < arr2d.length; i++) {
            for (int j = 0; j < arr2d[i].length; j++) {
                arr1dRevert[i * COL_NUM + j] = arr2d[i][j];
            }
        }
        for (int element: arr1dRevert) {
            System.out.printf("%2d ", element);
        }
    }
}

 

  • ๋ฐฐ์—ด ์ถœ๋ ฅ
    • 1์ฐจ์› ๋ฐฐ์—ด : toString ํ•จ์ˆ˜ ์‚ฌ์šฉํ•œ๋‹ค.
    • ๋‹ค์ฐจ์› ๋ฐฐ์—ด : deepToString ํ•จ์ˆ˜ ์‚ฌ์šฉํ•œ๋‹ค.

 

import java.util.Arrays;

public class ArraysToStringExample {
    public static void main(String[] args) {
        // ์ผ์ฐจ์› ๋ฐฐ์—ด ์ถœ๋ ฅ
        int[] arr1d = {1, 2, 3, 4, 5};
        String[] strArr1d = {"Java", "JSP", "Servlet", "Spring"};
        System.out.println(Arrays.toString(arr1d));
        System.out.println(Arrays.toString(strArr1d));
        Arrays.stream(arr1d).forEach((i) -> System.out.print(i + " ")); //stream ์ด์šฉํ•ด์„œ ๋žŒ๋‹ค์‹ ํ™œ์šฉ
        Arrays.stream(strArr1d).forEach((i) -> System.out.print(i + " "));
        System.out.println("\n");

        // ์ด์ฐจ์› ๋ฐฐ์—ด ์ถœ๋ ฅ
        int[][] arr2d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        String[][] strArr2d = {{"a", "ab", "abc"}, {"1", "12", "123"}, {"a1", "b2", "c3"}};
        System.out.println(Arrays.deepToString(arr2d)); //deepToString ํ•จ์ˆ˜ ์‚ฌ์šฉ
        System.out.println(Arrays.deepToString(strArr2d));
        Arrays.stream(arr2d).forEach((i) -> {
            Arrays.stream(i).forEach((j) -> System.out.print(j + " "));
            System.out.println();
        });
        Arrays.stream(strArr2d).forEach((i) -> {
            Arrays.stream(i).forEach((j) -> System.out.print(j + " "));
            System.out.println();
        });
    }
}

 

  • ๋ฐฐ์—ด ๋น„๊ต
    • Equals ํ•จ์ˆ˜ ์‚ฌ์šฉ 
import java.util.Arrays;

public class ArraysEqualsExample {
    public static void main(String[] args) {
        // ์ผ์ฐจ์› ๋ฐฐ์—ด ๋น„๊ต
        int[] arr1d = {1, 2, 3, 4, 5, 6};
        int[] arr1dCompare = {1, 2, 3, 4, 5, 6, 7};
        String[] strArr1d = {"Java", "JSP", "Servlet", "Spring"};
        String[] strArr1dCompare = {"Java", "JSP", "Servlet", "Spring"};

        System.out.println(arr1d == arr1dCompare); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(arr1d.equals(arr1dCompare)); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(strArr1d == strArr1dCompare); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(strArr1d.equals(strArr1dCompare)); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต

        System.out.println(isEquals(arr1d, arr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(isEquals(strArr1d, strArr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(Arrays.equals(arr1d, arr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(Arrays.equals(strArr1d, strArr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println();

        // ์ด์ฐจ์› ๋ฐฐ์—ด ๋น„๊ต
        int[][] arr2d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        int[][] arr2dCompare = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        String[][] strArr2d = {{"a", "ab", "abc"}, {"1", "12", "123"}, {"a1", "b2", "c3"}};
        String[][] strArr2dCompare = {{"a", "ab", "abc"}, {"1", "12", "123"}, {"a1", "b2", "c3"}};

        System.out.println(arr2d == arr2dCompare); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(strArr2d == strArr2dCompare); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(arr2d.equals(arr2dCompare)); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(strArr2d == strArr2dCompare); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต

        for (int i = 0; i < arr2d.length; i++) {
            System.out.println(arr2d[i] == arr2dCompare[i]); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
            System.out.println(strArr2d[i] == strArr2dCompare[i]); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
            System.out.println(arr2d[i].equals(arr2dCompare[i])); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
            System.out.println(strArr2d[i] != null && strArr2d[i].equals(strArr2dCompare[i])); // ์ฃผ์†Œ๊ฐ’ ๋น„๊ต
        }
        System.out.println(isDeepEquals(arr2d, arr2dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(isDeepEquals(strArr2d, strArr2dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(Arrays.deepEquals(arr2d, arr2dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(Arrays.deepEquals(strArr2d, strArr2dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println();
    }
    public static boolean isEquals(int[] a, int[] b) {
        if (a.length != b.length) return false;

        for (int i = 0; i < a.length; i++) {
            if (a[i] != b[i]) return false;
        }
        return true;
    }
    public static boolean isEquals(String[] a, String[] b) {
        if (a.length != b.length) return false;

        for (int i = 0; i < a.length; i++) {
            if (a[i] != null && !a[i].equals(b[i])) return false;
        }
        return true;
    }
    public static boolean isDeepEquals(int[][] a, int[][] b) {
        if (a.length != b.length) return false;
        if (a[0].length != b[0].length) return false;

        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                if (a[i][j] != b[i][j]) return false;
            }
        }
        return true;
    }
    public static boolean isDeepEquals(String[][] a, String[][] b) {
        if (a.length != b.length) return false;
        if (a[0].length != b[0].length) return false;

        for (int i = 0; i < a.length; i++) {
            for (int j = 0; j < a[0].length; j++) {
                if (a[i][j] != null && !a[i][j].equals(b[i][j])) return false;
            }
        }
        return true;
    }
}

 

  • Compare ํ•จ์ˆ˜ ์‚ฌ์šฉ
import java.util.Arrays;

public class ArraysCompareExample {
    public static void main(String[] args) {
        int[] arr1d = {1, 2, 3, 4, 5, 6};
        int[] arr1dCompare = {1, 2, 3, 4, 5, 6, 7};
        String[] strArr1d = {"Java", "JSP", "Servlet", "Spring"};
        String[] strArr1dCompare = {"Javp", "JSP", "Servlet", "Spring", "Python"};

        System.out.println(compare(arr1d, arr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(Arrays.compare(arr1d, arr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(compare(strArr1d, strArr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println(Arrays.compare(strArr1d, strArr1dCompare)); // ์›์†Œ๊ฐ’ ๋น„๊ต
        System.out.println();
    }

    public static int compare(int[] a, int[] b) {
        int minLength = Math.min(a.length, b.length);
        for (int i = 0; i < minLength; i++) {
            if (a[i] != b[i]) {
                return Integer.compare(a[i], b[i]);
            }
        }
        if (a.length < b.length) return -1;
        else if (a.length > b.length) return 1;
        else return 0;
    }
    public static int compare(String[] a, String[] b) {
        int minLength = Math.min(a.length, b.length);
        for (int i = 0; i < minLength; i++) {
            if (a[i] != null && !a[i].equals(b[i])) {
                return a[i].compareTo(b[i]);
            }
        }
        if (a.length < b.length) return -1;
        else if (a.length > b.length) return 1;
        else return 0;
    }
}

 

  • ๋ฐฐ์—ด ๋ณต์‚ฌ
    • ๋ฐฐ์—ด ์ด๋ฆ„์ด ์•„๋‹Œ ๋ฐฐ์—ด ์›์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ๋ณต์‚ฌํ•ด์•ผํ•จ
    • Shallow Copy
      • "์ฃผ์†Œ๊ฐ’"์„ ๋ณต์‚ฌ
      • ์ผ์ฐจ์› ๋ฐฐ์—ด ๋ณต์‚ฌํ•  ๊ฒฝ์šฐ
for (int i = 0; i < original.length(); i++) {
    copy[i] = original[i];
}
    • Deep Copy
      • ์‹ค์ œ ๊ฐ’'์„ ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์— ๋ณต์‚ฌ
      • ์ด์ค‘ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•  ๊ฒฝ์šฐ
import java.util.Arrays;

public class ArraysCopyExample {
    public static void main(String[] args) {
        // ์ผ์ฐจ์› ๋ฐฐ์—ด ๋ณต์‚ฌ
        int[] arr1d = {1, 2, 3, 4, 5, 6};
        int[] arr1dCopy = arr1d; // ์ฃผ์†Œ๊ฐ’ ๋Œ€์ž…
        String[] strArr1d = {"Java", "JSP", "Servlet", "Spring"};
        String[] strArr1dCopy = strArr1d; // ์ฃผ์†Œ๊ฐ’ ๋Œ€์ž…
        final int NEW_LEN = 7;

        arr1dCopy = Arrays.copyOf(arr1d, NEW_LEN); // ๋ฐฐ์—ด ์›์†Œ๊ฐ’ ๋ณต์‚ฌ
        strArr1dCopy = Arrays.copyOf(strArr1d, NEW_LEN); // ๋ฐฐ์—ด ์›์†Œ๊ฐ’ ๋ณต์‚ฌ
        System.out.println(Arrays.toString(arr1dCopy));
        System.out.println(Arrays.toString(strArr1dCopy));

        System.out.println(arr1d == arr1dCopy); // false
        System.out.println(Arrays.equals(arr1d, arr1dCopy)); // false
        System.out.println(strArr1d == strArr1dCopy); // false
        System.out.println(Arrays.equals(strArr1d, strArr1dCopy)); // false

        arr1dCopy = copy(arr1d, NEW_LEN); // ๋ฐฐ์—ด ์›์†Œ๊ฐ’ ๋ณต์‚ฌ
        strArr1dCopy = copy(strArr1dCopy, NEW_LEN); // ๋ฐฐ์—ด ์›์†Œ๊ฐ’ ๋ณต์‚ฌ
        System.out.println(Arrays.toString(arr1dCopy));
        System.out.println(Arrays.toString(strArr1dCopy));
//        Arrays.copyOfRange() // ๋ฐฐ์—ด ์ผ๋ถ€ ์›์†Œ๋งŒ ๋ณต์‚ฌ

        System.out.println(arr1d == arr1dCopy); // false
        System.out.println(Arrays.equals(arr1d, arr1dCopy)); // false
        // String.equals()
        // for(int i = 0; i < str.length() ...) ...
        System.out.println(strArr1d == strArr1dCopy); // false
        System.out.println(Arrays.equals(strArr1d, strArr1dCopy)); // false


        // ์ด์ฐจ์› ๋ฐฐ์—ด ๋ณต์‚ฌ
        int[][] arr2d = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
        int[][] arr2dCopy = arr2d; // ์ฃผ์†Œ๊ฐ’ ๋Œ€์ž…
        String[][] strArr2d = {{"a", "ab", "abc"}, {"1", "12", "123"}, {"a1", "b2", "c3"}};
        String[][] strArr2dCopy = strArr2d; // ์ฃผ์†Œ๊ฐ’ ๋Œ€์ž…

        final int NEW_ROW = 3;
        final int NEW_COL = 5;
        arr2dCopy = deepCopy(arr2d, NEW_ROW, NEW_COL);
        strArr2dCopy = deepCopy(strArr2d, NEW_ROW, NEW_COL);
        System.out.println(Arrays.deepToString(arr2dCopy));
        System.out.println(Arrays.deepToString(strArr2dCopy));

        System.out.println(arr2d == arr2dCopy); // false
        System.out.println(Arrays.deepEquals(arr2d, arr2dCopy)); // false
        System.out.println(strArr2d == strArr2dCopy); // false
        System.out.println(Arrays.deepEquals(strArr2d, strArr2dCopy)); // false


        arr2dCopy = deepCopyWithStream(arr2d);
        strArr2dCopy = deepCopyWithStream(strArr2d);
        System.out.println(Arrays.deepToString(arr2dCopy));
        System.out.println(Arrays.deepToString(strArr2dCopy));

        System.out.println(arr2d == arr2dCopy); // false
        System.out.println(Arrays.deepEquals(arr2d, arr2dCopy)); // true
        System.out.println(strArr2d == strArr2dCopy); // false
        System.out.println(Arrays.deepEquals(strArr2d, strArr2dCopy)); // true

    }
    public static int[] copy(int[] original, int newLength) {
        int[] copied = new int[newLength];
        for (int i = 0; i < original.length; i++) {
            copied[i] = original[i];
        }
        return copied;
    }
    public static String[] copy(String[] original, int newLength) {
        String[] copied = new String[newLength];
        for (int i = 0; i < original.length; i++) {
            if (original[i] != null) {
                copied[i] = original[i];
            }
        }
        return copied;
    }
    public static int[][] deepCopy(int[][] original, int newRow, int newColumn) {
        int[][] copied = new int[newRow][newColumn];
        for (int i = 0; i < original.length; i++) {
            for (int j = 0; j < original[i].length; j++) {
                copied[i][j] = original[i][j];
            }
        }
        return copied;
    }
    public static String[][] deepCopy(String[][] original, int newRow, int newColumn) {
        String[][] copied = new String[newRow][newColumn];
        for (int i = 0; i < original.length; i++) {
            for (int j = 0; j < original[i].length; j++) {
                if (original[i][j] != null) {
                    copied[i][j] = original[i][j];
                }
            }
        }
        return copied;
    }
    public static int[][] deepCopyWithStream(int[][] original) {
        return Arrays.stream(original).map(r -> Arrays.copyOf(r, r.length)).toArray(int[][]::new);
    }
    public static String[][] deepCopyWithStream(String[][] original) {
        return Arrays.stream(original).map(r -> Arrays.copyOf(r, r.length)).toArray(String[][]::new);
    }
}