본문 바로가기
Back-end

[Java] 배열

by 셀킴 2025. 12. 4.
728x90

배열

int score1, score2, score3, score4, score5;

Untitled

위와 같은 방식은 비효율적임

int[] score = new int[5]; //int값 5개를 저장할 수 있는 배열

Untitled

효율적인 배열. 배열의 숫자를 인덱스(index)라고 함

score[0], score[1].. 이런식으로 자동으로 이름 붙음

배열은 저장공간이 연속적임.

배열의 선언과 생성

배열의 선언: 배열을 다루기 위한 참조변수의 선언

변수는 선언하는 순간 저장공간이 만들어지지만, 배열은 참조변수가 만들어짐.

선언방법 선언 예 비고
타입[] 변수이름; int[] score; String[] name; 흔한 방법
타입 변수이름[]; int score[]; String name[]; C언어스러운.. 작동은 함

타입[] 변수이름; //배열을 선언

변수이름 = new 타입[]; //배열을 생성(실제 저장공간을 생성)

예를 들어

int[] score; //int타입의 배열을 다루기 위한 참조변수 score 선언

Untitled

score = new int[5]; //int타입의 값 5개를 저장할 수 있는 배열 생성.

저장공간 생김

Untitled

int[] score = new int[5]; 선언과 생성을 한번에 함

배열의 인덱스

각 요소에 자동으로 붙는 번호

인덱스의 범위는 0부터 배열길이-1까지

int[] score = new int[5]; //길이가 5인 int배열

인덱스는 0,1,2,3,4로 5개

Untitled

저장공간 하나를 배열의 요소라고 함

score[3] = 100; //배열 score의 4번째 요소에 100을 저장한다.
int value = score[3]; //배열 score의 4번째 요소의 값을 읽어서 value에 저장

인덱스 범위를 벗어나는게 가장 흔한 오류 ⇒ 배열.length를 쓰자

배열의 길이

배열이름.length = 배열의 길이(int형 상수)

int[] arr = new int[5]; //길이가 5인 int배열 arr을 생성

int tmp = arr.length; //arr.length의 값은 5이고 tmp에 5가 저장된다.

배열은 한번 생성하면 그 길이를 바꿀 수 없다.

  1. 왜 못바꾸냐? 배열은 연속적이라 저장공간에서 배열 공간을 바꿀 수 있다는 보장이 없음
  2. 부족하면? 더 큰 새 공간을 만들어 기존 배열을 복사

int[] score = new int[6]’;

for(int i=0; i < ***5***; i++)  //6이 아닌 이유는 0부터 시작하기 때문
    System.out.println(score[i]); //배열의 모든 요소 출력

위는 오류나기 쉬움 그래서

for (int i=0; i < ***score.length***; i++)
    System.out.println(score[i]);

배열의 초기화

배열의 각 요소에 처음으로 값을 저장하는 것. 배열은 기본적으로 자동 초기화가 됨(int인 경우는 기본값인 0으로)

int[] score = new int[5]; //길이가 5인 int배열 score을 생성

score[0] = 50;

score[1] = 60;

score[4] = 90;

위와 같은 초기화를

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

위처럼 할 수 있지만, 규칙이 필요해서 안될수도

그래서 더 간단한 방법

int[] score = new int[]{50,60,70,80,90}; //방법1. 거의 안쓰임
**int[] score = {50,60,70,80,90};** //방법2. 이 방법을 사용할 것. 다만 이 문장은 나눠서 쓰지않고 한문장으로만 이어서 써야함

배열의 출력

int[] iArr = {100,95,80,70,60}; 길이가 5인 배열
System.out.println(iArr); //문자열 [I@14318bb이 출력됨. 배열 인티저타입 주소 뭐 이런 내용. *char는 값이 그대로 출력됨

위와 같은 방식으로말고

for문으로는

for(int i=0;i<iArr.length;i++ {
    System.out.println(iArr[i]); //배열의 요소를 순서대로 하나씩 출력
}

더 간단하게는

System.out.println(Arrays.toString(iArr)); //[100, 95, 80, 70, 60]이 출력됨

String배열의 선언과 생성

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

Untitled

참조형의 기본값은 null

name[0] = ”Kim”;
name[1] = "Park";
name[2] = "Yi";

이걸 괄호를 이용해 이런식으로
String[] name = {"Kim", "Park", "Yi"};

2차원 배열

테이블 형태의 데이터를 저장하기 위한 배열. 2차원 배열은 배열의 배열이다.

Untitled

테이블의 한 줄이 1차원 배열이고,

여러 줄들이 모인게 2차원 배열

Untitled

2차원 배열이 여러개 모인게 3차원 배열

int[][] score = new int[4][3]; //4행3열의 이차원 배열 생성. 4*3 int 12개의 저장공간이 마련됨

Untitled

Untitled

score[0][0] = 100; //배열 score의 1행 1열에 값 100을 저장

2차원 배열의 초기화

int[][] arr = {{1,2,3}, {4,5,6}}; //new int[][]가 생략됨. 2차원 배열의 생성과 초기화를 동시에

위는 가독성이 떨어지니까

int[][] arr = {
                                {1,2,3}, //얘네 한줄이 1차원 배열. arr[1]
                                {4,5,6} //arr[2]
                            };

이렇게 하면 좋다

2차원 배열 예제

아래 이중for문을 외워두자

for(int i=0;i<score.length;i++) { //length=행의 수
            for(int j=0;j<score[i].length;j++) {//score[i].length=각 행의 배열 길이 
                System.out.printf("score[%d][%d]=%d%n", i, j, score[i][j]);
                sum += score[i][j];
            }
        }

String 클래스

  1. String 클래스=char[] + 메서드(기능). String 클래스는 char과 메서드(기능)을 결합한 것

  2. String 클래스는 내용을 변경할 수 없다. (읽기 전용. read only)

    Untitled

    예를 들어, a의 값이 바뀌는게 아니고, 새로운 것이 만들어진 후 주소가 전달됨

    String클래스의 주요 메서드

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

    String str = “ABCDE”;

    • char charAt(int index)

      char ch = str.charAt(3); //문자열 str의 4번째 문자 ‘D’를 ch에 저장

      index 0 1 2 3 4
      문자 A B C D E
    • int length()

      str.length() = 5. 문자 다섯개니까

    • String substring(int from, int to)

      String tmp = str.substring(1,4); //BCD. str에서 index범위 1~3의 문자들을 반환(to인 4는 포함안되니까)

      to를 생략하면 인덱스 끝까지 나옴. ex) str.substring(1); //1~4까지

      혹은 str.substring(1, str.length()); //1~4까지

    • boolean equals(Object obj)

      문자열을 비교할때는 equals를 써야함. ==쓰지말고!

    • char[] toCharArray()

      String → Char[]

      Arrays로 배열 다루기

      Arrays는 클래스임. Math클래스가 수학관련 메서드를 모아놓은 것처럼 배열을 다루는데 유용한 메서드 제공

      배열의 비교와 출력 - equals(), toString()

      출력

      int[] arr = {0,1,2,3,4};
      int[][] arr2D = {{11,12}, {21,22}};
      
      System.out.println(Arrays.**toString**(arr)); //[0,1,2,3,4] 배열에 저장된 내용을 문자열로 바꿔줌
      System.out.println(Arrays.**deepToString**(arr2D)); //[[11,12],[21,22]] **2차원이상 배열**은 deepToString

      비교

      String[][] str2D = new String[][]{{”aaa”,”bbb”},{”AAA”,”BBB”}};
      String[][] str2D2 = new String[][]{{”aaa”,”bbb”},{”AAA”,”BBB”}};
      //위 두개가 같은지 비교할때 ==쓰지말고!!
      
      System.out.println(Arrays.**equals**(str2D, str2D2)); //false. 왜냐면 2차원배열인데 1차원으로 비교해서
      System.out.println(Arrays.**deepEquals**(str2D, str2D2)); //true. **2차원이상 배열은 deepEquals**

      배열의 복사 - copyOf(), copyOfRange()

      copyOf(배열, 복사할 요소의 개수)

      copyOfRange(배열, from, to)인데 to는 미포함. 아래 int arr5를 참고

      int[] arr = {0,1,2,3,4};
      int[] arr2 = Arrays.**copyOf**(arr, **arr.length**); //arr2=[0,1,2,3,4] 복사할 요소의 개수
      int[] arr3 = Arrays.copyOf(arr, 3); //arr3=[0,1,2]. 3개 복사
      int[] arr4 = Arrays.copOf(arr, 7); //arr4=[0,1,2,3,4,0,0] 배열 길이보다 큰 값을 넣으면? 0이 들어옴
      int[] arr5 = Arrays.**copyOfRange**(arr, 2, 4); //arr5=[2,3]. 4 미포함이라 인덱스2~3 값
      int[] arr6 = Arrays.copyOfRange(arr, 0 ,7); //arr6=[0,1,2,3,4,0,0]. 7 미포함이고 배열 길이를 초과해서 인덱스0~6 값. 잉여는 0으로

      배열의 정렬 - sort()

      오름차순으로 정렬됨

      int[] arr = {3,2,0,1,4};
      Arrays.**sort**(arr); //배열arr을 정렬한다
      System.out.println(Arrays.toString(Arr)); //[0,1,2,3,4]
728x90