목록으로

[자바 기초] 7강. 데이터 아파트 짓기: 배열(Array) 완벽 가이드

지난 시간 복습과 이번 강의 목표

지난 6강에서는 for문을 이용해 똑같은 작업을 수백 번 반복하는 기술을 배웠습니다. 그런데 만약 **"학생 100명의 점수를 저장하고 평균을 내라"**는 미션이 주어지면 어떨까요?

int score1 = 90;
int score2 = 80;
// ... (이걸 100줄 쓰시겠습니까?)
int score100 = 70;

변수 100개를 만드는 것도 힘들지만, 이걸 다 더하려고 score1 + score2 + ... 적는 건 불가능에 가깝습니다. 이럴 때 사용하는 것이 바로 **배열(Array)**입니다. 변수들이 옹기종기 모여 사는 **"데이터 아파트"**를 지어보겠습니다.


1. 배열이란 무엇인가?

배열은 **"같은 자료형의 변수들을 하나의 이름으로 묶어서 관리하는 것"**입니다.

쉽게 말해 **'계란 판'**을 상상하시면 됩니다. 계란(데이터) 30개를 낱개로 들고 다니는 게 아니라, 계란 판(배열) 하나에 담아서 들고 다니는 것이죠.

선언과 생성 (아파트 짓기)

// 방법 1: 빈 방 만들기 (크기 지정)
// "정수(int)가 들어갈 방 5개짜리 아파트를 짓고, 이름은 scores라고 한다."
int[] scores = new int[5]; 

// 방법 2: 값 채워서 만들기 (초기화)
// "처음부터 값을 넣어서 아파트를 짓는다."
String[] names = {"철수", "영희", "민수"};
  • int[]: "이건 그냥 정수가 아니라 정수 배열이야"라는 표시입니다.
  • new int[5]: 정수가 들어갈 공간 5칸을 새로 만듭니다.

2. 방 번호의 비밀: 인덱스 (Index)

배열에서 가장 중요한 개념입니다. 아파트에 우편물을 넣으려면 **"호수(방 번호)"**를 알아야겠죠? 이 방 번호를 **인덱스(Index)**라고 부릅니다.

🚨 중요: 자바의 방 번호는 0번부터 시작합니다.

int[] numbers = {10, 20, 30, 40, 50};

System.out.println(numbers[0]); // 첫 번째 방 (10)
System.out.println(numbers[1]); // 두 번째 방 (20)
System.out.println(numbers[4]); // 다섯 번째 방 (50)
  • 1번째 데이터는 [0]번 방에 있습니다.
  • 5번째 데이터는 [4]번 방에 있습니다.
  • (이거 헷갈려서 에러 내는 경우가 정말 많습니다!)

3. 배열과 반복문의 꿀조합

배열이 강력한 이유는 반복문(for)과 합쳐졌을 때 나타납니다. 방 번호(0, 1, 2...)가 숫자로 되어 있으니, for문의 i를 방 번호로 쓰면 딱 맞거든요.

배열의 길이: .length

배열이 몇 칸짜리인지 일일이 셀 필요 없습니다. 배열이름.length라고 쓰면 알아서 알려줍니다.

int[] scores = {90, 85, 77, 60, 95};

// i는 0부터 4(길이보다 작을 때)까지 돕니다.
for (int i = 0; i < scores.length; i++) {
    System.out.println((i + 1) + "번 학생 점수: " + scores[i]);
}

4. 실전 예제: 반 평균 구하기

자, 이제 변수 100개 노가다에서 탈출해 봅시다. 학생 5명의 점수를 배열에 넣고, 총점과 평균을 구하는 프로그램입니다.

src/Main.java에 작성해 보세요.

public class Main {
    public static void main(String[] args) {
        // 1. 점수 배열 생성 (데이터 아파트)
        int[] scores = {90, 80, 75, 100, 60};

        // 2. 총점을 담을 변수 (누적해야 하니 0으로 시작)
        int sum = 0;

        // 3. 반복문으로 배열 돌면서 더하기
        for (int i = 0; i < scores.length; i++) {
            // scores[0], scores[1]... 순서대로 꺼내서 sum에 더함
            sum = sum + scores[i]; 
            
            // 과정 확인용 로그
            System.out.println((i + 1) + "번 학생 점수 " + scores[i] + "점 반영 완료");
        }

        // 4. 평균 구하기 (총점 / 학생수)
        // 정확한 소수점을 위해 (double)로 변환
        double average = (double) sum / scores.length;

        System.out.println("-----------------------");
        System.out.println("총점: " + sum + "점");
        System.out.println("반 평균: " + average + "점");
    }
}

실행 결과

1번 학생 점수 90점 반영 완료
2번 학생 점수 80점 반영 완료
3번 학생 점수 75점 반영 완료
4번 학생 점수 100점 반영 완료
5번 학생 점수 60점 반영 완료
-----------------------
총점: 405점
반 평균: 81.0점

변수 5개를 따로 만들었으면 코드가 엄청 길어졌겠지만, 배열 덕분에 아주 깔끔해졌죠? 100명이어도 scores 안에 숫자만 더 넣으면 코드는 고칠 필요가 없습니다.


5. 자주 하는 실수 (공포의 빨간 글씨)

배열을 쓰다 보면 무조건 한 번은 보게 되는 에러가 있습니다. ArrayIndexOutOfBoundsException (배열 인덱스가 범위를 벗어났다)

int[] arr = new int[3]; // 방은 3개 (0번, 1번, 2번)

arr[3] = 100; // 에러 발생! 
  • 이유: 방이 3개면 번호는 0, 1, 2입니다. 3번 방은 없습니다. (4번째 방을 뜻하니까요)
  • 해결: 항상 **"인덱스는 0부터 시작해서 (길이 - 1)에서 끝난다"**는 것을 기억하세요.

6. 마무리

이제 여러분은 데이터를 하나씩 다루는 수준을 넘어, 대량의 데이터를 한 번에 처리하는 능력을 갖췄습니다. 여기까지가 자바의 절차지향(순서대로 실행) 기초 문법이었습니다.

하지만 자바의 진짜 힘은 **객체지향(Object Oriented Programming)**에서 나옵니다. 지금까지는 모든 코드를 main 안에 다 때려 넣었지만, 프로그램이 커지면 기능을 부품(객체)으로 쪼개서 조립해야 합니다.

다음 **[8강]**에서는 붕어빵 틀과 붕어빵의 관계, 클래스(Class)와 객체에 대해 배워보겠습니다. 난이도가 조금 올라가지만, 이걸 알면 진짜 개발자가 되는 겁니다.

👉 8강 바로가기: 붕어빵 틀과 붕어빵, 클래스(Class) 입문