[Java(6)] 배열, 한번에 여러 값을 다루는 가장 기본적인 방법

2026. 6. 18. 17:53·웹 개발/JAVA

안녕하세요~ 경제적 자유입니다.

 

오늘은 Java의 배열, 다차원 배열, 배열 복사에 대해 정리해보려고 합니다.

 

더 자세히 공부하고 싶다면 아래 문서도 함께 참고해보세요.

  • 참고 링크: https://www.programiz.com/java-programming/arrays
  • 참고 링크: https://www.programiz.com/java-programming/multidimensional-array
  • 참고 링크: https://www.programiz.com/java-programming/copy-arrays

 

1. 배열

 

배열은 같은 타입의 값을 여러 개 저장할 때 사용하는 자료 구조입니다.

 

String name1 = "상구";
String name2 = "민수";
String name3 = "지훈";

 

 

이럴 때 배열을 사용하면 하나의 변수 이름으로 여러 값을 묶어서 관리할 수 있습니다.

 

배열을 사용할 때 가장 중요한 특징은 두 가지입니다.

 

첫 번째, Java 배열은 같은 타입의 값만 저장할 수 있습니다.

String[] 배열에는 문자열을 넣고, int[] 배열에는 정수를 넣는 식입니다.

 

두 번째, 배열의 길이는 한 번 정하면 기본적으로 바꿀 수 없습니다.

new String[3]으로 만들면 공간은 3칸입니다.

 

나중에 값을 더 많이 넣고 싶다면 더 큰 배열을 새로 만들거나, ArrayList 같은 컬렉션을 사용해야 합니다.

 

기본 문법

자료형[] 배열이름 = new 자료형[길이];

 

예를 들어 문자열을 3개 저장할 배열은 이렇게 만들 수 있습니다.

String[] names = new String[3];

 

여기서 String[]은 문자열 배열이라는 뜻입니다.

names는 배열의 이름이고, new String[3]은 문자열을 저장할 공간 3개를 만든다는 의미입니다.

 

배열은 값을 꺼낼 때 인덱스를 사용하며, 인덱스는 위치 번호라고 보면 됩니다.

 

다만 Java 배열의 인덱스는 1이 아니라 0부터 시작합니다.

names[0] = "상구";
names[1] = "민수";
names[2] = "지훈";

 

첫 번째 값은 names[1]이 아니라 names[0]입니다.

 

예제

public class Main {
    public static void main(String[] args) {
        String[] names = new String[3];

        names[0] = "상구";
        names[1] = "민수";
        names[2] = "지훈";

        System.out.println(names[0]);
        System.out.println(names[1]);
        System.out.println(names[2]);

        System.out.println("배열 길이: " + names.length);
    }
}

// 실행 결과:
// 상구
// 민수
// 지훈
// 배열 길이: 3

 

names.length를 사용하면 배열의 길이를 알 수 있습니다. 여기서 주의할 점은 length 뒤에 괄호를 붙이지 않는다는 것입니다.

 

public class Main {
    public static void main(String[] args) {
        String[] names = {"상구", "민수", "지훈"};

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

// 실행 결과:
// 상구
// 민수
// 지훈

여기서는 i가 0부터 시작해서 배열의 마지막 인덱스까지 이동합니다.

배열의 길이가 3이면 인덱스는 0, 1, 2입니다.

그래서 조건식은 i <= names.length가 아니라 i < names.length로 작성해야 합니다.

만약 i <= names.length라고 쓰면 마지막에 names[3]을 찾으려고 하면서 오류가 발생합니다.

 

2. 다차원 배열

 

다차원 배열은 배열 안에 배열이 들어 있는 구조입니다.

가장 많이 보는 형태는 2차원 배열이며, 2차원 배열은 표처럼 생각하면 이해하기 쉽습니다.

 

예를 들어 학생별 점수를 저장한다고 해보겠습니다.

한 명의 점수만 저장한다면 1차원 배열로 충분합니다.

 

int[] scores = {90, 80, 70};

 

그런데 여러 학생의 점수를 저장한다면 이런 구조가 필요할 수 있습니다.

 

int[][] scores = {
    {90, 80, 70},
    {85, 95, 75},
    {60, 70, 80}
};

 

여기서 바깥 배열은 학생들을 묶고, 안쪽 배열은 각 학생의 점수들을 묶는다고 보면 됩니다.

즉, scores[0]은 첫 번째 학생의 점수 배열이고, scores[0][1]은 첫 번째 학생의 두 번째 점수입니다.

 

기본 문법

자료형[][] 배열이름 = new 자료형[행의개수][열의개수];

 

예를 들어 2행 3열짜리 정수 배열은 이렇게 만들 수 있습니다.

 

int[][] numbers = new int[2][3];

 

또는 값을 바로 넣어서 만들 수도 있습니다.

 

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

 

Java의 다차원 배열은 정확히 말하면 배열의 배열입니다.

 

그래서 각 행의 길이가 반드시 같아야 하는 것은 아닙니다.

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

 

이런 식으로 행마다 길이가 다른 배열도 만들 수 있습니다.

 

이 구조를 처음 보면 이상해 보일 수 있지만, Java에서는 가능한 형태입니다.

 

예제

public class Main {
    public static void main(String[] args) {
        String[][] students = {
            {"상구", "90", "85"},
            {"민수", "80", "75"},
            {"지훈", "70", "95"}
        };

        System.out.println("이름: " + students[0][0]);
        System.out.println("Java 점수: " + students[0][1]);
        System.out.println("알고리즘 점수: " + students[0][2]);
    }
}

// 실행 결과:
// 이름: 상구
// Java 점수: 90
// 알고리즘 점수: 85

 

public class Main {
    public static void main(String[] args) {
        String[][] students = {
            {"상구", "90", "85"},
            {"민수", "80", "75"},
            {"지훈", "70", "95"}
        };

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

// 실행 결과:
// 상구 90 85
// 민수 80 75
// 지훈 70 95

 

바깥쪽 반복문은 행을 움직이며, 안쪽 반복문은 각 행 안에 있는 값을 하나씩 움직입니다.

 

여기서 중요한 부분은 students[i].length입니다. 

2차원 배열에서는 각 행의 길이가 다를 수도 있기 때문에, 안쪽 반복문의 조건을 students[i].length로 잡는 것이 안전합니다.

 

3. 배열 복사

 

배열 복사는 생각보다 조심해야 하는 부분입니다.

처음에는 이렇게 작성하면 배열이 복사된다고 생각하기 쉽습니다.

String[] copiedNames = names;

 

하지만 이 코드는 배열의 값을 새로 복사하는 것이 아니라, 같은 배열을 함께 가리키게 만드는 코드입니다.

쉽게 말하면 배열이 하나 더 생긴 것이 아니라, 같은 배열을 보는 이름표가 하나 더 생긴 느낌입니다.

그래서 한쪽에서 값을 바꾸면 다른 쪽에서도 바뀐 것처럼 보입니다.

 

기본 문법

 

배열 복사는 여러 방식으로 할 수 있습니다.

가장 직접적인 방식은 반복문을 사용하는 방법입니다.

 

자료형[] 새배열 = new 자료형[원본배열.length];

for (int i = 0; i < 원본배열.length; i++) {
    새배열[i] = 원본배열[i];
}

 

Java에서 제공하는 기능을 사용할 수도 있습니다.

 

System.arraycopy(원본배열, 원본시작인덱스, 대상배열, 대상시작인덱스, 복사할개수);

 

또는 Arrays.copyOfRange()를 사용할 수도 있습니다.

 

Arrays.copyOfRange(원본배열, 시작인덱스, 끝인덱스);

 

여기서 끝인덱스는 포함되지 않습니다.

 

예를 들어 Arrays.copyOfRange(names, 0, 2)라고 쓰면 인덱스 0과 1까지만 복사됩니다.

 

예제 1: =로 복사하면 생기는 문제

public class Main {
    public static void main(String[] args) {
        String[] names = {"상구", "민수", "지훈"};

        String[] copiedNames = names;

        copiedNames[0] = "상구 수정";

        System.out.println(names[0]);
        System.out.println(copiedNames[0]);
    }
}

// 실행 결과:
// 상구 수정
// 상구 수정

 

분명 copiedNames[0]만 수정했는데 names[0]도 같이 바뀐 것처럼 보입니다.

 

이유는 두 배열 변수가 같은 배열 객체를 가리키고 있기 때문입니다.

 

그래서 배열의 값을 독립적으로 복사하고 싶다면 =만 사용하는 방식은 피하는 것이 좋습니다.

 

예제 2: 반복문으로 배열 복사하기

public class Main {
    public static void main(String[] args) {
        String[] names = {"상구", "민수", "지훈"};
        String[] copiedNames = new String[names.length];

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

        copiedNames[0] = "상구 수정";

        System.out.println(names[0]);
        System.out.println(copiedNames[0]);
    }
}

// 실행 결과:
// 상구
// 상구 수정

 

이번에는 copiedNames라는 새 배열을 만들고, 반복문으로 값을 하나씩 옮겼습니다.

 

그래서 copiedNames[0]을 수정해도 names[0]은 그대로 유지됩니다.

 

이런 흐름이 실제 값을 복사하는 방식에 더 가깝습니다.

예제 3: System.arraycopy()로 배열 복사하기

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] names = {"상구", "민수", "지훈"};
        String[] copiedNames = new String[names.length];

        System.arraycopy(names, 0, copiedNames, 0, names.length);

        System.out.println(Arrays.toString(copiedNames));
    }
}

// 실행 결과:
// [상구, 민수, 지훈]

 

System.arraycopy()는 배열의 일부 또는 전체를 다른 배열로 복사할 때 사용합니다.

System.arraycopy(names, 0, copiedNames, 0, names.length);

 

이 코드는 names 배열의 0번 인덱스부터 시작해서, copiedNames 배열의 0번 인덱스에, names.length개만큼 복사한다는 뜻입니다.

 

처음에는 인자가 많아서 복잡해 보이지만, 순서만 기억하면 됩니다.

 

원본 배열, 원본 시작 위치, 대상 배열, 대상 시작 위치, 복사할 개수

 

예제 4: Arrays.copyOfRange()로 원하는 구간만 복사하기

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        String[] names = {"상구", "민수", "지훈", "영희"};

        String[] copiedNames = Arrays.copyOfRange(names, 0, 2);

        System.out.println(Arrays.toString(copiedNames));
    }
}

// 실행 결과:
// [상구, 민수]

 

Arrays.copyOfRange()는 원하는 구간만 잘라서 새 배열로 만들 때 사용하기 좋습니다.

 

Arrays.copyOfRange(names, 0, 2)

 

이 코드는 인덱스 0부터 시작해서 인덱스 2 전까지 복사합니다.

즉, names[0], names[1]만 복사됩니다.

 

여기서도 끝 인덱스는 포함되지 않는다는 점을 기억해야 합니다.

 

배열 문제를 풀 때 특정 구간만 잘라야 하는 경우가 자주 나오는데, 그때 많이 사용하게 되는 메서드입니다.

 

마무리

오늘은 Java의 배열, 다차원 배열, 배열 복사에 대해 정리해봤습니다.

 

우앙! 일단 너무 어렵네요.. 근데 아마 배열도 좋기는 한데 List를 빠르게 정리하는 것이 필요하다는 생각이 들었습니다.

배열도 많이 사용되는데 리스트도 엄청 사용되는 것 같더라구요..

저는 공부를 순서대로 하긴 할건데 일단.. 오늘 Arrays.copyOfRange를 이용해서 알고리즘도 풀었고 너무 즐겁습니다.

 

공부화이팅!

 

'웹 개발 > JAVA' 카테고리의 다른 글

[Java(7)] 클래스, 메서드, 오버로딩  (0) 2026.06.19
[Java(5)] 흐름제어: break, continue, switch  (0) 2026.06.18
[Java(4)] 반복문, for문부터 do-while문까지 흐름으로 이해하기  (0) 2026.06.18
[Java(1)] Java 변수와 자료형  (0) 2026.06.17
[Java(3)]조건문, 코드가 스스로 판단하게 만드는 첫 번째 문법  (0) 2026.06.17
'웹 개발/JAVA' 카테고리의 다른 글
  • [Java(7)] 클래스, 메서드, 오버로딩
  • [Java(5)] 흐름제어: break, continue, switch
  • [Java(4)] 반복문, for문부터 do-while문까지 흐름으로 이해하기
  • [Java(1)] Java 변수와 자료형
Sangenie
Sangenie
경제적 자유를 위한 하루 공부.
  • Sangenie
    새싹
    Sangenie
  • 전체
    오늘
    어제
    • 분류 전체보기 (43)
      • AI (0)
        • 하네스 엔지니어링 (0)
      • 웹 개발 (25)
        • Javascript (16)
        • JAVA (9)
      • 토막지식 (1)
      • TIL (7)
      • 경제 (8)
        • 경제뉴스 (7)
        • 비트코인 분석 (1)
      • Library (1)
        • IT (1)
        • Finance (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    반복문
    프론트엔드
    암호화폐
    JavaScript
    java
    프론트엔드공부
    경제뉴스
    가상자산
    til
    비트코인
    자바스크립트
    자바기초
    TodayILearned
    자바
    경제공부
    java공부
    조건문
    개발공부
    객체
    코딩공부
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
Sangenie
[Java(6)] 배열, 한번에 여러 값을 다루는 가장 기본적인 방법
상단으로

티스토리툴바