ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Java의 정석 정리 (05장)
    LANGUAGE/Java, Spring 2024. 12. 2. 18:37


    Ch 05. 배열

     

    1. 배열

    1.1 배열(array)이란?

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

    배열은 변수와 달리 각 저장공간이 연속적으로 배치되어 있다.

     

     

    1.2 배열의 선언과 생성

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

     

    선언은 단지 배열을 다루기 위한 참조변수를 위한 공간을 만드는 것. 배열을 생성해야만 비로소 값을 저장할 수 있는 공간이 만들어진다.

    배열의 생성을 위해 연산자 'new'를 사용해 배열의 타입과 길이를 지정한다.

    각 배열요소는 자동적으로 int의 default 값인 0으로 초기화 된다.

    타입[] 변수이름;                         // 배열 선언
    변수이름 = new 타입[길이];       // 배열 생성
    
    // ex)
    int[] score = new int[5];   // 배열 선언과 동시에 생성

     

     

     

    1.3 배열의 길이와 인덱스

    배열의 각 저장공간을 '요소(element)'라고 하며, 배열이름[index] 형식으로 요소에 접근한다. 인덱스는 1이 아닌 0부터 시작한다.

    int[] score = new int[5];  // 길이가 5인 int배열
    score[3] = 100;            // 배열 score의 4번째 요소에 100을 저장
    int value = score[3];      // 배열 score의 4번째 요소에 저장된 값을 읽어서 value에 저장

     

    * 인덱스의 범위가 넘어가는 값을 출력해도 컴파일 시에 문제가 발생하지 않는다. 실행 시에는 에러(ArrayIndexOutOfBoundsException)가 발생한다.

     

    * 배열의 길이는 양의 정수이고, 최대값은 int의 최대값인 약 20억이다. 0도 가능하다.

     

    * JVM이 모든 배열의 길이를 별도로 관리한다. '배열이름.length'를 통해 길이를 알 수 있다. 생성된 배열의 길이는 변하지 않기 때문에 '배열이름.length'도 상수다. 즉, 값을 읽을 수만 있고 변경하지 못한다. for문에서 배열의 길이를 하드코딩하는 것보다 length를 사용하는 것이 더 편리하다.

    public class MyClass {
        public static void main(String args[]) {
          int[] score = new int[6];
          
          for (int i=0; i<score.length; i++) {
              System.out.println(score[i]);
          }
        }
    }

     

    * 배열의 공간이 부족할 경우 

    1. 더 큰 배열을 새로 생성

    2. 기존 배열의 내용을 새로운 배열에 복사

     

     

    1.4 배열 초기화

    int[] score = new int[] {50,60,70,80,90};
    int[] score = {50,60,70,80,90}; // new int[] 생략 가능

     

    * 배열의 선언과 생성을 따로 하는 경우에는 'new 타입[]' 생략 불가능.

    int[] score;
    score = new int[] {50,60};
    score = {50, 60}; // error

     

    * 매개변수로 int배열을 받는 메서드가 정의되어 있고, 이 메서드를 호출해야 할 경우도 생략 불가능

    int add(int[] arr) {/* 내용 생략 */}  // add메서드
    int result = add(new int[] {100,90,80}; // ok
    int result = add({100,90,80}) // error

     

    * 배열의 저장된 값을 확인할 때 for문으로 일일히 확인하지 않고, 'Arrays.toString(배열이름)'메서드 사용 가능.

    int[] iArr = {100,90,80};
    System.out.println(Arrays.toString(iArr));
    
    // iArr은 참조변수라서, '배열의 주소'가 출력될 것으로 예상할 수 있지만
    // '타입@주소' 형식으로 출력된다.

     

     

    1.5 배열의 복사

    * 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이 새로운 배열을 가리키게 한다.

     

    * for문 대신 System 클래스의 arraycopy() 메서드를 사용하면 간단하고 빠르게 배열 복사 가능. for문은 배열의 요소 모두에 접근하지만 arraycopy()는 지정된 범위의 값들을 통째로 복사.

    System.arraycopy(num, 0, newNum, 0, num.length);
    
    // num[0]에서 newNum[0]으로 num.legnth개의 데이터 복사

    ex)

    더보기
    public class ArrayEx04 {
        public static void main(String[] args) {
            char[] abc = {'A', 'B', 'C', 'D'};
            char[] num = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
            System.out.println(abc);
            System.out.println(num);
    
            // 배열 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);
    
            // 배열 abc를 배열 num의 첫 번째 위치부터 배열 abc의 길이만큼 복사
            System.arraycopy(abc, 0, num, 0, abc.length);
            System.out.println(num);
    
            // number의 인덱스 6위치에 3개를 복사
            System.arraycopy(abc, 0, num, 6, 3);
            System.out.println(num);
        }
    }

     

     

     

    2. String 배열

     

    * 배열의 타입이 String인 경우에도 생성과 선언은 int배열과 다르지 않다.

    String[] name = new String[] {"Kim", "Park", "Yi"};
    String[] name = {"Kim", "Park", "Yi"};

    ex)

    더보기
    public class ArrayEx12 {
        public static void main(String[] args) {
            String[] names = {"kims", "Parks", "Yi"};
    
            for (int i=0; i < names.length; i++) {
                System.out.println("names[" + i + "]: " +  names[i]);
            }
            String tmp = names[2];
            System.out.println("tmp : " + tmp);
            names[0] = "Yu";
    
            for (String str : names) {
                System.out.println(str);
            }
        }
    }

     

     

    * 배열을 생성할 경우 참조변수를 저장하기 위한 공간이 만들어지고, 기본값은 'null'로 초기화된다. (int배열은 '0'으로 초기화)

     

    * 주요 메서드

    메서드 설명
    char charAt(int index) 문자열에서 해당 위치에 있는 문자를 반환
    int length() 문자열의 길이 반환
    String substring(int from, int to) 문자열에서 해당 범위(from~to)에 있는 문자열 반환
    boolean equals(Object obj) 문자열의 내용의 obj와 같은지 확인
    char[] toCharArray() 문자열을 문자배열(char[])로 변환해서 반환

     

    ex)

    더보기
    char[] chArr = {'A', 'B', 'C'};
    String str = new String(chArr)   // char배열 -> String
    char[] tmp = str.toCharArry();   // String -> char배열

     

    public class ArrayEx14 {
        public static void main(String[] args) {
            String src = "ABCDE";
    
            for (int i=0; i < src.length(); i++) {
                char ch = src.charAt(i);
                System.out.println("src.charAt(" + i + ") : " + ch);
            }
    
            char[] chArr = src.toCharArray();
            System.out.println(chArr);
        }
    }

     

     

    * Scanner 클래스 말고도 커맨드 라인을 통해 사용자로부터 값을 입력받을 수 있다. 프로그램을 실행할 때 클래스 이름 뒤에 공백문자로 구분하여 문자열을 전달한다. 문자열은 String배열에 담겨서 main() 메서드의 매개변수(args)에 전달된다. 숫자를 입력해도 문자열로 처리된다. 

     

     

     

    3. 다차원 배열

     

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

     

    * 2차원 배열은 주로 테이블 형태의 데이터를 담고, 행(row) 인덱스와 열(column) 인덱스로 나눈다.

    * 2차원 배열 초기화

    int[][] arr1 = new int[][] { {1, 2, 3}, {4, 5, 6}};
    int[][] arr2 = { {1, 2, 3}, {4, 5, 6}};

     

    * for문을 사용한 초기화

    더보기
    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++) {
                for (int j=0; j < score[i].length; j++) {
                    System.out.printf("score[%d][%d] = %d%n", i, j, score[i][j]);
                }
            }
    
            for (int[] tmp : score) {
                for (int i : tmp) {
                    sum += i;
                }
            }
    
            System.out.println("sum = " + sum);
    
         }
    }

     

     

    * 가변 배열

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

     

     

    'LANGUAGE > Java, Spring' 카테고리의 다른 글

    Java Enum  (0) 2024.12.03
    mvc2( java, jsp, mybatis)  (0) 2024.12.02
    Java의 정석 정리 (06장)  (0) 2024.12.02
    Java의 정석 정리 (04장)  (1) 2024.12.02
    Java의 정석 정리 (01~03장)  (1) 2024.12.02
Designed by Tistory.