JAVA/[JAVA] 기초 문법

[자료형] 배열과 리스트

DoMyBestForDeveloper 2026. 1. 11. 16:10

배열

 

배열은 자료형 바로 옆에 [] 기호를 붙임

 

1~10까지 숫자 중 홀수의 집합은 int 배열로 표현할 수 있음. int 자료형의 배열은 int[]로 표현함

int[] odds={1,3,5,7,9};

즉, 배열이란 자료형의 종류가 아니라 자료형의 집합을 의미

 

배열은 한 번 생성되면 그 크기를 변경할 수 없음. 만약 더 많은 요소가 필요하다면 새로운 배열을 생성해야 함
앞의 두 배열은 1차원 배열임. 2차원, 3차원 등의 다차원 배열도 가능하지만, 2차원 이상의 배열은 잘 사용하지 않음

 

배열의 길이 설정하기

배열의 길이를 먼저 설정한 다음, 배열 변수를 생성하고 그 값을 나중에 대입하는 방법임

String[] weeks = new String[7];
weeks[0] = "월";
weeks[1] = "화";
weeks[2] = "수";
weeks[3] = "목";
weeks[4] = "금";
weeks[5] = "토";
weeks[6] = "일";

 

단, 초깃값 없이 배열 변수를 만들때에는 7과 같은 숫자값을 넣어 길이를 정해줘야 함. 그렇지 않으면 오류가 발생함

이렇게 길이만 정하고, 생성한 배열의 각 요소는 자료형의 기본값으로 초기화됨
String 배열은 null, int 배열은 0, boolean 배열은 false가 기본값임

 

배열값에 접근하기

앞서 만든 요일의 배열에서 '목'에 해당하는 값을 얻으려면 인덱스를 이용해야 함. 

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
System.out.println(weeks[3]);

 

week[3]은 week 배열의 네 번째 항목에 해당함

 

배열의 길이 구하기

배열은 보통 for문과 함께 사용함. for문에 배열을 사용할 때에는 배열의 길이를 알아야 함. 왜냐하면 배열의 길이만큼 for문을 반복하기 때문임. 이때 배열 길이는 length를 사용하면 됨

String[] weeks = {"월", "화", "수", "목", "금", "토", "일"};
for (int i = 0; i < weeks.length; i++) {
    System.out.println(weeks[i]);
}

weeks 배열을 순서대로 출력하는 프로그램임. weeks 배열에는 7개의 요소가 있으므로 weeks.length는 7임.

for문보다는 length를 어떻게 사용했는지 눈여겨 보는 것이 중요

 

배열의 오류

ArrayIndexOutOfBoundsException

요일의 배열 길이는 7인데, 여덟 번째 값을 얻으려고 하면 오류가 발생함

 

 

리스트

리스트는 배열과 비슷하지만, 편리한 기능이 더 많은 자료형임. 리스트와 배열의 가장 큰 차이점은 배열은 크기가 정해져있지만, 리스트는 크기가 동적으로 변한다는 점에서 차이가 있음. 예를 들어 배열의 크기를 10개로 정했다면, 10개를 초과하는 값을 담을 수 없는데, 리스트는 크기가 정해져 있지 않아 원하는 만큼 값을 담을 수 있음

 

ArrayList

리스트 자료형에서 가장 일반적으로 사용하는 ArrayList를 알아보자. 참고로 리스트 자료형에는 ArrayList, Vector, LinkedList 등이 있음.

 

add

ArrayLis의 add 메서드를 사용하면 요솟갑을 추가할 수 있음. 야구 선수가 공을 총 3번 던져는데, 각각 시속138, 129, 142였다면, 다음과 같이 코드를 작성할 수 있음

import java.util.ArrayList;

public class Sample{
	public static void main(String[] args){
    	ArrayList pitches=new ArrayList();
        
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
    }
}
ArrayList를 사용하려면 import java.util.ArrayList와 같은 import문을 작성해야 함.
이때 import문은 다른 패키지나 클래스를 현재 코드에서 사용하기 위해 선언한 문장임. import는 보통 클래스 선언 전에 맨 위에 작성함. java.util 패키지는 자바가 기본적으로 제공하는 패키지로 컬렉션 관련 클래스들이 포함되어 있음.

 

ArrayList의 객체인 pitches에 add 메서드를 이용해 투구 속도를 저장함. 만약 첫 번째 위치에 133이라는 투구 속도를 추가하고 싶다면 다음과 같이 삽입할 위치를 파라미터로 넘겨줘야 함

pitches.add(0, "133"); //첫 번째 위치에 133 삽입
pitches.add(1, "133"); //두 번째 위치에 133 삽입

 

get

ArrayList에서 get 메서드를 사용하면 특정 인덱스의 값을 추출할 수 있음. 앞의 예제에서 야구선수의 두 번째 투구 속도를 출력하고 싶다면 다음과 같이 코드를 작성해야 함

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
        System.out.println(pitches.get(1));
    }
}
129

 

 

size

size 메서드는 ArrayList의 요소의 개수를 반환함. 다음 코드를 실행하면 pitches에 담긴 요소의 개수가 출력됨

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
        System.out.println(pitches.size());
    }
}
3

 

 

contains

contains 메서드는 리스트 안에 해당 항목이 있는지 판별해 그 결과를 boolean으로 반환함. pitches 객체는 142를 포함하고 있으므로 true가 출력될 것

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
        System.out.println(pitches.contains("142"));
    }
}
true

 

 

indexOf

indexOf 메서드는 리스트에서 특정 요소의 인덱스 값을 반환함. 만약 찾고자 하는 요소가 없다면 -1을 반환

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
        System.out.println(pitches.indexOf("129"));  // 129의 인덱스인 1을 반환
    }
}

 

 

remove

remove 메서드에는 2가지 방식이 있음

  • remove(객체)
  • remove(인덱스)
이름은 remove로 같지만 입력하는 파라미터가 다름

 

첫번째 방식인 remove(객체)를 사용하면, 리스트에서 객체에 해당하는 항목을 삭제한 뒤, 그 결과로 true/false를 반환함

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
        System.out.println(pitches.remove("129"));  // 129를 리스트에서 삭제하고, true를 반환
    }
}
true

 

 

두 번째 방식인 remove(인덱스)를 사용하면 인덱스에 해당하는 항목을 삭제한 뒤, 그 항목을 반환

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList pitches = new ArrayList();
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
        System.out.println(pitches.remove(0));  // pitches의 첫 번째 항목이 138이므로, 138을 삭제한 뒤 138을 반환
    }
}
138

 

 

제네릭스

제네릭스(generics)는 자료형을 안전하게 사용할 수 있도록 만들어주는 기능

제네릭스를 사용하면 자료형을 강제로 바꿀 때 생길 수 있는 캐스팅 오류를 줄일 수 있음

 

제네릭스의 예

  • 일반적인 방식: ArrayList<String> pitches=new ArrayList<String>();
  • 선호되는 방식: ArrayList<String> pitches=new ArrayList<>() => 뒷 부분의 자료형은 명확하므로 굳이 적지 않아도 됨
오히려 앞뒤에 자료형을 모두 적으면 인텔리제이와 같은 IDE에서는 경고 메시지를 출력함

 

제네릭스의 이점

ArrayList pitches = new ArrayList();
pitches.add("138");
pitches.add("129");

String one = (String) pitches.get(0);
String two = (String) pitches.get(1);

이는 제네릭스를 사용하지 않은 예인데, 제네릭스를 사용하지 않으면 ArrayList에 추가하는 객체는 Objec 자료형으로 인식됨. Object 자료형은 모든 객체가 상속하고 있는 가장 기본적인 자료형임. 따라서 ArrayList 객체인 pitches에 값을 넣을 때는 문제가 없지만, 값을 가져올 때는 매번 Object 자료형에서 String 자료형으로 형 변환(casting)을 해야 함

String one = (String) pitches.get(0); // Object 자료형을 String 자료형으로 형 변환

이때 주의해야 할 점은 pitches에는 String외의 다른 객체도 넣을 수 있어서 형 변환 오류가 발생할 수 있다는 점

 

제네릭스 사용

ArrayList pitches = new ArrayList();
pitches.add("138");
pitches.add(123);  // 숫자도 추가 가능
String one = (String) pitches.get(1);  // ClassCastException 오류 발생!

제네릭스는 이러한 형 변환의 오류를 방지하기 위해 탄생

 

앞의 코드에 제네릭스를 적용해보면 

ArrayList<String> pitches = new ArrayList<>();
pitches.add("138");
pitches.add("129");

String one = pitches.get(0);  // 형 변환이 필요없다.
String two = pitches.get(1);  // 형 변환이 필요없다.

제네릭스로 자료형을 선언만 하면 그 이후로는 자료형을 형 변환하는 과정이 필요 없음.

pitches에는 반드시 String 자료형만 추가되어야 한다는 것을 컴파일러가 이미 알기 때문에 이처럼 제네릭스를 이용하면 형 변환과 관련된 불필요한 코딩을 줄일 수 있고, 잘못된 형 변환 때문에 발생하는 런타임 오류를 방지할 수 있음

 

 

다양한 방법으로 ArrayList 만들기

ArrayList의 add 메서드를 사용하면 ArrayList 객체의 요소를 추가할 수 있음

import java.util.ArrayList;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<>();  // 제네릭스를 사용한 표현
        pitches.add("138");
        pitches.add("129");
        pitches.add("142");
        System.out.println(pitches);  // [138, 129, 142] 출력
    }
}
[138, 129, 142]

 

하지만, 이미 문자열 배열이 있으면 ArrayList를 좀 더 편하게 생성할 수 있음

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        String[] data = {"138", "129", "142"};  // 이미 투구수 데이터 배열이 있다.
        ArrayList<String> pitches = new ArrayList<>(Arrays.asList(data));
        System.out.println(pitches);  // [138, 129, 142] 출력
    }
}
[138, 129, 142]

이처럼 java.util.Arrays 클래스의 asList 메서드를 사용하면 이미 존재하는 문자열 배열로 ArrayList를 만들 수 있음

 

또는 String 배열 대신 String 자료형을 여러 개 전달하여 생성할 수도 있음

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        System.out.println(pitches);
    }
}
[138, 129, 142]

 

 

String.join

앞에서 138, 129, 142 세 요소로 이뤄진 ArrayList를 만들었음. 그렇다면 ArrayList의 각 요소를 콤마로 구분해서 1개의 문자열로 만들 수 있을까?

 

콤마를 각 요소 중간에 넣으려면 이렇게 코드를 작성해야 함

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        String result = "";
        for (int i = 0; i < pitches.size(); i++) {
            result += pitches.get(i);
            result += ",";  // 콤마를 추가한다.
        }
        result = result.substring(0, result.length() - 1);  // 마지막 콤마는 제거한다.
        System.out.println(result);  // 138,129,142 출력
    }
}
138,129,142

pitches를 요소 개수만큼 루프를 돌면서 뒤에 콤마를 더한 뒤, 마지막 콤마를 제거하는 방법

이처럼 리스트의 각 요소에 구분자를 끼워 넣어 1개의 문자열을 만드는 것은 꽤 까다로움

 

이때 String.join을 사용하면 더 간단하게 처리할 수 있음

import java.util.ArrayList;
import java.util.Arrays;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        String result = String.join(",", pitches);
        System.out.println(result);  // 138,129,142 출력
    }
}
138, 129, 142

 

String.join("구분자", 리스트 객체)를 사용해 리스트의 각 요소에 구분자를 넣어 하나의 문자열로 만들 수 있음

String.join은 문자열 배열에도 사용할 수 있음

public class Sample {
    public static void main(String[] args) {
        String[] pitches = new String[]{"138", "129", "142"};
        String result = String.join(",", pitches);
        System.out.println(result);  // 138,129,142 출력
    }
}

 

 

리스트 정렬하기

이번에는 138, 129, 142 세 요소로 이루어진 ArrayList를 순서대로 정렬해볼 것

순서대로 정렬하기 위해서는 리스트의 sort메서드를 사용해야 함

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;

public class Sample {
    public static void main(String[] args) {
        ArrayList<String> pitches = new ArrayList<>(Arrays.asList("138", "129", "142"));
        pitches.sort(Comparator.naturalOrder());  // 오름차순으로 정렬
        System.out.println(pitches);  // [129, 138, 142] 출력
    }
}

 

sort 메서드에는 정렬 기준을 파라미터로 전달해야 함. 정렬 기준에는 오름차순, 내림차순이 있음

  • 오름차순  Comparator.naturalOrder()
  • 내림차순 Comparator.reverseOrder()

 

'JAVA > [JAVA] 기초 문법' 카테고리의 다른 글

[자료형] 상수 집합  (0) 2026.01.11
[자료형] 맵과 집합  (1) 2026.01.11
[자료형] 문자와 문자열  (0) 2026.01.08
[자료형] 숫자  (0) 2026.01.07
[JAVA] 키보드로 입력 받는 방법  (0) 2026.01.06